Picture of admin

Developer oriented languages

  • Posted By admin on October 06, 2005

Ted Neward has responded to my post about the new C# features and how C# compares to more developer-oriented programming languages.

We seem to be talking past each other, so let me tighten my argument by reponding to a few specific points. Ted says
...the idea that a dynamic language doesn’t have specific and detailed rules regarding inheritance, encapsulation, delegation, and so forth, is a fallacy: they have them, they’re just not the same rules as those for a statically-typed language.
You’re right Ted. That’s a fallacy. It’s also not what I said :-). Of course Ruby, Python, Lisp, et al provide the abstractions in question. The criticial point is that these abstractions are implemented in the language itself. Developers can (and do!) modify these core abstractions to work in different ways. To use C#’s new extension methods as a point of example:
  • Prior to C# 3.0, extension methods did not exist
  • Microsoft sees the need
  • Now, in 3.0., we get extension methods
Compare this to, e.g, Ruby:
  • The rules for adding new methods to existing classes aren’t (for the most part) in the core of ruby—they are implemented in Ruby source code
  • The default rules make it trivial to add new methods
  • Developers can easily change this default by writing a few lines of Ruby code. You can create a different “extension method policy”, and you could choose to enforce it at the system level, or by class, or by instance, or any other criteria you could imagine.
It’s all about control. With a vendor-oriented language like C#, core abstractions are much more firmly controlled by the language vendor. Conversely, developer-oriented langauges like Python leave more of these choices to the developer (although they tend to provide reasonable defaults). So, again, who do you trust? Ted thinks I don’t trust vendors:
I find this argument highly unfair and totally bigoted. It essentially suggests that vendors can’t do anything right, and portrays them in the traditional “corporations are the root of all evil” that right now so deeply permeates the American social landscape. It also portrays everything done by “non-vendors”...
But I never suggested any of that. Competency and trustworthiness are sprinkled all over our industry, both among language vendors and application developers. My concern is who controls the abstractions. Developer-oriented languages (like Scheme) give a lot of control (and responsibility) to developers. Vendor-oriented languages (like Java) leave that control more firmly in the hands of the vendor. Ted and I actually share a lot of common ground. We both know it is about trust and control:
all this “expressiveness” is like putting craftsman’s tools in your hands; in the hands of a master craftsman, amazing things can result, but in anybody else’s hands, it’s putting a loaded gun into the hands of a child.
If I understand the analogy correctly:
  • We (readers and writers of blogs) master craftsmen
  • Developers small children
  • JavaScript (et al) loaded gun
  • C# (et al) board with a nail in it (?)
  • IT decision makers == adults
This argument certainly pulls no punches, and there are plenty of people who see the software world this way. But I actually think there are more nuanced defenses of “vendor-oriented programming”. Here’s one: Vendor-oriented languages help keep developers focused on their solution space. Company X builds widgets, not programming languages. Their developers are plenty smart enough to create (or improve) a programming language, but company X doesn’t sell programming languages. Working in C# or Java imposes a structural barrier in front of non-productive activities. The Company X example pushes the conversation toward the debate I’d like to have, with questions like these: And some meta-questions too:
  • Does a strong culture of automated testing on a development team change your answers to the previous questions?
  • One size does not fit all. What non-technical factors guide platform choices in the real world?
  • How big a project (or team) does a company have before it becomes worthwhile to spend time improving languages, rather than just building with the tools we have?
Comments
  1. Sam Griffith Jr.October 14, 2005 @ 08:32 AM
    One of the things that you are talking about is that Ruby has and exposes it's Meta-object Protocol (MOP). This allows you to extend, intercept and manipulate the system. While it does not go as far as Smalltalk or Lisp in it's exposure of the MOP layer, it does allow many more things than the typical Java or C# programmer is used too. As for the "Adults and Craftsman" limiting my use of the language b/c I may hurt myself. B.S., the same crap was said about Smalltalk and Lisp and all it did was force creative people to figure out all kinds of workarounds and patterns to do things that are otherwise simple in a fully dynamic exposed system. This caused major code bloat and complexity. That complexity is a worse issue than the ideas and power they were trying to "protect" us from. Just my 2 cents..... (oh - I've been using those dangerous languages and tools on Lisp Machines and Smalltalk systems as well as C++, etc. for 20+ years now)
  2. Effexor UsgeMay 06, 2006 @ 12:01 AM
    Well done, nice instructions...
  3. Altace Zetia Crestor Side EffectsMay 10, 2006 @ 07:37 PM
    There is some strange behaviour with this!
  4. Repose Techniques In DenverMay 11, 2006 @ 03:06 AM
    The content of your show is great, I really enjoy it...
  5. El Imparcial OaxacaMay 11, 2006 @ 07:07 AM
    The content of your show is great, I really enjoy it...
  6. Dissipated BookMay 12, 2006 @ 02:51 AM
    Thanks. Updated appropriately!