Ending the Era of Patronizing Language Design 284
Earlier this year, I was asked to speak at a Ruby Conference. I was happy to go, but I also felt a bit out of place. I haven’t done much Ruby, but I’ve admired the language from afar. I have a number of friends who’ve left C++ and Java to jump toward Ruby and Python and for the most part, they are happy. They do great work, and they enjoy it. They are living proof that the nightmare scenarios that people imagine about dynamic languages aren’t inevitable. You can program safe, secure, high quality applications in dynamically typed languages. People do it all the time, but that’s cultural knowledge. If you are in a culture, you hear about all of the things which are normal which appear odd from outside. If you aren’t, you don’t.
This is pretty much the situation I’ve been in with Ruby, up to a point. I haven’t written a large Ruby application. I’ve tinkered around with the language and written utilities but as far as total immersion goes — no, I’ve never been totally immersed in the language but that hasn’t kept me from learning noticing interesting things at the edge. One of the striking things that I’ve noticed is that the attitude of Rubyists toward their language is a bit different. They seem to have an ethic of responsibility that I don’t see in many other language cultures.
Ethic of responsibility? What do I mean by that?
I guess I can explain it this way. In many language communities, people are very concerned with the “right way” to do things. They learn all of the warts and edges of the language and they anticipate the ways that features could be misused. Then, they starting writing advice and style guides — all the literature which tells you how to avoid problems in that language. The advice goes on and on. Much of it centers around legitimate language defects. Some languages make you work hard to use them well. Other bits of advice, though, are really extensions of culture. If a language gives you mechanisms to enforce design constraints, it doesn’t feel quite right to not use them. As an example, consider sealed
and final
in C# and Java. Both of those constructs do pretty much the same thing and people do go out of their way to advise people on how they should be used to protect abstractions. It’s interesting, however, that languages like Ruby, Python, and Groovy don’t have anything similar, yet people do write solid code in those languages.
Let’s leave aside, for a minute, the debate over static and dynamic typing. What I think is more important is the issue of tone. In some languages you get the sense that the language designer is telling you that some things are very dangerous, so dangerous that we should prohibit them and have tools available to prohibit misuse of those features. As a result, the entire community spends a lot of time on prescriptive advice and workarounds. And, if the language doesn’t provide all of the features needed to lock things down in the way people are accustomed to, they become irate.
I just haven’t noticed this in Ruby culture.
In Ruby, you can do nearly anything imaginable. You can change any class in the library, weave in aspect-y behavior and do absolutely insane things with meta-programming. In other words, it’s all on you. You are responsible. If something goes wrong you have only yourself to blame. You can’t blame the language designer for not adding a feature because you can do it yourself, and you can’t blame him for getting in your way because he didn’t.
So, why aren’t more people crashing and burning? I think there is a very good reason. When you can do anything, you have to become more responsible. You own your fate. And, that, I think, is a situation which promotes responsibility.
For years, in the software industry, we’ve made the assumption that some language features are just too powerful for the typical developer — too prone to misuse. C++ avoided reflection and Java/C# avoided multiple-inheritance. In each case, however, we’ve discovered that the workarounds that programmers apply when they legitimately need a missing feature are worse than what the omission was meant to solve. Blocks and closures are good immediate example. There are tens of thousands of applications in the world today which contain duplication that you can really only remove with the template method design pattern or by creating a tiny class which encapsulates the variation. If blocks or closures were available, programmers would be more likely to tackle the duplication and arrive at much less cluttered design.
Meta-programming features are yet another example. Business applications are rife with situations where you need to know the value, type, and name of a piece of data, yet we use languages in which these sorts of capabilities have to be hand-coded and over and over again. The fact that it took decades for the industry to arrive at something as useful as ActiveRecord in Rails is due primarily to the attitude that some language features are just too powerful for everyone to use.
We’ve paid a price for that attitude. Fortunately, I think we are getting past it. The newer breed of languages puts responsibility back on the developer. But, language designers do persist in this sort of reasoning — this notion that some things should not be permitted. If you want to see an example of this style of reasoning see the metaprogramming section in this blog of Bruce Eckel’s ( http://www.artima.com/weblogs/viewpost.jsp?thread=260578 ). I respect Bruce, and I realize he isn’t speaking as a language designer, but I offer that as a example of that type of reasoning — reasoning about what should be permitted in a language rather than what puts a bit more control and responsibility in the hands of programmers. Maybe decorators work in 95% of the cases where you would want to do metaprogramming in an application, but there is a price to that choice, and it isn’t just the workarounds in 5% of the cases. The additional price is a decreased sense of responsibility and ownership. I think that those human dimensions have far more impact on software than many people suspect.
The fact of the matter is this: it is possible to create a mess in every language. Language designers can’t prevent it. All they can do is determine which types of messes are possible and how hard they will be to create. But, at the moment that they make those decisions, they are far removed from the specifics of an application. Programmers aren’t. They can be responsible. Ultimately, no one else can.
Awesome! Awesome! Awesome! Three cheers for learning culture!
Agreed. It’s why I miss C++ and perl (not that I’m advocating their widespread use in today’s environment) and wonder why people don’t write lisp and/or Clojure.
In addition, I touched on the same topic a few days ago at http://code.google.com/p/markhaskamp/wiki/ProgrammersAndElectricians .
I’d really like to believe that Ruby has a culture of responsibility, but I don’t think that’s accurate. I’ve debugged plenty of problems in Ruby applications which were caused by a third-party library taking liberties with other people’s code—turning
NilClass
into a black hole or usingalias_method_chain
without perfectly duplicating the underlying method signature. Each time it took effort to convince the offending library’s author to fix the problem, and each time I had to hot-patch the code myself until the library was updated. That’s not responsibility in the positive sense; it’s responsibility in the sense of “no one else will fix this if you don’t.”I think that Ruby has more of a culture of permissiveness than responsibility. Just about anything is acceptable, and rather than complaining about another library’s bad behavior you should write your own version with its own bad behavior.
Also, Ruby does have some ability to lock a class down. You can
freeze
a class and its instances, which (mostly) prevents their modification. Practically speaking, no one does this because it’d be rude—just about every Ruby application is written in bald-faced defiance of the Open/Closed Principle. They’re open for modifications but closed to extension, so the mechanism of extension becomes modification.I also think the reason most Rubyists are OK with that is because most Rubyists work on small, time-limited projects. The twelve-year, million-LoC enterprise cathedrals of sorrow are certainly not written in Ruby, and people whose corporate culture dictates a monolithic solution don’t end up writing Ruby, except perhaps for fun. You don’t hear about the failures because no one sinks a group of 200 into a 20M LoC Ruby mega-project.
I’ve worked on a few Ruby projects which have failed to deliver sufficient business value, and it usually boils down to a codebase in which it becomes progressively harder to reason about side-effects of modifications, even with good test coverage. This isn’t inevitable by any stretch of the imagination, but when everything is mutable one must be incredibly disciplined at all times. (And one usually isn’t.)
All that said, I agree with you about language features. This:
is better than this:
But the difference isn’t due to dynamic typing or mutability.
Very well put.
This is a discussion I for some reason end up in all the time with people in all kinds of different contexts. “Isn’t that dangerous?”. The answer I give is often “Yes, it is. But so are cars, knifes and medication”. Almost anything useful can be misused and will be misused, but we seldom do it or learn fast if we do, and in software we have unmatched undo-capabilities of all sorts.
I’m not willing to pay the price for (false) protection as long as the price is less power, especially since they are circumvented anyway. Your not supposed to change a class at runtime in Java, so to solve that, people turn to byte code weaving. Barrier broken, but at a high cost with high complexity. I much rather trust responsibility, good habits and safety nets I set up anyway to protect myself from logical mistakes.
Liberty and responsibility goes hand in hand.
Kind regards
Niclas Nilsson
I’m sure this is true in some instances – but there is another consideration – allowing the language tools to reason about your code.
Languages like Java, C+++, and C# come from a mindset that the compiler should make an attempt to validate the certain invariants about the code that you produce. As each of these languages evolved, some invariants were relaxed – others were strengthened.
Take, for instance, C++ const keyword. It provides programmers to make assertions about the mutability of variables in their code – and declare methods that promise to observe the mutability requirements of const variables. This allows the compiler to verify such assertions and make sure that you are writing code that adheres to certain assertions you yourself make.
Does support for const-ness in C++ make the language less flexible for the developer? Is it taking power away from what you can do? Perhaps. But it also provides certain guarantees about how your code will behave (under normal circumstances). Interestingly, C++ also has the ability to remove constness from an object using the const_cast<>() operation – probably to open the door for developers to shoot themselves in the foot.
An example of a language that demonstrates some of the challenges involved with dynamic capabilities is JavaScript. Many of the things you can do in Ruby you can also do in JavaScript. You can define classes on the fly. You can weave aspects into DOM objects. You can dynamically intercept and replace method calls. You can create untyped objects and even generate JavaScript using JavaScript.
In my experience, I have not seen an ethic of responsibility in the JavaScript I’ve seen. If anything, JavaScript encourages a lax and careless attitude towards programming. And you can ask anyone – there is an awful lot of really bad JavaScript out there. (I’m sure there is a lot of good JavaScript too … but we tend to run into the stuff that causes our browsers to barf – so it’s more obvious it’s out there).
Dynamic languages offer a trade-off between the capabilities of the language to support compile-time assertions about code – and the capability of developers to dynamically change how their code behaves and what it does. Essentially, it trades development productivity for maintenance productivity.
Don’t get me wrong – I like the power that capabilities like aspect oriented weaving and functional metaprogramming bring. But I wouldn’t mind seeing a better blend of compile-time assertions and dynamic capabilities. In my opinion – the quality of code you see in the Ruby community says more about the kinds of developers than anything about the language itself.
I’m with Coda Hale
While I think that can be a good exercise to practice Ruby actually I have the same doubts about a spread adoption
Can anyone suggest me reading/exercises that will help me to investigate/solve my doubts ?
Wonderful. My response got a little long for a comment box, though: http://is.gd/1xCPq
Great article.
I do slightly disagree though. I believe the focus is not so much on responsibility, but more on which feature set to use, and how to write code.
Personally I try to use a minimalistic OOP approach with ruby. If i dont need feature x, I am happy to omit it. I try to stay rather simple, because sooner or later complexity will hit me anyway.
Ruby as language is 95% perfect for me. The 5% would however be a simpler (!) language, with a slightly different require/include/Module approach, a prototype approach and behaviour snatching to reuse object behaviour (rather than subclass). But I digress.
One thing that I want to state, and this is the last thing I want to comment, is that I believe too many people have stopped thinking BIG. They have no vision anymore.
People dont aim for a new kernel. People dont aim for a new Operating system. They are happy with the existing infrastructure.
I am not. I believe a whole ecosystem can be written in a SIMPLE ELEGANT language. I am not saying that ruby is this. But I am saying that people should stop worshipping C, and instead try to get the LOGIC of what needs to be done, in a way that other humans can understand it as well, without studying C for years.
Real hackers dont want to hear it, but I tell it bluntly – you guys are coding in fossil ancient languages.
One day those languages will be dead.
What you’re essentially saying is that encapsulation is a bad thing because it prevents bad things and languages are good if they let you do bad things either accidently or by design. Perhaps then we should all be using assembly?
Your argument is like expecting banks to become more transparent with less regulation. Maybe we should abolish the houses of government, elections and invest all power in the President. All that responsibility is sure to make them exceedingly honest and responsible.
It seems the truly defining characteristic of the Ruby culture is detachment from reality.
A Ruby responsibility discussion … hmmm not sure I buy that. You can be lame or great in any language. In this sense I think Ruby people need to get over themselves a bit. Sure language influences things and you often see the hand of the designer or community in place but you can be an idiot in Java or Ruby or Fortran or ….
With dynamic languages of course we see some real danger with the “idiots” redefining the language as they like,...hey wait the C preprocessor was used to do this before :-) A few have commented on this type of abuse with Ruby.
Anyway the programming language is a small part of things. Chinese language or English language doesn’t make one more likely a better poet, no more than Ruby or C# makes one a better programmer in a deep sense. Sure in PLs a language may encourage some habits but languages don’t address the challenges of thought and construct. I’d argue in fact that Ruby muddies this a bit of this with some of its pattern and convention adoption via Rails which is wrongly attributed to the language. Is it the language or the framework (some dub culture) we really speak of?
These days if teaching undergrad programming language theory class I often suggest the “language is the library (or API, framework, whatever)” because in many ways that is more important than anything in promoting what people often argue about more so than the inclusion of a Goto, the type system, global variables, etc.
Anyway that’s clearly more than 2 cents. Good to raise the point, a linguistic view of programming langs and use is appropriate and not discussed enough at times.
I thought I posted this before, but apparently not. Very sucky blog engine. What’s it written in? Anyway…
I’ve long understood one of the (more-or-less well concealed) design drivers of Java to be a desire to open the recruitment pool to those less…inclined to be careful, shall we say without courting disaster. And also without courting productivity, but no disasters was seen as more important.
Meanwhile, the existence of books with titles like “Yet 50 More Absolutely Mandatory Properties Your C++ Program Definitely Must Exhibit If It Is To Stand Any Chance Of Working Correctly Even A Little Bit But That The Compiler Doesn’t Enforce. Be Warned. (7th Edition, fully revised and updated)” point to another failure mode.
What lessons might there be from the history of the Lisp community? Lisp (along with Smalltalk and assembler) is about maximally non-patronising of its users. I seem to recall reading some Dick Gabriel piece that explained how Lisp programmers ended up self-censoring, deeming certain kinds of template cleverness to be in poor taste—and taking a care not to inflict those clevernesses upon their peers. They could do (and write code to do to itself) pretty much anything, but they chose not to do certain things. Can’t recall any more detail than that. Sorry.
Seductive case … who could be against responsibility and learning? ... but years of reading actually existing code tell us both that others are not responsible and that we ourselves are often lax. How has Ruby changed our nature?
I wrote commercial applications in APL back in the ‘70s and ‘80s. Very dynamic. Very easy to morph code written by others. You could write new APL as strings and execute them with the thorn operator. Very little interpreter support (there was no compiler) to catch or warn.
What wonderful messes we created. It was cool that we could fix almost as fast as we wrote. But you had to be damn good to read anyone’s code (including your own).
Did we squawk? No much. We were a small community who understood that’s just the way it was. We smugly compared ourselves to the Cobol and Fortran clods, reveling in our superiority of intellect and in our productivity. At least we had the productivity.
Another factor: there wasn’t much you could prohibit without defeating the language altogether. Gradually, after a decade at least, there emerged one or two few thin books on style. But, really, you might as well have complained about gravity.
Similarly, I’d be a little wary of making too much of the fact that the Ruby community isn’t consumed by style debates … yet.
Another thought. What about languages (e.g., F#) that rely on specific syntax to declare mutability/immutability. You mess with that and the wheels come off.
If you want to see advice on language style in the Ruby community, try googling “monkeypatching ruby”.
If this were true, then as more and more people realize that personal responsibility and, perhaps more importantly, GROUP responsibility, enables creative and productive use of more expressive languages, the more they should be taking up languages like Lisp and Forth for contemporary, real-world development tasks today.
Both Lisp and Forth, but especially the latter, permit an anything-goes coding approach. Forth, in particular, revels as THE language in which you don’t write programs, you rather create a new language in which to describe your problem, then solve your problem in said language (usually within one or two top-level definitions). Abstractions, such as strings, arrays, objects, etc., must all be implemented by hand, assuming your organization doesn’t already have its own library thereof. Lisp takes things more conservatively and encourages construction of libraries you can rely upon (which people do use!), but again, it’s strictly optional.
Right now, I’m working to implement a graphical user interface in Forth, and I’m loving every minute of it. The application using the GUI is coming along quite nicely—implementing a 6-option radio button requires less than a handful of application lines of code. (Of course, the GUI logic behind this radio button takes substantially more code, but still less than two pages total; but, the concept at hand illustrates my point nicely.) The code is compact, easy to read, and to a limited extent even able to lay widgets out in a useful form in O(1) space and time. Bliss, if its slightly typographically unjustified output sits well enough with you.
Still, (1) I couldn’t care what other people do with my code after I’m finished with it, because such projects have no influence on MY current project (thus, I do not feel any responsibility towards them), and (2) I know nobody else is going to give a rodent’s bum about my projects in Forth anyway, which frees me from the responsibility of interacting with other coders. Forth is a “dead language”, industrially speaking. Any effort I invest in it is academic at worst, and extremely libertarian at best.
Forth and Lisp are sometimes called “programmer amplifiers,” precisely because of their heavy reliance on personal- and/or group-responsibility. These languages make good programmers great, and bad programmers horrific to deal with. And, it is for this very reason that both languages have fallen so far out of favor amongst corporations for industrial-scale coding.
Ultimately, bean-counters and managers want standards—standards for how the code looks, standards for how the code behaves, and most importantly, standards for how coders work together. Since coding standards rarely can be agreed upon between companies or research institutions, let alone individual groups within a single company or academic group, the next best thing is to take the Djikstra-approach and embed your preferred standards into the code itself. C, C++, Java, Pascal, Modula-2, Oberon(-2), Sather, Eiffel, Ada, Python, C#, the multitude of (un)structured BASICs, and so many more languages all impose a kind of coding style on the programmer. No personal responsibility required! And that means you can get by with hiring folks off the street easier, because you have some semblance of understanding their solutions to problems without first undergoing expensive training sessions.
So, yes, it is truly a cultural issue, and not a technical one. There is zero doubt in my mind that Forth, as low level as it is out of the box, can handle tasks comparable in complexity as what we’re throwing at Java today, and do so compactly, gracefully, and with ease, IF coders are willing to take the responsibility for things like settling on industry-standard abstractions (a kind of standard library for Forth if you will), industry-standard coding guidelines, and industry-standard approaches to memory management.
Heck, we already KNOW Lisp can do the job, and in a way so superior to Java in every way imaginable it boggles the mind to wonder how Java ever got off the ground.
However, that will simply never happen, for the simple fact that, beyond the coding styles enforced by the fuedal society found in all corporations today, no two statistically-significant group of programmers could ever agree on a common set of idioms. (FWIW, ANSI Forth is what you get when several commercial and amateur Forth developers get together to agree on such things. The result is that nobody likes the standard as it’s defined. Go figure.)
This is why stricter languages truly exist, at the most fundamental level.
Now, it’s also true that this can be taken too far. I love Oberon, for example, but nobody else I know would associate with me if I admitted it in their presence. THEY HATE ALL-CAPS KEYWORDS (another example of language-imposed coding styles). And, even without such keywords, they think all Wirth-ian languages are much too verbose (they are hired to WRITE code, not read it).
So, despite the fact that Oberon beat Java to the write-once-run-anywhere punch (Juice came out slightly ahead of Java’s commercial acceptance), complete with in-browser player modules, nobody went for it at all. Java was so much more “C-like”, despite its worse garbage collector implementation and run-time performance, that it became the de-facto web applet language, cementing Java’s place in history.
So, really, if you want to give coders a good feeling about the languages they use, it must (1) actually impose a coding style upon them, while, (2) giving them the illusion of brevity and freedom of expression. Then, and only then, will a language actually succeed in the market-place.
You know, there are a lot of other design decisions that go into a language. It’s not just a ‘protecting users from themselves’ attitude.
In C++ reflection and the required RTTI are expensive and difficult to incorporate. If reflection were there it would just be more fodder for the ‘C++ is slow and bloated’ people. Also would have been fun to see this interact with C.
In Java multiple inheritance would have greatly complicated the class model and introduced ambiguities: it would not have been clean, further would have required language features to deal with the ambiguities or been severely crippled (interfaces are basically the clean crippled compromise)
Extremely good observations.
Many (language designers) make the assumption that people need to be “controlled”. Indeed, newbies do prefer a rule/recipe/formula-based learning culture and languages that impose all sorts of “safety nets” around “dangerous” things serve that group well. Until, the newbie is no longer a newbie and then the constraints become impositions.
Sadly, humans have a desire for control and power and it is easier and more convenient to assume that someone is an idiot with no choices than a person with thought and freedom. I agree that it is about responsibility, but not just responsiblity to self, but responsibility to everyone.
Freedom should mean the same thing for everyone.
—Aslam
+1 to “kdfjkla”
C++ didn’t “avoid” reflection.
Whilst I’m sympathetic to the sentiments of the OP, I suspect it’s mainly the case that the author likes Ruby and therefore the “Ruby way” takes a positive form.
You could write this article about C++ and you’d be able to make the same arguments about it not “protecting” the coder – in fact, people have, I think.
There’s lots of things I like to do in my spare time. Some of those things are care-free and fun. Some of those things are a little risky or even downright dangerous.
When I come to work, my boss doesn’t really want me carrying on the risky, fun, thrill-seeking behaviour I might have been engaged in at the weekend.
When another developer has to come along after me and support my code, he really doesn’t care how much fun I had writing the code. They just care about whether or not they can understand my code, and what/how it does.
Se unless you are a romantic lone wolf programmer, it’s not just on you. You’re not the only one carrying responsibility. It’s on your whole team.
Fortunately the new breed of languages are including things like pre/post conditions and invariants. They’re including inline unit tests etc. They aren’t letting the developer monkey-patch every time they itch. Yes there are new hip fringe languages that allow you to play any which way they want… what languages do you hope you bank uses to manage your account? What languages do you hope your hospital uses to monitor your heart, control the nearest nuclear powerstation, manage the auto-pilot on the jet you’re on… I’m pretty sure you don’t want any of them to be using Ruby. And I’m sure you don’t want any of them developed using the kind of approach outlined in this article.
Lastly… tests are good… unit tests are good… a compiler represents the largest chunk of automated, free unit tests that one can ever hope to aquire. It would take you man-months to develop the unit tests you get for free when you hit “compile”.
Mark: “I believe a whole ecosystem can be written in a SIMPLE ELEGANT language.”
I’ve been searching for that language for some time. It’s compilable to machine code too, so that I can use it in an embedded firmware environment.
What was its name again? ;-)
Pattern-chaser
“Who cares, wins”
It is amazing to see how different people offer so radical different perspectives on the world. Just the other day, I read a blog on how we (programmers) have moved past the days when “Languages are designed to teach the right aptitude” and put more direction into the languages themselves (through the form of static type system, rigid syntax, etc.). And now, we have the totally opposite view.
Frankly, I am surprised at your view on Python. In my opinion, Python out-javas Java in the department of restricting the programmers. The community don’t seem that much better: they, for some reasons, despite anything Lisp-like. Once, a Python designer bragged about how tail-call Optimization is bad (it breeds unrealistic expectation, you know), another time, how the programmers should be forbidden from thinking about implement a interpreter themselves; or, how a Python user claim that if his/her language (aka Python) does not support his/her design, s/he must be wrong, and must revert the design to conform to the language. Etc.
Although I have never looked at Ruby (I don’t feel the need to), I think Ruby also suffers from something similar to Python. These languages offer a lot of pre-built syntax and shortcuts, but forbids their users from even thinking about extending these. Opinionated framework is another type of restriction and non-responsibility: you don’t decide how to design your application; the decision is in the framework already.
Personally, I think your view on how the languages are freeing the programmers is not so correct. Look at C, or Lisp. Or even C+. C/C+ does not offer reflection simply because, well, they can’t! They are so low level, so close to the bare metal that offering such thing is pretty tricky. However, C is surprisingly free-spirited: the machine is yours, now go and manipulate it. Lisp is another perfect example of programmers’ responsibility: read the first line of R5RS! And Macros, dynamically type, etc. The language is designed so that the programmers can build whatever they want, be it a small interpreter or some specialized languages.
Thus, we don’t experience freeing up! We are experiencing more restricting. However, the situation is like the US and China. China is restricted, but it publicly and loudly so, to preserve its heritage and whatnots. The US is also restricted, but stealthily and behind your back, while trying to convince you that it is provide you with utmost freedom. Similarly, Python is worse than Java and C#, but it does not proudly announce that. It just poisons your mind and creep into your life, enslaves you slowly until you become one of its users. So, beware.
Looking back on it, I don’t know if ‘ethic of responsibility’ is the was the best phrase for what I was talking about.
I remember reading some psychologist a long time ago who defined ‘responsibility’ as the ability to respond. So, it is responsibility in that sense.
What I was trying to get at was the fact that when I’m around Ruby people, I don’t notice the hand-wringing that I notice in other communities, and I think it is because, as bad as it gets, they are never boxed in. They can respond.
Just because the responsibility goes back to the developer doesn’t mean that all developers behave responsibly, but it’s nice that they can without artificial constraints. When you are in control, you can do better work. If you are in control, you can also apply a bit more peer pressure.
Well, you’re right, the argument you’re countering here (“Ruby is too much power for average programmers”) is given a lot of credence in some circles, and it’s a crummy argument. However there are good reasons to use weak languages.
Invariants make software more reliable. Weaker languages have stronger invariants. There’s less stuff to test.
Invariants are also useful to people who write compilers and interpreters. So in practice it takes a lot of effort (on the part of the language implementers) to make a powerful language run as fast as a weak one. As a language hacker I can attest that the more effort you put in, the harder it is for end users to predict what’s fast and what’s slow in your language.
The worst language features sow confusion among users and smash through invariants and abstractions for little practical payoff. JavaScript’s ‘with’ statement, for example, breaks lexical scoping.
Other features break fundamental abstractions in exchange for a large practical payoff. Threads, for example.
It is useful to have languages at multiple points along the spectrum.
Magice: “In my opinion, Python out-javas Java in the department of restricting the programmers.”
How, exactly? Python is more restrictive than Lisp, and the community can be pedantic sometimes, but I fail to see how Python-the-language restricts the programmer more than Java.
The only thing I can think of is the significant whitespace issue. Other than that, Python doesn’t have all of the balls-and-chains that Java does. It doesn’t require the public/private/protected/static/final/etc hodgepodge, there’s no silly one-class-per-file rule, it has actual introspection, you can add/delete an object’s attributes at runtime, no checked exceptions, etc. Not to mention that it doesn’t have the static typing straightjacket. ... So what exactly does Python have that supposedly makes it restrictive, compared to Java?
Michael,
Reading this, I immediately though of Dijkstra’s “Go To Statement Considered Harmful”.
Are you saying that you disagree with that?
Excellent!
I think it does come back to different cultures and different priorities and different ideas about responsibility. Some folks are very concerned with childproofing languages. But at best this helps only the lowest tier of developers, almost always at the cost of hamstringing the language for more advanced users, if for no other reason than that the language developers are wasting a lot of time on this rather than other features. Java is very much a blub language through and through, and it shows in the concentration on childproofing over capability or elegance. C# is somewhere in between but leaning heavily away from childproofness and more and more toward elegance, power, conciseness, etc.
Java is the Xanax of languages, it’s got some nifty features that remove a lot of pain from, say, C++ development, but it’s so hemmed in with childproofing that trying to do anything of value in the language becomes frustrating and cumbersome very quickly.
Languages should very much be designed to guide programmers into a “pit of success”, but attempting to design a language such that it’s impossible to write bad code is itself an impossible task. No matter how safe, how clear, how well-designed a language is there will always be a way to misuse it horribly. You can’t baby programmers as if they were children, and you can’t make the world a 100% safe place. The world is messy, complicated, and dangerous. And it takes serious tools wielded by experienced, responsible craftspeople in order to build anything of value in such a world.
Look at any construction site, there are nail guns, hammers, saws, concrete, generators, compressed flammable gas, high ledges, etc. Imagine if all the tools of a construction worker were childproofed to such a degree that they could not injure themselves or others no matter how hard they tried. Such tools would be useless. Instead, the tools have reasonable safety measures put in place that are just enough so that responsible operators don’t have to fear for their safety yet not too much so that the tools are completely useless.
Laurent: I knew someone would bring up that point. Although, I thought their example would be pointers rather than goto. Frankly, I think goto is okay to have in a language for the odd cases when you feel you have to use it. Raw pointers in a managed memory language, on the other hand, are a harder issue. The question is really whether you can do anything useful with them.
yup: the programmer can fix the language, but the language cannot fix the programmer =)
Michael: Just so! If you do systems programming, for example (as I do for part of my living): There you often need some way to directly access specific memory locations – and pointers are the fastest and most convenient way to do this. When I code other stuff, I try to avoid them (unless they’re just too convenient to resist, hehe).
Offh: I wasn’t saying that I don’t see the need for pointers, but rather that they can be constrained in managed memory environments. I spend a lot of time in C and I know that you do have to touch the metal at times. The trick is separating out those cases where you need to to that from the cases where you don’t.
It’s human nature. If we could all just accept something as being the “best” option at a given time and focus our energy on it there would be a lot less time, money, and energy wasted in the world. One software development language, one spoken language, one standard of measurements, etc. etc. etc. (So Socialist of me, but one application development language, one web development language, one database…)
Put the energy into improving the tool, not reinventing the wheel every time the trend points out that there may just be a “better way”.
Heck, let’s just start small and agree on one, or at most two screw heads! Phillips vs. Slot vs. Robertson vs. Hex vs. Torque vs…. ENOUGH! At least get rid of Slot. Just re-brand the damned things as paint can openers and be done with it.
C is a language that assumes the programmer is responsible and will “do the right thing.” However, widespread use of C (and C++ in a C-like way) is a major source of buffer overflow vulnerabilities. The evidence is that programmers are not really all that “responsible” in the sense that oversights and errors are common.
I’ve used the dynamic languages (Python) for certain things and it is possible to rapidly build programs that work with them. However, I wonder if anyone has used a dynamic language for a really large program… such as 10 million lines of code created by 100 programmers spread of 5 different organizations. I also wonder if anyone has dared using a dynamic language in a safety critical application. Would you feel comfortable flying in a plane with Ruby code controlling the instruments?
On the other end of the spectrum is something like SPARK Ada. SPARK is a very limited subset of Ada with many constraints in what is and is not allowed. What do you get for this? You get the ability to statically prove that your code conforms to specified pre and post conditions. Note: statically prove.
Static type languages feel safer to the corporate IT managers. They imagine the type system will force the coders to cooperate, that the compiler will do the managing work for them.
But a strong type system doesn’t really prevent that many bugs, it just feels like it should. Most non-trivial bugs are algorithmic. I used to think a large-developer-count project should always use a static type language, now I’m not so sure.
I mean, if you’ve got your types well defined, how many hard-to-debug errors will result because someone passed in an Address parameter object rather then an Account parameter object? And how stupid would that programmer need to be to make such an error?
I just finished a substantial project in Python, and now I think that OOP and design patterns are not all that essential when you’ve got first class functions, closures and dynamic typing. I can spot a Java programmer doing Python a mile away, it’s all classes! :)
What are the critical thinking ethics learning tools to teach kids how to avoid organized crime through the course of their lives?
The wheel of Buddhist terms poster modular wall mural game. Doctoral dissertation for philosophy, title: The Interpenetration of Buddhist Practice and Classroom Teaching. Technocracy Ethics USA censorship Chinese military intelligence genius clones
I am convinced.
Who can doubt that goto use and misuse were common when Djikstra wrote, and is rare today. Culture has changed. So Djikstra can be right (then), and be wrong (now). Cost of the goto feature has declined.
For a collection of projects there is a return:
Return = Value – Effort
A goto language feature has a positive or negative effect on return for a collection of projects – programs and teams. The sign of the effect on return for a feature usually depends on the collection of projects.
One characterization of a powerful feature is one with high costs in misuse and high benefits with use.
The combination of education to effect culture, and power in features, is an approach which is recognized to have higher return now, than in the past.
Grubert writes, “I mean, if you’ve got your types well defined, how many hard-to-debug errors will result because someone passed in an Address parameter object rather then an Account parameter object?”
As a professional software engineer who has worked with all variety of type-safe and dynamically-typed languages, A* *LOT.
I’ve seen this happen all-too-often, and ESPECIALLY by people who, like you, feel they don’t need type-safety in their languages.
Indeed, those who prefer type safety in their languages are the LEAST likely to make such mistakes.
Grubert continues, “And how stupid would that programmer need to be to make such an error?”
Not stupid at all. Many of them have degrees one could only dream of acquiring—physics, electrical engineering, discrete or analytic maths, etc. in addition to their comp-sci or comp-eng degrees.
But, more importantly, these people often have been in the field for decades. Like me.
So don’t even go there.
“The fact that it took decades for the industry to arrive at something as useful as ActiveRecord in Rails is due primarily to the attitude that some language features are just too powerful for everyone to use.”
Although I could agree with some of the point if the article, in the right contexts, the statement above has so much wrong with it, I just can’t take the author seriously. Indeed, the irony that such an uninformed statement was made in an article about freedom and being wise enough to wield it is thicker than Oatmeal.
@”Roxy and Elsewhere”
You stated that you don’t like the author’s statement on ActiveRecord. But you did not state * why * you don’t like his statement.
Please enlighten the rest of us on why you take exception to his characterization.
@Michael. Brilliant blog post by the way. Well done.
1. Yes I agree… what nonsense, nonsense I say!!!
2. The mistakes made by BRILLIANT people in designing languages such as C++ were not mistakes at the time, just reflective of a point in time
3. Shooting yourself in the foot is a good way to teach yourself not to!
4. Programs evolve, someone else’s mess is another’s masterpiece (e.g: the Linux kernel!)
5. Having more power at your fingertips means either you will crash and burn or learn to use it!
6. Though after having said all of this, you wouldn’t rock climb on a cliff without a harness, not as a novice anyway!! first you need to understand the risks, then proceed accordingly.
To Conclude: You have a point (but there is also merit in providing safety nets, as others have also mentioned!)
?????
???? ...........
I like This site! Thank you for your information
sign
Talking about shamelessness.
In this age of “library is everything,” talking about personal responsibility is no more than a joke. It’s like movies and novels depicting a guys going into a forest alone, with a big gun, a car, modern clothes, shooting down everything, and then talking shit about he (almost always he) not needing modernity and other people (yeah right, what’s on your hand?)
Let’s think about it. If you want personal responsibility, why don’t you implement your own stuffs? Manage your own memory? Why do you keep on screaming about this language (actually, this implementation of this language) lacks XML parser or some exotic shit that Ruby or Python happens to provide? I have not looked at Ruby that closely, but Python shines as a good example: people essentially don’t know what to do outside of the provided framework. There’s only one way to do it, remember? Where does responsibility come from? Heaven?
On the other hand, typing, restriction, etc. represent discipline. No, those Rubyists and Pythonians want none. Why? Because “it’s all about ME,” or, “I WANT IT THIS WAY”. Yeah right. Like how people talks shit about their “freedom” to throw insults at people. Or how teenagers want to be “unique” and “creative” and dumb as shit.
So much on responsibility.
Well, I’ve seen prescriptive advice in the Ruby community. And it’s about something you almost touch on, with closures: methods as a first class object.
I asked about Ruby’s “method” method, which detaches a method from its object so you can pass it around, just like a lambda. I got a swift and strong berating from the Ruby community on IRC as to “how you should use the language the way it was intended”.
So tell me, IRC smugnuts, if it’s not intended, why is it there?
In my experience, the Ruby community has the worst of the holier-than-thou attitude about the right and wrong ways to write code.
Yes. Yes. Yes. Thank you. I can’t stand it when people make you use “final” ... just in case somebody, somewhere, was going to abuse your non-final class down the lines. Hogwash.
I surfed here through Google! Great job.
Thanks for sharing the information.It is definitely going to help me some time
For years, in the software industry, we’ve made the assumption that some language features are just too powerful for the typical developer — too prone to misuse. C++ avoided reflection and Java/C# avoided multiple-inheritance. In each case, however, we’ve discovered that the workarounds that programmers apply when they legitimately need a missing feature are worse than what the omission was meant to solve. Blocks and closures are good immediate example. There are tens of thousands of applications in the world today which contain duplication that you can really only remove with the template method design pattern or by creating a tiny class which encapsulates the variation. If blocks or closures were available, programmers would be more likely to tackle the duplication and arrive at much less cluttered design.cheap VPS
very thankful for your great information
Promotional gifts and promotional items UK supplier:
If you want to see advice on language style in the Ruby community, try googling “monkeypatching ruby”. http://facebook Nicarbazin
l the time, but that’s cultural knowledge. If you are in a culture, you hear
If you are in a culture, you hear
If you are in a culture, you hear
I wanted to say that it’s nice to know that someone else also mentioned this as I had trouble finding the same info elsewhere. This was the first place that told me the answer. Thanks.
I ended browsing your blog along
iPad video converter for Mac is a professional converter for iPad.
iPad transfer can move the iPad stuff.
Very useful post, I like it very much. Thanks.
I think that Ruby has more of a culture of permissiveness than responsibility. Just about anything is acceptable, and rather than complaining about another library’s bad behavior you should write your own version with its own bad behavior.
It’s easy to create a mess but not so easy to clean it up after, very insightful post
Very pleased that the article is what I want! Thank you
www.wonderfulorder.com http://picasaweb.google.es/professionaljersey http://picasaweb.google.es/fashioninline we supply brand sport shoes .clothes .bags.underwear .jersey .NFL jersey .MLB jersey .NHL jersey NBA jersey .football jersey .AF clothing .moncler jacket. munich shoes.watches .and etc Our msn :
www.wonderfulorder.com http://picasaweb.google.es/professionaljersey http://picasaweb.google.es/fashioninline we supply brand sport shoes .clothes .bags.underwear .jersey .NFL jersey .MLB jersey .NHL jersey NBA jersey .football jersey .AF clothing .moncler jacket. munich shoes.watches .and etc Our msn :
we supply brand sport shoes .clothes .bags.underwear .jersey .NFL jersey .MLB jersey .NHL jersey NBA jersey .football jersey .AF clothing .moncler jacket. munich shoes.watches .and etc Our msn :
What are the critical thinking ethics learning tools to teach kids how to avoid organized crime through the course of their lives?
totally agree…great post indeed…things never heard before…and thanks to your article..;)..keep the great job up;)
Nice article on programming languages.
While reading through the second bdd example I realized that this was not intended, but distracted me while reading the first one a bit.
Great post – it’s always nice to get some hints and tips. Iran
I should digg your article therefore other folks are able to look at it, really helpful, I had a hard time finding the results searching on the web, thanks. Medical Technicians
“What you’re essentially saying is that encapsulation is a bad thing because it prevents bad things and languages are good if they let you do bad things either accidently or by design. Perhaps then we should all be using assembly?
Your argument is like expecting banks to become more transparent with less regulation.”
Indeed. It’s nonsense when John Stossel says it and its nonsense here.
I have you bookmarked your web site to check out the brand new stuff you post.Should you’re keen on having a visitor weblog poster please reply and let me know. I will give you unique content in your website, thanks.
Today I have done a camera shootout with the white iPhone 4, the iPhone 3Gs and the iPhone 3G.
A language that PROMOTES responsibility rather than ENFORCING it . . . .now that’s a novel concept. I am glad that more cultures are emerging which provide the coder with options instead of constraints. Misuse is inevitable, but freedom breeds creativity. If we let fear guide everything we do, we will never achieve anything.
Mold making is the core business of Intertech (Taiwan). With world level technology, Intertech enjoys a very good reputation for making Injection Mold and Plastic Moldsfor their worldwide customers.
I think that OOP and design Provillus patterns are not all that essential when you’ve got first class functions, closures and dynamic typing.
It was nice to read your post. I gathered some good points here. I would like to thank you with the efforts you have made in crafting this great article. In fact your creative constructing capability has gladdened me a lot.
thanks for Moncler Jackets || Christian louboutin UK || Moncler coats || Christian louboutin shoes || Christian louboutin pumps your post!
Abstractions, such as strings, arrays, objects, etc., must all be implemented by hand, assuming your organization doesn’t already have its own library thereof. Egyptian Foreign Relations
Nice post. Its really worth to share and spread.
Incontinence products
Another thought. What about languages (e.g., F#) that rely on specific syntax to declare mutability/immutability. You mess with that and the wheels come off.accounting services
Languages like Java, C+++, and C# come from a mindset that the compiler should tenant Screening make an attempt to validate the certain invariants about the code that you produce.
I really like this essay. Thank you for writing it so seriously. I want to recommend it for my friends strongly. iPad to Mac Transfer can help you transfer music, movie, photo, ePub, PDF, Audiobook, Podcast and TV Show from ipad to mac freely.
Thanks for shareing! I agree with you. The artical improve me so much! I will come here frequently. iPhone Contacts Backup For Mac can help you backup iphone contact to mac.
such a nice blog to hang on with i really appreciate …. http://www.bukisa.com/articles/439944_boob-job-facts-you-must-know-before-the-surgery" >boob job
Thanks for shareing! I agree with you. The artical improve me so much! I will come here frequently. iPhone Contacts Backup For Mac can help you backup iphone contact to mac.
Visit
vendita computer
lago di caldonazzo
In many language communities, people are very concerned with the “right way” to do things. They learn tenant Screening all of the warts and edges of the language and they anticipate the ways that features could be misused. Then, they starting writing advice and style guides.
I do believe a whole ecosystem can be written in a SIMPLE ELEGANT language. I am not saying that ruby is this. But I am saying that people should stop tenant Screening worshipping C, and instead try to get the LOGIC of what needs to be done, in a way that other humans can understand it as well, without studying C for years.
Cool, I’m pretty sure you don’t want any of them to be using Ruby. And I’m sure you don’t want any of them developed using the kind of approach outlined in this article. Zetaclear
Yeah, but there are tens of thousands of applications in the world today which contain duplication that you can really only remove with the template method design pattern or by creating a tiny class which encapsulates the variation. Acnezine
termine which types of messes are possible and how hard they will be to create. But, at the moment that they make those decisions, they are far removed from the specifics of an application.
Don’t get me wrong – I like the power that capabilities like aspect oriented weaving and functional metaprogramming bring. But I wouldn’t mind seeing a better blend of compile-time assertions and dynamic capabilities.
Cool, it provides programmers to make assertions about the mutability of variables in their code, and declare methods that promise to observe the mutability requirements of const variables. Proactol
Very nice tips
“Coding Responsibly” is not a valid cure for human error. If you look at the amount of security exploits which are made possible by a language paradigm which places the responsibility of writing error-free code on the programmer – you realize that restriction may be a valid trade of power for safety. Consider how a whole class of errors like memory-handling in C can be abolished by letting the computer do the housekeeping and abolishing pointers. Software is only increasing in complexity and the bug rate is already so high that it just seems obviously false that relying on the good will of the coder is anywhere close to good enough. The language we use has a large effect on the quality of code we write and that’s only true because it promotes certain kinds of patterns and discourages or prevents the use of others. So although as a coder, I very much enjoy powerful , dynamic , expressive languages, I think writing better software has as much to do with the language preventing me from making mistakes as it is about design, best practice and discipline.
thanks for sharing! fantastic blog.
Hi michael, I used to read a lot of articles for many years. But I think your writing style is the best ever and your article is really helpful. Thank you so much and have a great day.
Buy $10 Replica Designer Sunglasses with 3-day FREE SHIPPING
good post, come on !!!!!! waiting for the new one from you !!!!!!!1
Thank you very much for this article and blog.I like its and as to me it’s good job.
I have been searching for this quality blogs regarding this niche. Searching in Yahoo drove me here, I just found this kind of satisfactory readings i was looking for. I must bookmark this website to avoid missing it again.
I do blogging from years but haven’t seen before this kind of motivated contents mention in a blog. I must admire you have mentioned a good amount of valuable contents to this blog. I have been just aware of the Ruby language but still satisfied to working with Java and C++. salvage yard
Hi michael, I used to read a lot of articles for many years. But I think your writing style is the best ever!
I almost give up to find the article that educated me.Finally I found this one.Thak god this is the best ever.
I like this article so much.How could you wrote such a nice one? I try too. But finally I gave up.Want to try again.
Product Description The low maintenance 6000 series full facepiece respirator is light and well-balanced. Innovative lens design offers a wide field of vision.
How can I recommend this article to my friend? this is the best one,
Hi there, this one is very help me to design the idea what I want to do.Thank a lot.
If you feel empty inside this web would help. Thnak you so much.
Ruby seems the new era of programming language people used these language instead of C++ and Java, these are the dynamic interpreted open source programming language mostly I found programmers loves to use Ruby languages just because of easy programming and very easy to debug and running. top secret fat loss secret review
Many individuals think parkour looks simple others suppose it looks impossibly tough. Whatever you guess, Parkour is not comfortable but it is also feasible. Go to Parkour Training and learn out more about training. With the correct attitude and the will to perfect proficiency, who knows how far you could get. There is no end to amend your parkour power. There is the possible action of always improving and there is no roadblock to hit when you are ‘finished’, there is constantly a novel spot to develop or a other jump to leap.
Parkour and Freerunning are different but not completely. Parkour was developed anterior to Freerunning by David Belle. It comprises of vaults and springs. The deep philosophy behind parkour is not be held by your surroundings, which most people are. They have to walk on certain assigned routes to get from A to B, but by employing parkour there are no architectural bounds and your course is available for you to select.
The blog is really appreaciable and i like to keep on visiting this site once again that it would help me in further thanks for sharing the info. Social Network
I’ve used a bit of Ruby on Rails, it’s pretty quick to develop database backend applications.
Ruby is nice and Python is nice too. Very similar to Perl. Although, I think the MVC model is getting old now. Time to move to .NET!
Have you tried a functional language like F# yet? I mean it’s good to use Ruby and Python but honestly I think the future lies in functional languages. You can also connect to a MySQL backend.
Programmers rule the world! Php is used to develop Facebook and Twitter. Proves the point.
Thank you for the programming post. I’m learning objective C at the moment
The programming language is too complex for me. I am now started to learn only C++ and Visual Basic. Thanks for sharing.
Great sources for fashion news and fashion articles. It’s offered many details around the relevant information. I really like this post greatly and i am likely to recommend it to my girlfriends. Brief and practical methods inside post saving time and within the searching process. It can be this type of awesome source or technique i can’t wait to attempt it. The post is completely incredible. Thank you for whatever you posted and all you could present to us!
pandora sale
links of london friendship bracelets
thomas sabo online shop
Rosetta Stone
louboutin
Thank you for sharing,it is very helpful and I really like it!
i don’t thins so
Why? he is right.
Great Article. Thanks
C’était vraiment génial et je pense que votre site est un des atouts importants. Ce n’est pas un de ces site typique que vous perdre votre temps sur.
very good article.
internette görüntülü olarak okey oyunu oyna, gerçek kisilerle tanis, turnuva heyecanini yasa.
greattt one,,,
Thanks for sharing your thoughts and ideas on this one.
i like this web blog business, home, and construction web blog
This is a discussion I for some reason end up in all the time with people in all kinds of different contexts. “Isn’t that dangerous?”. The answer I give is often “Yes, it is. But so are cars, knifes and medication”. Almost anything useful can be misused and will be misused, but we seldom do it or learn fast if we do, and in software we have unmatched undo-capabilities of all sorts.
I’m not willing to pay the price for (false) protection as long as the price is less power, especially since they are circumvented anyway. Your not supposed to change a class at runtime in Java, so to solve that, people turn to byte code weaving. Barrier broken, but at a high cost with high complexity. I much rather trust responsibility, good habits and safety nets I set up anyway to protect myself from logical mistakes.
Online UK costume and fashion jewellery shop with, Online UK costume and fashion jewellery shop with, Online UK costume and fashion jewellery shop with, Online UK costume and fashion jewellery shop with,
this is definitely a great dicussion
Image technology refers to the general category of computer applications that convert documents, illustrations, photographs, and other images into data that can be stored, distributed, accessed, and processed by computers and special-purpose workstations. Check out this update
hmm ,i’m not sure if this is what i’m looking for but anyway this is interresting and could be useful some day,thanks for taking time to write such cool stuff
Great post, looking forward to more.
You made some good factors there. I appeared on the web for the topic and located most guys will go alongside with with your site.
At the end of which, I’ll hopefully put together some kind of top ten list. A very flawed top ten list at that. I can already tell that you’ll disagree with it, because Tacos El Gordo and Las Cuatro Milpas are probably going to be at the very top and they aren’t even marked as best of the best here! Haha.
Indeed this food looks great! Mexican food in San Diego is next to the best! The traditions that come north from Mexico can not be immitated or duplicated.
The language design means much; however its importance is decreasing now.
What you’re essentially saying is that encapsulation is a bad thing because it prevents bad things and languages are good if they let you do bad things either accidently or by design. Perhaps then we should all be using assembly?
Thanks Michael Feathers for your article…very informative.. I am really in appreciative of your work.
I found the perfect place for my needs. Contains wonderful and useful messages. I have read most of them and has a lot of them. Door Lintels To me, he’s doing the great work.
Extremely good observations.
Many (language designers) make the assumption that people need to be “controlled”. Indeed, newbies do prefer a rule/recipe/formula-based learning culture and languages that impose all sorts of “safety nets” around “dangerous” things serve that group well. Until, the newbie is no longer a newbie and then the constraints become impositions.
Sadly, humans have a desire for control and power and it is easier and more convenient to assume that someone is an idiot with no choices than a person with thought and freedom. I agree that it is about responsibility, but not just responsiblity to self, but responsibility to everyone.
Freedom should mean the same thing for everyone..
Ruby seems to be a great language to write good, dynamic and safe programs. I think this language could help us develop great programs so people can easily use them without having big problems with them. I also find it great that ruby tries to reduce the mess that can be created while using this language. It really helps us to create save programs.
Great post! Nice and informative, I really enjoyed reading it and will certainly share this post with my friends . Read everything you ever wanted to know about gemstones
. I agree that it is about responsibility, but not just responsiblity to self, but responsibility to everyonehigh quality headphones new design headphones
It is excellent stuff that you have written in this blog post, i am really glad to have this stuff, I like the way you represent your thoughts. mobile signal booster
You will lose yourself in a luxurious world of fascination with the exciting elegance in the Alexander McQueen shop.
Dein Artikel ist gut wert Augapfel. Außerdem inspirierte mich sehr, sehr attraktiv ?das werde ich diese wieder zu sehen
Interesting article and ideas. I haven’t been able to learn any programming language due to lack of time, but I definitely want to get the basics of Ruby in the next two years.
Ich fühle, dass ich ein Sachverständigen auf diesem Gebiet zu einem bestimmten Zeitpunkt zu werden.
The Canada Goose jackets are lightweight, comfortable and solid. I have worn it every day and it is phenomenal. I can stay outside all day and not feel remotely cold.
ich mag diese post, vielen danke
Vielen Dank für den Austausch dieses Wissens.
Thanks a lot for sharing this with us, was a great post and very interesting
I’m still learning from you, but I’m trying to achieve my goals. I certainly enjoy reading all that is posted on your blog.Keep the information coming. I loved it!
Our good reputation online store offers a number of popular products Calvin Klein Underwear Mans Steel Trunk Flag Logo. All products is wholesale price. We offered many brand of Calvin Klein Underwear 365 Trunk Boxers, mens calvin klein underwear, calvin klein underwear, oakley sunglasses on sale, Mens Calvin Klein Underwear Cotton Briefs,adidas shoes, red bull caps, belts, our web would be the best choice. Everyone will love them. fast delivery,discount price and 100% top quality guarantee.
Language design is a pretty new area to me, but I’m slowly getting into it. Is Ruby worth the try or should I stick to other languages?
When it comes to feather dress, what appears in your mind? Which kind brand of down jacket do you like prefer? Though there are many down jackets for you to choose from, on the word, which one you really enjoy? I want to say that canada goose coats is really your best choice. I believe you can’t agree with me any more. When you take the quality into consideration, you will find that it is superior to any other kind of coat. Besides, discount canada goose jackets is a world well-known brand, which has gained high reputation in the world, which has accepted by our customers and some organization. Because of its high quality, some of our loyal customers have promoted it to the people around them. In their opinion, it is good to informing others to know it. Recently, Canada Goose Trillium Parka is on hot sale. What I have to inform you is that all the products there are made by hand, so they are elaborative and elegant enough. It is really beautiful once you dress in. So, if you are a lovely girl or woman, go to the store to buy one for you. You will appreciate it that you have such a coat.In addition, they also have any other products like canada goose Gloves and canada goose jacket supplier.Hope your will like its!
he Canada Goose jackets are lightweight, comfortable and solid. I have worn it every day and it is phenomenal. I can stay outside all day and not feel remotely cold. ensino medio campinas
I must we appreciate you your time and efforts you earn in publishing this website post. I’m hoping the same best article by you later on also. Actually your creative writing expertise has encouraged me to start out my own blog site now.
Top Listings
Anyone who values the experience and the environment will quickly see why they should always be included on a camping excursion. Online Bookmarking
They seem to have an ethic of responsibility that I don’t see in many other language cultures. best roth ira
I’ve always worried about this and thought I was just being paranoid… I never actually knew it was a real problem… The only difference I’ve ever had is when the server took less then I actually wrote down which I thought was weird. I would like to think I tip pretty good so this wouldn’t happen but I do check my receipts religiously just in case… I’ll be sure and keep this technique in mind. Goodbye Stretch marks
It would have been great if they made it. I also think it’s a shame that world of warcraft isn’t also a ps3 game, oh well, can’t have it all I’m afraid
cabernet
This is a great site with so much useful information. I will look forward to visiting it often. Thank you! portland website design
Really i am impressed from this post. The person who created this post is a genius and knows how to keep the readers connected.Thanks for sharing this with us. I found it informative and interesting. Looking forward for more updates.
bed bugs
It would have been great if they made it. I also think it’s a shame that world of warcraft isn’t also a ps3 game, oh well, can’t have it all I’m afraid applicant tracking system
It’s interesting, however, that languages like Ruby, Python, and Groovy don’t have anything similar, yet people do write solid code in those languages. Eye Creams
There are tens of thousands of applications in the world today which contain duplication that you can really only remove with the template method design pattern or by creating a tiny class which encapsulates the variation. Eye Creams
This is a spectacular article that I have really enjoyed. Hopefully I can learn more from your valuable experience. Thanks a lot for sharing this and please keep on posting more.
preventive maintenance software
I have played around with Ruby but it takes me a long time to learn anything new so I stick with what I know which is C++. Perhaps if I had more time then I could learn this as it does have some very good uses.
I normally pay people to do Ruby work for me as it can’t be difficult to get it working. Well for me anyway. Great article.
As a result, the entire community spends a lot of time on prescriptive advice and workarounds.. different types of piercings
This allows the compiler to verify such assertions and make sure that you are writing code that adheres to certain assertions you yourself make.
funny videos
What about bowling?
Let’s leave aside, for a minute, the debate over static and dynamic typing. What I think is more important is the issue of tone ira vs roth ira
Hi! just interested to know about getting a driver’s license but it’s not for motorcycle driving. I’ll be driving a four-wheels car and until now I still can’t get my license. Please I need assistance.
Shampoo Caps
Hi! just interested to know about getting a driver’s license but it’s not for motorcycle driving. I’ll be driving a four-wheels car and until now I still can’t get my license. Please I need assistance.
Karndean flooring
Let’s leave aside, for a minute, the debate over static and dynamic typing. What I think is more important is the issue of tone
Jaguar motors
They do great work, and they enjoy it. They are living proof that the nightmare scenarios that people imagine about dynamic languages aren’t inevitable.
usb publicidad
I think that those human dimensions have far more impact on software than many people suspect. Reduce Dark Circles
End this era please I’m sick of it so bad now.
They are living proof that the nightmare scenarios that people imagine about dynamic languages aren’t inevitable. You can program safe, secure, high quality applications in dynamically typed languages.. Server Rackmount
The additional price is a decreased sense of responsibility and ownership. I think that those human dimensions have far more impact on software than many people suspect. different types of volcanoes
I guess I can explain it this way. In many language communities, people are very concerned with the “right way” to do things. suboxone treatment
It’s interesting, however, that languages like Ruby, Python, and Groovy don’t have anything similar, yet people do write solid code in those languages. Paydirt
It’s really a nice and helpful piece of information.Long time no see so excellent article, and I am very interested in your article, but also very much hope you can come to visit our websiteshoppingpandora@pandora charms on sale
I never actually knew it was a real problem… The only difference I’ve ever had is when the server took less then I actually wrote down which I thought was weird. I would like to think I tip pretty good so this wouldn’t happen but I do check my receipts religiously just in case… medical coding and billing
I really like this essay. Thank you for writing it so seriously. I want to recommend it for my friends strongly. iPad to Mac Transfer can help you transfer music, movie, photo, ePub, PDF, Audiobook, Podcast and TV Show from ipad to mac freely. Web Listings
Anyone who values the experience and the environment will quickly see why they should always be included on a camping excursion. radiology technician salary
Thanks a lot for sharing this with us, was a great post and very interesting
Thank you for giving individuals a possibility ‘unusual at breathtaking to read this blog. It is really so agreeable and also full-packed with `a good time for me and my colleagues in office to the search of your website on least three times a week to examine and the last advice you will.Pest Control Memphis
good lookingninja hattori games
As a result, the entire community spends a lot of time on prescriptive advice and workarounds. And, if the language doesn’t provide all of the features needed to lock things down in the way people are accustomed to, they become irate.Animated-Valentines-Cards
It’s interesting, however, that languages like Ruby, Python, and Groovy don’t have anything similar, yet people do write solid code in those languages.Alaska Halibut Fishing
bus today, make them Cheap Beats By Dremiserable. One said: “I ??am really unlucky it! I was packed Beats By Dre Studioin the car to flow production.” One said: “I ??called Beats By Dre Soloit bad luck! In I was packed car are pregnant.Beats By Dre Pro Classic joke: I TVU A university studentbeats by dr dre caught by the enemy, the enemy tied him at the poles,just beats solo headphones purple and then asked him: say, where are you? You do not say it electrocuted! Scheap dr.dre beats studio headphones balck/yellowtudents back to the enemy a word, the result was electrocuted, he said: I am TVU.Hot sale beats by dr dre pro headphones
The Contents of this site are really very good. I hope We will get this type of contents and information from this blog in future days too. Best regards. honeymoon packages
sport tours international
Barrier broken, but at a high cost with high complexity. I much rather trust responsibility, good habits and safety nets I set up anyway to protect myself from logical mistakes. Online Business Directory
Many language designers make the assumption that people need to be “controlled”. Language is one of the important code in a designing
Very honoured to see your blog, I benefited a lot from it, and it brings me a great deal of enjoyment.
You are right and I agree with you, but i believe the point of the blog post was about the language designer saying you cannot do this because it is too dangerous.
People do it all the time, but that’s cultural knowledge. If you are in a culture, you hear about all of the things which are normal which appear odd from outside. If you aren’t, you don’t.Securities Law
The difference between the right word and the almost right word is really a large matter — it’s the difference between a lightning bug and the lightning. vacuum sealer reviews
Nice and informative post.
Doors West 1402 20th Street NW, Suite 4, Auburn 98001 (206) 772-5241 Seattle Garage Doors
Everyone should have a Mens Moncler Jackets as it is the best outwear against the cold season and is also comfortable and light to wear.
5. Having more power at your fingertips means either you will crash and burn or learn to use it!” - i agree with it.
Light Up at Onlycubes LLC is a company dedicated to serving our customers to provide with the best pricing, quick delivery, and unparalleled customer services.
Many lessons available in this article.
Dentist Carrollton 1735 Keller Springs Rd # 204, Carrollton, TX 75006-3005
Article helps more people looking for comprehensive solutions.
Seattle Electrician Service, Inc. 1500 W Bertona, Seattle, WA 98119. (206) 227-3237 Seattle Electrician
disodium phosphate|sodium phosphate dibasic
monosodium phosphate suppliers!
disodium phosphate|sodium phosphate dibasic
disodium phosphate|sodium phosphate dibasic
disodium phosphate|sodium phosphate dibasic
Ethic of responsibility.. I like the way how you make an example of this, ethics deals with values of a human with respect to good and bad of the motives toward his/her actions. We are all responsible of our actions so make it good as possible always.
Thanks a lot one more time for the useful information. Thanks for publishing these articles here and your blog.
SEO Colorado Springs Colorado Springs Search Engine Optimization
What a fabulous post this has been. I am grateful to you and expect more number of posts like these. Thank you very much.
We can do anything to keep the data safe.
In common, the usefulness and significance is overwhelming. Very substantially thanks as soon as once more and very good luck and maintain up the fantastic work!
I don’t know what to say except that I have enjoyed reading. Nice blog, I will keep visiting this blog very often.
I was happy to go, but I also felt a bit out of place. You can program safe secure high quality applications in dynamically typed languages, people do it all the time.
Luxury Fishing Lodge Alaska Kenai Riverfront Alaska fishing lodge provides salmon, halibut and trout fishing vacation packages with 1st class accommodations and Alaskan hospitality. Luxury Fishing Lodges Alaska
Most definitely i’ll store your site and even assess repeatedly these normally. I’m somewhat positive Most definitely i’ll learn about a number of unique junk in this case! I wish you all in the then!
Neutral colors like black, white, and chrome advice to accumulate the allowance bright and apple-pie looking. Contemporary chaplet lights can add the absolute blow to your allowance decor.
Very good blog post that covers a very interesting study. I was born left handed,
Oh my goodness! a tremendous article dude. Thanks Nevertheless I’m experiencing situation with ur rss . Don’t realize why Not able to join it. Is there anybody getting similar rss problem? Anyone who is mindful of kindly respond.
I completely agree with the above comment, the internet is with a doubt growing into the most important medium of communication across the globe and its due to sites like this that ideas are spreading so quickly. Looking forward to another great blog. Good luck to the author! all the best!
You made some first rate factors there. I seemed on the web for the difficulty and located most individuals will associate with together with your website.
Good Work ! time for the useful information. Thanks for publishing these articles here and your blog.
I much rather trust responsibility, good habits and safety nets I set up anyway to protect myself from logical mistakes.
Most definitely i’ll store your site and even assess repeatedly these normally. I’m somewhat positive Most definitely i’ll learn about a number of unique junk in this case! I wish you all in the then. seguro viagem internacional
You made some first rate factors there. I seemed on the web for the difficulty and located most individuals will associate with together with your website. creditos carbono
Our online shop selling high quality Pandora jewelry – charms, bracelets, beads and more! You can diy your own favorite style, perhaps you can get discount coupon code from us.
What are the critical thinking ethics learning tools to teach kids how to avoid organized crime through the course of their lives? fechaduras hotel
Yes. Yes. Yes. Thank you. I can’t stand it when people make you use “final” … just in case somebody, somewhere, was going to abuse your non-final class down the lines. Hogwash. kabbalah
Hi there! I’m at work browsing your blog from my new apple iphone! Just wanted to say I love reading your blog and look forward to all your posts! Carry on the great work! erdinger
Very good post with informative information.I really appreciate the fact that you approach these topics from a stand point.I genuinely do enjoy this great website and your content was simply fantastic. hiawassee retirement communities | murphy real estate
Riverfront Alaska fishing lodge provides salmon, halibut and trout fishing vacation packages with 1st class accommodations and Alaskan hospitality. Luxury Fishing Lodges Alaska…
nikon scopes
What are the critical thinking ethics learning tools to teach kids how to avoid organized crime through the course of their lives? online slot machines australia
Product Description The low maintenance 6000 series full facepiece respirator is light and well-balanced. Innovative lens design offers a wide field of vision. online slot machines australia
The programming language is too complex for me. I am now started to learn only C++ and Visual Basic. Thanks for sharing. sousplat de rattan
A language that PROMOTES responsibility rather than ENFORCING it . . . .now that’s a novel concept. I am glad that more cultures are emerging which provide the coder with options instead of constraints. Misuse is inevitable, but freedom breeds creativity. If we let fear guide everything we do, we will never achieve anything. espanhol intensivo
I have you bookmarked your web site to check out the brand new stuff you post.Should you’re keen on having a visitor weblog poster please reply and let me know. I will give you unique content in your website, thanks. garrafa termica
One thing that I want to state, and this is the last thing I want to comment, is that I believe too many people have stopped thinking BIG. They have no vision anymore. online slot machines australia
I loved what you’ve done here. The design is elegant, your content classy. Yet, you’ve got an edginess to what you’re offering here. Ill definitely come back for more if you keep this up. online pokies
I don’t know what to say except that I have enjoyed reading. Nice blog, I will keep visiting this blog very often. transfer ipod music video photo to computer, backup ipod, copy ipod
Thank you for giving individuals a possibility ‘unusual at breathtaking to read this blog. It is really so agreeable and also full-packed with `a good time for me and my colleagues in office to the search of your website on least three times a week to examine and the last advice you will. fechaduras hoteis
I’ve been exploring for a little bit for any high-quality articles or blog posts on this kind of area . Exploring in Yahoo I at last stumbled upon this web site…... swtor lag
the website you have created looks very good. the design of the site is good. The way you write content is also very good. Keep up the good work that you always do.
It is a very informative post and want some more information like this post.
Promotional Items Promtional Products Promotional Pens
If you are in search of nice Dr Dre Beats,our online store will be your first choice. Welcome. The Dr Dre Beats Studio is purchased by a lot of people due to its superior quality and low price. Start your shopping now! The Dr Dre Beats Tour Black is taking a large market now, so buy one at once. We accept paypal. Everybody like this world famous brand Dr Dre Beats Pro because of its finest quality but cheap price. You can order one too. Buy it quickly. More surprise are waiting for you if you order our AAA quality and cheaper price Dr Dre Beats Solo HD. Never lose this opportunity. We can supply you this most people loved Dr Dre Beats In Ear with fast delivery and free shipping. Why don’t you seize this precise chance to change your style by buying our latest Beats Studio Sale. Move your finger to log in. How can you stand still when seeing so attractive Dr Dre Beats Limited? Won’t your heart beat more fast after seeing our eyecatching Dr Dre Beats Sale Online? What are you considering? Rush to purchase!!!!We are waiting for your coming!! Beats Dr Dre are worthy owning. Well-known Dr Dre Beats Studio Black Yellow have the heights range from around the ankle to above the knee, and they are available in different colours. This Beats By Dr Dre .
With all the weblogs I’ve visited on the internet, this is the only post I have ever conclude its outstanding writing. The clarity with the article explains well the discussion. I am glad that the blogger shared this subject for the readers. I appreciated how the blogger plans its writing top quality. It can be called as being a prosperous job.
how to file bankruptcy
Online Sourcing Pai You Guo & Paiyouji from Weight Loss Online Store. Order Today – Shipped Today! Please Join us for Authentic Slimming Capsules & Diet Tea, and Bid Farewell to Obesity!
Si vous souhaitez une paire de Louboutn pas cher, vous trouverez dans notre magasin de Chaussures Louboutin.Tous les Christian Louboutin sont de haute qualite et sont maintenant en vente de 70 a 80 %.Si vous aimez vraiment 2012 Louboutin France, vous devez saisir cette chance.
As an example, consider sealed and final in C# and Java. Both of those constructs do pretty much the same thing and people do go out of their way to advise people on how they should be used to protect abstractions. It’s interesting, however, that languages like Ruby, Python, and Groovy don’t have anything similar, yet people do write solid code in those languages. online pokie games
The website you have created looks very good. the design of the site is good. The way you write content is also very good. Keep up the good work that you always do. online pokie games
It is really so agreeable and also full-packed with `a good time for me and my colleagues in office to the search of your website on least three times a week to examine and the last advice you will. best online pokies
With all the weblogs I’ve visited on the internet, this is the only post I have ever conclude its outstanding writing. The clarity with the article explains well the discussion. I am glad that the blogger shared this subject for the readers. recipes for salad
They do great work, and they enjoy it. They are living proof that the nightmare scenarios that people imagine about dynamic languages aren’t inevitable. maternity wear
Please stay us informed like this.Nature is always good for us to think about. I totally agree with you all guys Thank you for sharing. backlink dominion
matter here. The field and acceptance were right perfect. I opine that your Extraordinary accumulation. Yes, that’s just what I desirable to see! Great perspective is colorful, its retributive symptomless intellection out and rattling extraordinary to see someone who knows how to put these thoughts pile so considerably. Great job on this. Convey you! Please visit here -
latest dvd releases
The fact that it took decades for the industry to arrive at something as useful as ActiveRecord in Rails is due primarily to the attitude that some language features are just too powerful for everyone to use. www.onlinepokiegames.net.au
This is one of the good articles you can find in the net explaining everything in detail regarding the topic. I thank you for taking your time. lloyd claycomb
With dynamic languages of course we see some real danger with the “idiots” redefining the language as they like,...hey wait the C preprocessor was used to do this before :-) A few have commented on this type of abuse with Ruby. www.australianonlinepokies.net.au
The additional price is a decreased sense of responsibility and ownership. I think that those human dimensions have far more impact on software than many people suspect. www.pokiesmachines.net.au
Really i am impressed from this post. The person who created this post is a genius and knows how to keep the readers connected.Thanks for sharing this with us. I found it informative and interesting. Looking forward for more updates. laboratorio ortodoncia
I’m sure this is true in some instances – but there is another consideration – allowing the language tools to reason about your code. conos de transito
WOW, I just learned about this language recently and found this article very helpful. Thank you posting this article.
This article is actually still valid today. Anyone trying to develop an Apple application can agree that it’s like taking all the great well developed programming languages we have, time travelling backwards 20 years, and telling developers that that’s what they can use.
I’m flattened for your blogs writings and blogs as well.
I guess I have selected a mind blowing and interesting blog. ascensor
I guess I have selected a mind blowing and interesting blog. ascensor
With more than 20 years of experience, Intertech provides an extensive integrated operational ability from design to production of molds 100% made in Taiwan. Additional to our own mold making factory, we also cooperate with our team vendors to form a very strong working force in Taiwan.
For the overseas market, we work very closely with local representatives in order to take care of the technical communication and after-sales service to our customers. We also participate in the EUROMOLD & FAKUMA exhibitions and meet our customers every year in Europe. By concentrating on mold “niche markets”, we play a very useful mold maker role from the Far East whenever customers want to develop their new projects. We provide services from A to Z to our customers on a very economic cost and effect basis.
With more than 20 years of experience, Intertech provides an extensive integrated operational ability from design to production of molds 100% made in Taiwan. Additional to our own mold making factory, we also cooperate with our team vendors to form a very strong working force in Taiwan.
For the overseas market, we work very closely with local representatives in order to take care of the technical communication and after-sales service to our customers. We also participate in the EUROMOLD & FAKUMA exhibitions and meet our customers every year in Europe. By concentrating on mold “niche markets”, we play a very useful mold maker role from the Far East whenever customers want to develop their new projects. We provide services from A to Z to our customers on a very economic cost and effect basis.
languages of course we see some real danger with the “idiots” redefining the language as they like,...hey wait the C preprocessor was used to do this before :-) A few have commented on this type of abuse with Ruby. www.geschenkhexe.ch
I guess I have selected a mind blowing and interesting blog. http://strategyofgiving.com/sprint-promo-code-coupons-deals-discounts-2012-2/
I guess I have selected a mind blowing and interesting blog. http://strategyofgiving.com/sprint-promo-code-coupons-deals-discounts-2012-2/
jjfh
I am happy to find this post Very useful for me, as it contains lot of information. I Always prefer to read The Quality and glad I found this thing in you post. Thanks
Your article is most uniquely written and very informative. You got my attention by sharing your viewpoints so effectively. I agree with a lot of your content. Great quality article.
Your article is most uniquely written and very informative. You got my attention by sharing your viewpoints so effectively. I agree with a lot of your content. Great quality article.
Your article is most uniquely written and very informative. You got my attention by sharing your viewpoints so effectively. I agree with a lot of your content. Great quality article.
I wanted to thank for this great read!I really enjoyed reading. One of the more impressive blogs Ive seen. Thanks so much
I found your text very cool.
Great quality article.