Reverse.jar
blog.tmorris.net
blog.tmorris.net
There is this tendency (which I can sympathise with but only to an extent) in mathematics and to an extent computer science.
"Let me solve the problem once, in as general and as abstract terms as possible. Leave the lesser minds to prove the corollaries, to apply the work. Let them take on the cognitive load of rephrasing their problems into my abstracted vocubulary in order to benefit from my vast insights and my generalised theorems."
But, crucially in software development, formal systems are designed for the human brain -- and not just individual brains but whole teams of them. Programs become as much a medium of communication between humans and other humans (of varying skillsets) as between humans and computers.
You can't escape UI work and UI considerations, I guess is the point :)
[edit] the M word is Monad
http://importantshock.wordpress.com/2009/01/18/jquery-is-a-m...
HN discussion: http://news.ycombinator.com/item?id=439116
Go read the Typeclassopedia.
Anecdotally, I think microsoft flubbed the introduction by overemphasizing LINQ to SQL. This leaving a lot of developers I know thinking it was a one trick pony and never learning (for instance) LINQ over IEnumerable. Those who have since taken time to learn the non-SQL LINQ features do wonder how the lived without them.
I'm not sure this is widely agreed-upon. Here's what a program composed of pure functions looks like:
quux = baz . bar . foo
This is a function of one argument that filters the input through foo, then bar, then baz. Just like UNIX pipes, but backwards.Now let's try it with monads:
quux = baz =<< bar =<< foo
Same thing; this is a function of one argument, one that passes that argument through foo, then bar, then baz.>>= notation is quite elegant. do notation just makes functional programing look imperative.
Some of the complexity may be necessary in the name of precision, but a lot of the time it’s simply a design failure. Part of the problem may be that it doesn’t seem like mathematicians get any real training in notation design or abstraction communication. Theorem proving exercises in school almost always stress rigor over clarity of explanation: proofs in homework are always either correct or not correct, and what is tested by them is students’ comprehension of existing notation and previously developed abstractions, but there is no exercise which tests students ability to invent good new abstractions or notations.
I agree wholeheartedly with the general sentiment. Even if it is a bit outdated. Type polymorphism (generics) is now well accepted.
(The fact that it often is mathematical jibber-jabber doesn't help their cause, though.)
Anecdotally, it seems fairly common that maths is independently re-invented by people applying it - famously for relativity, IIRC. That's because the maths guys don't actually know about the applications.
It's a truism for our industry that if a new approach really is significantly better (eg. x10) in practice, it will be adopted. You don't need to convince people; you just beat them. OTOH, there's a common wish to over-automate: to spend a week saving a second, and then it turns out to not handle the very next case. So, some people don't like to use frameworks because they are too constricting (don't handle all the cases in practice); and some (Alan Kay) even say if you can build your own infrastructure, you should.
Mathematical ideas usually only work on their own assumptions - a difficult part is matching those assumptions to an application. Though maybe this isn't a problem for the generics example.
There's also incidental practical issues, like the need to ship, then of back-compatibility, resulting in a current Java implementation that can't express List<Circle|Rect> (you need an explicit Shape interface/superclass). Although *ML has proper algebraic data types, does C# do it properly? I don't know.
That's often a big part of it: Someone who isn't a day-to-day user of something sees an issue in it and recognizes that it could be done in a cleaner way, but explains the solution in their own terms rather than in the local language.
The real danger is not the languages, but their proponents. Academia can't make you use Haskell, but other people can.
Appeal to Lack of Authority
Authority has a reputation for being corrupt and inflexible, and this stereotype has been leveraged by some who assert that their own lack of authority somehow makes them a better authority.
Starling might say of the 9/11 attacks: "Every reputable structural engineer understands how fire caused the Twin Towers to collapse."
Bombo can reply: "I'm not an expert in engineering or anything, I'm just a regular guy asking questions."
Starling: "We should listen to what the people who know what they're talking about have to say."
Bombo: "Someone needs to stand up to these experts."
The idea that not knowing what you're talking about somehow makes you heroic or more reliable is incorrect. More likely, your lack of expertise simply makes you wrong.
That's a really good definition of anti-intellectualism. It's easy to sneer at academic languages (and easy to hate them, just observe a college frosh/soph struggling through Scheme or Haskell), but things we now take for granted e.g., garbage collection, virtual machines, IDEs, object orientation, templates/generics were all (even recently) considered academic.
But most of the "non-academic" languages wind up cribbing from the academic languages anyway. For example, Python is very much a Working Man's language, but it pervasively uses not only garbage collection (from Lisp), but also list comprehensions borrowed directly from Haskell!
But don't let me stop you from caaaaadring away!
This makes me seriously wonder whether you're trolling. Out of purest and most innocent curiosity, what sort of programming do you do?
I don't see how this article is helping your point; that's a pretty massive hit. Even worse, this is a GC-style program modified to use explicit malloc/free. Programming with manual memory management encourages a very different style of programming where you try to use malloc/free as little as possible, and you try keep memory for various things in contiguous chunks of memory.
EDIT:
This comment is interesting: http://lambda-the-ultimate.org/node/2552#comment-38915
Also, the technique described in that comment (forking processes with finite lifetimes, allocating but not freeing, terminating and letting the OS clean up all at once) is also what Erlang does, and it seems to work pretty well in practice. Each process has its own arena, for allocation purposes.