Ending the Era of Patronizing Language Design 284

Posted by Michael Feathers Mon, 13 Jul 2009 18:44:00 GMT

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.

Comments

Leave a response

  1. Avatar
    Scott Bellware 28 minutes later:

    Awesome! Awesome! Awesome! Three cheers for learning culture!

  2. Avatar
    Mark Haskamp about 1 hour later:

    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 .

  3. Avatar
    Coda Hale about 1 hour later:

    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 using alias_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:

    numbers.sort { _ > _ }

    is better than this:

    Collections.sort(numbers, new Comparator<Integer>() {
        @Override
        public int compare(Integer a, Integer b) {
            return 0 - a.compareTo(b);
        }
    });
    

    But the difference isn’t due to dynamic typing or mutability.

  4. Avatar
    Niclas Nilsson about 1 hour later:

    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

  5. Avatar
    Leo Bushkin about 3 hours later:
    “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”

    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.

  6. Avatar
    Luca Minudel about 3 hours later:

    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 ?

  7. Avatar
    Glenn Vanderburg about 4 hours later:

    Wonderful. My response got a little long for a comment box, though: http://is.gd/1xCPq

  8. Avatar
    mark about 4 hours later:

    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.

  9. Avatar
    WTF about 6 hours later:

    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.

  10. Avatar
    T. Powell about 6 hours later:

    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.

  11. Avatar
    Keith Braithwaite about 7 hours later:

    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.

  12. Avatar
    Ward Bell about 8 hours later:

    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.

  13. Avatar
    Robert about 9 hours later:

    If you want to see advice on language style in the Ruby community, try googling “monkeypatching ruby”.

  14. Avatar
    Samuel A. Falvo II about 9 hours later:

    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.

  15. Avatar
    kdfjkla about 12 hours later:

    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)

  16. Avatar
    Aslam Khan about 13 hours later:

    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

  17. Avatar
    Tom about 13 hours later:

    +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.

  18. Avatar
    Guy Murphy about 15 hours later:

    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”.

  19. Avatar
    Pattern-chaser about 15 hours later:

    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”

  20. Avatar
    Magice about 19 hours later:

    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.

  21. Avatar
    Michael Feathers about 19 hours later:

    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.

  22. Avatar
    Jason Orendorff about 21 hours later:

    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.

  23. Avatar
    Hans about 24 hours later:

    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?

  24. Avatar
    Laurent 1 day later:

    Michael,

    Reading this, I immediately though of Dijkstra’s “Go To Statement Considered Harmful”.

    Are you saying that you disagree with that?

  25. Avatar
    Wedge 1 day later:

    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.

  26. Avatar
    Michael Feathers 1 day later:

    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.

  27. Avatar
    0ffh 1 day later:

    yup: the programmer can fix the language, but the language cannot fix the programmer =)

  28. Avatar
    0ffh 1 day later:

    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).

  29. Avatar
    Michael Feathers 2 days later:

    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.

  30. Avatar
    Steve Py 2 days later:

    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.

  31. Avatar
    PeterC 4 days later:

    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.

  32. Avatar
    Grubert 9 days later:

    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! :)

  33. Avatar
    http://tradeskillsllc.blogspot.com 10 days later:

    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

  34. Avatar
    artsrc 14 days later:

    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.

  35. Avatar
    Samuel A. Falvo II 29 days later:

    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.

  36. Avatar
    Roxy and Elsewhere about 1 month later:

    “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.

  37. Avatar
    PFar 2 months later:

    @”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.

  38. Avatar
    PFar 2 months later:

    @Michael. Brilliant blog post by the way. Well done.

  39. Avatar
    PT 3 months later:

    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!)

  40. Avatar
    loz 3 months later:

    ?????

  41. Avatar
    FLV extractor 9 months later:

    ???? ...........

  42. Avatar
    parça TL kontör 9 months later:

    I like This site! Thank you for your information

  43. Avatar
    magice 10 months later:

    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.

  44. Avatar
    guy who hates blanket rules 10 months later:

    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.

  45. Avatar
    Sten 11 months later:

    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.

  46. Avatar
    jewellery 11 months later:

    I surfed here through Google! Great job.

  47. Avatar
    latin shoes 11 months later:

    Thanks for sharing the information.It is definitely going to help me some time

  48. Avatar
    cheap vps about 1 year later:

    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

  49. Avatar
    Power Protection about 1 year later:

    very thankful for your great information

  50. Avatar
    promtional items about 1 year later:

    Promotional gifts and promotional items UK supplier:

  51. Avatar
    uyes about 1 year later:

    If you want to see advice on language style in the Ruby community, try googling “monkeypatching ruby”. http://facebook Nicarbazin

  52. Avatar
    bag manufacturer about 1 year later:

    l the time, but that’s cultural knowledge. If you are in a culture, you hear

  53. Avatar
    [url=http://www.outletmoncler.com]Moncler outlet[/url] about 1 year later:

    If you are in a culture, you hear

  54. Avatar
    [url=http://www.outletmoncler.com]Moncler outlet[/url] about 1 year later:

    If you are in a culture, you hear

  55. Avatar
    Middle East jobs about 1 year later:

    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.

  56. Avatar
    Rangemaster 110 about 1 year later:

    I ended browsing your blog along

  57. Avatar
    iPad video converter for Mac about 1 year later:

    iPad video converter for Mac is a professional converter for iPad.

  58. Avatar
    iPad to iPad transfer about 1 year later:

    iPad transfer can move the iPad stuff.

  59. Avatar
    Cheap golf Gloves about 1 year later:

    Very useful post, I like it very much. Thanks.

  60. Avatar
    bestcookingrecipes about 1 year later:

    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.

  61. Avatar
    eczema natural treatment about 1 year later:

    It’s easy to create a mess but not so easy to clean it up after, very insightful post

  62. Avatar
    chanel store about 1 year later:

    Very pleased that the article is what I want! Thank you

  63. Avatar
    joanancutie2003@hotmail.com about 1 year later:

    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 :

  64. Avatar
    discount moncler coat and jerseys about 1 year later:

    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 :

  65. Avatar
    www.wonderfulorder.com about 1 year later:

    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 :

  66. Avatar
    Dog bark collar about 1 year later:

    What are the critical thinking ethics learning tools to teach kids how to avoid organized crime through the course of their lives?

  67. Avatar
    animal flip flops about 1 year later:

    totally agree…great post indeed…things never heard before…and thanks to your article..;)..keep the great job up;)

  68. Avatar
    Colorado Daycare Grants about 1 year later:

    Nice article on programming languages.

  69. Avatar
    Pandora about 1 year later:

    While reading through the second bdd example I realized that this was not intended, but distracted me while reading the first one a bit.

  70. Avatar
    Iran about 1 year later:

    Great post – it’s always nice to get some hints and tips. Iran

  71. Avatar
    Medical Technicians about 1 year later:

    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

  72. Avatar
    libertarianism is an immature fantasy about 1 year later:

    “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.

  73. Avatar
    antique aircraft parts about 1 year later:

    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.

  74. Avatar
    http://www.blacktowhiteiphone4.com about 1 year later:

    Today I have done a camera shootout with the white iPhone 4, the iPhone 3Gs and the iPhone 3G.

  75. Avatar
    Billy L. about 1 year later:

    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.

  76. Avatar
    Silicone Molding about 1 year later:

    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.

  77. Avatar
    Sandra about 1 year later:

    I think that OOP and design Provillus patterns are not all that essential when you’ve got first class functions, closures and dynamic typing.

  78. Avatar
    Rosemead Heating about 1 year later:

    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.

  79. Avatar
    moncler about 1 year later:

    thanks for Moncler Jackets || Christian louboutin UK || Moncler coats || Christian louboutin shoes || Christian louboutin pumps your post!

  80. Avatar
    Jade about 1 year later:

    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

  81. Avatar
    incontinence products about 1 year later:

    Nice post. Its really worth to share and spread.
    Incontinence products

  82. Avatar
    accounting services about 1 year later:

    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

  83. Avatar
    Richard about 1 year later:

    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.

  84. Avatar
    iPad to mac transfer about 1 year later:

    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.

  85. Avatar
    iPhone Contacts Backup For Mac about 1 year later:

    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.

  86. Avatar
    news about 1 year later:

    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

  87. Avatar
    vendita computer about 1 year later:

    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

  88. Avatar
    Tenant Screening about 1 year later:

    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.

  89. Avatar
    Tenant Screening about 1 year later:

    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.

  90. Avatar
    stella about 1 year later:

    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

  91. Avatar
    Grace about 1 year later:

    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

  92. Avatar
    Criminal Records about 1 year later:

    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.

  93. Avatar
    Criminal Records about 1 year later:

    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.

  94. Avatar
    Cindy about 1 year later:

    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

  95. Avatar
    Download Software For about 1 year later:

    Very nice tips

  96. Avatar
    yasha about 1 year later:

    “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.

  97. Avatar
    cable ties about 1 year later:

    thanks for sharing! fantastic blog.

  98. Avatar
    meequityloans about 1 year later:

    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.

  99. Avatar
    Sunglass about 1 year later:

    Buy $10 Replica Designer Sunglasses with 3-day FREE SHIPPING

  100. Avatar
    armani sunglasses about 1 year later:

    good post, come on !!!!!! waiting for the new one from you !!!!!!!1

  101. Avatar
    Yalova Emlak about 1 year later:

    Thank you very much for this article and blog.I like its and as to me it’s good job.

  102. Avatar
    how to get accepted about 1 year later:

    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.

  103. Avatar
    denley about 1 year later:

    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

  104. Avatar
    pick up truck racks about 1 year later:

    Hi michael, I used to read a lot of articles for many years. But I think your writing style is the best ever!

  105. Avatar
    fhamortgageleads about 1 year later:

    I almost give up to find the article that educated me.Finally I found this one.Thak god this is the best ever.

  106. Avatar
    mortgagerefinanceleads about 1 year later:

    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.

  107. Avatar
    mortgagerefinanceleads about 1 year later:

    Product Description The low maintenance 6000 series full facepiece respirator is light and well-balanced. Innovative lens design offers a wide field of vision.

  108. Avatar
    mdr513h about 1 year later:

    How can I recommend this article to my friend? this is the best one,

  109. Avatar
    mdr513hbuy about 1 year later:

    Hi there, this one is very help me to design the idea what I want to do.Thank a lot.

  110. Avatar
    wimutti about 1 year later:

    If you feel empty inside this web would help. Thnak you so much.

  111. Avatar
    parker7726 about 1 year later:

    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

  112. Avatar
    Parkour Training about 1 year later:

    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.

  113. Avatar
    Dory about 1 year later:

    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

  114. Avatar
    Doris Compton about 1 year later:

    I’ve used a bit of Ruby on Rails, it’s pretty quick to develop database backend applications.

  115. Avatar
    Samson Wright about 1 year later:

    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!

  116. Avatar
    Craig White about 1 year later:

    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.

  117. Avatar
    Nestle White about 1 year later:

    Programmers rule the world! Php is used to develop Facebook and Twitter. Proves the point.

  118. Avatar
    Sell IPhone about 1 year later:

    Thank you for the programming post. I’m learning objective C at the moment

  119. Avatar
    cordless drill reviews about 1 year later:

    The programming language is too complex for me. I am now started to learn only C++ and Visual Basic. Thanks for sharing.

  120. Avatar
    jewellery88 about 1 year later:

    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

  121. Avatar
    Big pony about 1 year later:

    Thank you for sharing,it is very helpful and I really like it!

  122. Avatar
    daemon about 1 year later:

    i don’t thins so

  123. Avatar
    Photoshop CS5 Serial Number about 1 year later:

    Why? he is right.

  124. Avatar
    Beton Amprentat about 1 year later:

    Great Article. Thanks

  125. Avatar
    Denas about 1 year later:

    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.

  126. Avatar
    okey oyunu oyna about 1 year later:

    very good article.

    internette görüntülü olarak okey oyunu oyna, gerçek kisilerle tanis, turnuva heyecanini yasa.

  127. Avatar
    business furniture and construction about 1 year later:

    greattt one,,,

    Thanks for sharing your thoughts and ideas on this one.

    i like this web blog business, home, and construction web blog

  128. Avatar
    Nose Job Recovery about 1 year later:

    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.

  129. Avatar
    Jewellery about 1 year later:

    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,

  130. Avatar
    lose thigh about 1 year later:

    this is definitely a great dicussion

  131. Avatar
    Kevin Hardaway about 1 year later:

    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

  132. Avatar
    cookies gift baskets about 1 year later:

    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

  133. Avatar
    mark quinones about 1 year later:

    Great post, looking forward to more.

  134. Avatar
    creation site internet haute savoie about 1 year later:

    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.

  135. Avatar
    Freshersworld about 1 year later:

    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.

  136. Avatar
    IT jobs about 1 year later:

    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.

  137. Avatar
    hyip monitoring over 2 years later:

    The language design means much; however its importance is decreasing now.

  138. Avatar
    what does it mean when you dream about someone over 2 years later:

    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?

  139. Avatar
    Pariuri Live over 2 years later:

    Thanks Michael Feathers for your article…very informative.. I am really in appreciative of your work.

  140. Avatar
    immobilien münchen over 2 years later:

    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.

  141. Avatar
    rhinoplasty healing over 2 years later:

    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..

  142. Avatar
    koi und teich over 2 years later:

    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.

  143. Avatar
    Crystal Jewellery over 2 years later:

    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

  144. Avatar
    beats by dre store over 2 years later:

    . I agree that it is about responsibility, but not just responsiblity to self, but responsibility to everyonehigh quality headphones new design headphones

  145. Avatar
    mobile signal booster over 2 years later:

    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

  146. Avatar
    Jackson over 2 years later:

    You will lose yourself in a luxurious world of fascination with the exciting elegance in the Alexander McQueen shop.

  147. Avatar
    Chanel Geldbörse over 2 years later:

    Dein Artikel ist gut wert Augapfel. Außerdem inspirierte mich sehr, sehr attraktiv ?das werde ich diese wieder zu sehen

  148. Avatar
    baba over 2 years later:

    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.

  149. Avatar
    chanel Cambon over 2 years later:

    Ich fühle, dass ich ein Sachverständigen auf diesem Gebiet zu einem bestimmten Zeitpunkt zu werden.

  150. Avatar
    Phoebe over 2 years later:

    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.

  151. Avatar
    billige chanel Tasche over 2 years later:

    ich mag diese post, vielen danke

  152. Avatar
    Prada Handtasche over 2 years later:

    Vielen Dank für den Austausch dieses Wissens.

  153. Avatar
    cooltasche over 2 years later:

    Thanks a lot for sharing this with us, was a great post and very interesting

  154. Avatar
    Coban over 2 years later:

    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!

  155. Avatar
    calvin klein underwear over 2 years later:

    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.

  156. Avatar
    pinkie over 2 years later:

    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?

  157. Avatar
    canada goose coat over 2 years later:

    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!

  158. Avatar
    HI over 2 years later:

    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

  159. Avatar
    HI over 2 years later:

    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

  160. Avatar
    HI over 2 years later:

    Anyone who values the experience and the environment will quickly see why they should always be included on a camping excursion. Online Bookmarking

  161. Avatar
    best roth ira over 2 years later:

    They seem to have an ethic of responsibility that I don’t see in many other language cultures. best roth ira

  162. Avatar
    http://farewellstretchmarks.wordpress.com/ over 2 years later:

    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

  163. Avatar
    HI over 2 years later:

    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

  164. Avatar
    HI over 2 years later:

    This is a great site with so much useful information. I will look forward to visiting it often. Thank you! portland website design

  165. Avatar
    HI over 2 years later:

    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

  166. Avatar
    HI over 2 years later:

    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

  167. Avatar
    http://allabouteyecreams.blogspot.com/ over 2 years later:

    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

  168. Avatar
    http://allabouteyecreams.blogspot.com/ over 2 years later:

    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

  169. Avatar
    HI over 2 years later:

    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

  170. Avatar
    http://18vcordlessdrillreviews.com/ over 2 years later:

    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.

  171. Avatar
    <a href="http://www.tenspainrelief.com/tens-unit">Tens Units</a> over 2 years later:

    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.

  172. Avatar
    http://typesofpiercings.org/ over 2 years later:

    As a result, the entire community spends a lot of time on prescriptive advice and workarounds.. different types of piercings

  173. Avatar
    http://www.vidaddict.com over 2 years later:

    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

  174. Avatar
    Ashley Bowling over 2 years later:

    What about bowling?

  175. Avatar
    ira vs roth ira over 2 years later:

    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

  176. Avatar
    HI over 2 years later:

    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

  177. Avatar
    HI over 2 years later:

    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

  178. Avatar
    HI over 2 years later:

    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

  179. Avatar
    http://www.memoriasusb.org.es over 2 years later:

    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

  180. Avatar
    http://www.darkcircleshq.com/options-to-reduce-dark-circles-under-eyes/ over 2 years later:

    I think that those human dimensions have far more impact on software than many people suspect. Reduce Dark Circles

  181. Avatar
    bumps over 2 years later:

    End this era please I’m sick of it so bad now.

  182. Avatar
    Server Rackmount over 2 years later:

    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

  183. Avatar
    http://typesofvolcanoes.org/ over 2 years later:

    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

  184. Avatar
    http://subutexdoctors.org/suboxone-treatment/ over 2 years later:

    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

  185. Avatar
    http://www.eurekajoes.com over 2 years later:

    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

  186. Avatar
    shoppingpandora over 2 years later:

    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

  187. Avatar
    medical coding and billing over 2 years later:

    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

  188. Avatar
    hi over 2 years later:

    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

  189. Avatar
    radiology technician salary over 2 years later:

    Anyone who values the experience and the environment will quickly see why they should always be included on a camping excursion. radiology technician salary

  190. Avatar
    Chanel Set online over 2 years later:

    Thanks a lot for sharing this with us, was a great post and very interesting

  191. Avatar
    Pest Control Memphis over 2 years later:

    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

  192. Avatar
    ninja hattori games over 2 years later:

    good lookingninja hattori games

  193. Avatar
    http://animated-valentines-cards.com/ over 2 years later:

    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

  194. Avatar
    http://www.profish-n-sea.com/seward_alaska_halibut_fishing.asp over 2 years later:

    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

  195. Avatar
    Cheap Beats By Dre over 2 years later:

    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

  196. Avatar
    sa over 2 years later:
    It’s really a nice and helpful piece of information.Long time no see so excellent article
    • thanh lap doanh nghiep
    • thanh lap cty
    • thành l?p doanh nghi?p
    • dich vu ke toan
    • d?ch v? k? toán
    • bao cao thue
    • báo cáo thu?
  197. Avatar
    sa over 2 years later:
    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
    • tu van thanh lap cong ty
    • thành l?p công ty
    • thanh lap cong ty
    • thanh lap cong ty tnhh
    • D?ch v? thành l?p công ty
    • Dich vu thanh lap cong ty
    • D?ch v? thành l?p doanh nghi?p
    • dich vu thanh lap doanh nghiep
    • cach thanh lap cong ty
    • thanh lap cong ty co phan
    • qui trinh thanh lap cong ty
    • dieu kien thanh lap cong ty dai ly thue ??i lý thu?
    • dang ky kinh doanh
  198. Avatar
    optimizacija over 2 years later:

    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

  199. Avatar
    Online Business Directory over 2 years later:

    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

  200. Avatar
    Bankruptcy Seattle over 2 years later:

    Many language designers make the assumption that people need to be “controlled”. Language is one of the important code in a designing

  201. Avatar
    Polo Outlet Online over 2 years later:

    Very honoured to see your blog, I benefited a lot from it, and it brings me a great deal of enjoyment.

  202. Avatar
    Rug Cleaning Melbourne over 2 years later:

    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.

  203. Avatar
    Securities Law over 2 years later:

    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

  204. Avatar
    vacuum sealer reviews over 2 years later:

    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

  205. Avatar
    http://www.doorswest.net over 2 years later:

    Nice and informative post.

    Doors West 1402 20th Street NW, Suite 4, Auburn 98001 (206) 772-5241 Seattle Garage Doors

  206. Avatar
    Womens Moncler Jackets over 2 years later:

    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.

  207. Avatar
    Up Light over 2 years later:

    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.

  208. Avatar
    Dentist Carrollton over 2 years later:

    Many lessons available in this article.

    Dentist Carrollton 1735 Keller Springs Rd # 204, Carrollton, TX 75006-3005

  209. Avatar
    Seattle Electrician over 2 years later:

    Article helps more people looking for comprehensive solutions.

    Seattle Electrician Service, Inc. 1500 W Bertona, Seattle, WA 98119. (206) 227-3237 Seattle Electrician

  210. Avatar
    http://www.china-phosphate.com/Products/Disodium-Phosphate-DSP.htm over 2 years later:

    disodium phosphate|sodium phosphate dibasic

  211. Avatar
    http://www.china-phosphate.com/Products/Monosodium-Phosphate-MSP.htm over 2 years later:

    monosodium phosphate suppliers!

  212. Avatar
    http://www.china-phosphate.com/Products/Disodium-Phosphate-DSP.htm over 2 years later:

    disodium phosphate|sodium phosphate dibasic

  213. Avatar
    http://www.china-phosphate.com/Products/Disodium-Phosphate-DSP.htm over 2 years later:

    disodium phosphate|sodium phosphate dibasic

  214. Avatar
    http://www.china-phosphate.com/Products/Disodium-Phosphate-DSP.htm over 2 years later:

    disodium phosphate|sodium phosphate dibasic

  215. Avatar
    Commercial Glass Tinting over 2 years later:

    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.

  216. Avatar
    SEO Colorado Springs over 2 years later:

    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

  217. Avatar
    schwinn recumbent exercise bike over 2 years later:

    What a fabulous post this has been. I am grateful to you and expect more number of posts like these. Thank you very much.

  218. Avatar
    Backup iphone sms over 2 years later:

    We can do anything to keep the data safe.

  219. Avatar
    reclaim care home fees over 2 years later:

    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!

  220. Avatar
    ljubavni stihovi over 3 years later:

    I don’t know what to say except that I have enjoyed reading. Nice blog, I will keep visiting this blog very often.

  221. Avatar
    http://www.soldotnalodge.com over 3 years later:

    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

  222. Avatar
    michael kors over 3 years later:

    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!

  223. Avatar
    swarovski crystal engagement rings over 3 years later:

    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.

  224. Avatar
    lipozene over 3 years later:

    Very good blog post that covers a very interesting study. I was born left handed,

  225. Avatar
    xbox forums over 3 years later:

    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.

  226. Avatar
    search engine marketing singapore over 3 years later:

    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!

  227. Avatar
    hosting over 3 years later:

    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.

  228. Avatar
    Alimentacao over 3 years later:

    Good Work ! time for the useful information. Thanks for publishing these articles here and your blog.

  229. Avatar
    hcg wholesale over 3 years later:

    I much rather trust responsibility, good habits and safety nets I set up anyway to protect myself from logical mistakes.

  230. Avatar
    seguro viagem internacional over 3 years later:

    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

  231. Avatar
    creditos carbono over 3 years later:

    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

  232. Avatar
    pandora like charm bracelets over 3 years later:

    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.

  233. Avatar
    fechaduras hotel over 3 years later:

    What are the critical thinking ethics learning tools to teach kids how to avoid organized crime through the course of their lives? fechaduras hotel

  234. Avatar
    kabbalah over 3 years later:

    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

  235. Avatar
    erdinger over 3 years later:

    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

  236. Avatar
    Anson Ansel over 3 years later:

    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

  237. Avatar
    nikon scopes over 3 years later:

    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

  238. Avatar
    online slot machines australia over 3 years later:

    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

  239. Avatar
    online slot machines australia over 3 years later:

    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

  240. Avatar
    sousplat de rattan over 3 years later:

    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

  241. Avatar
    espanhol intensivo over 3 years later:

    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

  242. Avatar
    garrafa termica over 3 years later:

    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

  243. Avatar
    online slot machines australia over 3 years later:

    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

  244. Avatar
    online pokies over 3 years later:

    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

  245. Avatar
    iPod Computer Transfer over 3 years later:

    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

  246. Avatar
    fechaduras hoteis over 3 years later:

    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

  247. Avatar
    swtor lag over 3 years later:

    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

  248. Avatar
    how do you get rid of a black eye over 3 years later:

    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.

  249. Avatar
    http://www.promoprods.co.uk/ over 3 years later:

    It is a very informative post and want some more information like this post.

    Promotional Items Promtional Products Promotional Pens

  250. Avatar
    dr dre studio sale over 3 years later:

    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 .

  251. Avatar
    filing for bankruptcy over 3 years later:

    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

  252. Avatar
    pai you guo over 3 years later:

    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!

  253. Avatar
    http://www.cl-france.com/ over 3 years later:

    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.

  254. Avatar
    online pokie games over 3 years later:

    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

  255. Avatar
    online pokie games over 3 years later:

    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

  256. Avatar
    best online pokies over 3 years later:

    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

  257. Avatar
    recipes for salad over 3 years later:

    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

  258. Avatar
    maternity wear over 3 years later:

    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

  259. Avatar
    backlink dominion over 3 years later:

    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

  260. Avatar
    http://ingenieroambiental.com/index.php?pagina=3946 over 3 years later:

    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

  261. Avatar
    www.onlinepokiegames.net.au over 3 years later:

    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

  262. Avatar
    lloyd claycomb over 3 years later:

    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

  263. Avatar
    www.australianonlinepokies.net.au over 3 years later:

    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

  264. Avatar
    www.pokiesmachines.net.au over 3 years later:

    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

  265. Avatar
    laboratorio ortodoncia over 3 years later:

    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

  266. Avatar
    conos de transito over 3 years later:

    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

  267. Avatar
    MindBOX SEO over 3 years later:

    WOW, I just learned about this language recently and found this article very helpful. Thank you posting this article.

  268. Avatar
    Stock Market over 3 years later:

    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.

  269. Avatar
    <a href="http://www.otis.com/site/es-esl/Pages/AscensoresOtis.aspx">ascensor</a> over 3 years later:

    I’m flattened for your blogs writings and blogs as well.

  270. Avatar
    ascensor over 3 years later:

    I guess I have selected a mind blowing and interesting blog. ascensor

  271. Avatar
    ascensor over 3 years later:

    I guess I have selected a mind blowing and interesting blog. ascensor

  272. Avatar
    Mold Making over 3 years later:

    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.

  273. Avatar
    Silicone Molding over 3 years later:

    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.

  274. Avatar
    www.geschenkhexe.ch over 3 years later:

    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

  275. Avatar
    margiewatson4@gmail.com. over 3 years later:

    I guess I have selected a mind blowing and interesting blog. http://strategyofgiving.com/sprint-promo-code-coupons-deals-discounts-2012-2/

  276. Avatar
    margiewatson4@gmail.com over 3 years later:

    I guess I have selected a mind blowing and interesting blog. http://strategyofgiving.com/sprint-promo-code-coupons-deals-discounts-2012-2/

  277. Avatar
    Moncler Salg over 3 years later:

    jjfh

  278. Avatar
    tita over 3 years later:

    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

  279. Avatar
    surya over 3 years later:

    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.

  280. Avatar
    surya over 3 years later:

    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.

  281. Avatar
    surya over 3 years later:

    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.

  282. Avatar
    raihan over 3 years later:

    I wanted to thank for this great read!I really enjoyed reading. One of the more impressive blogs Ive seen. Thanks so much

  283. Avatar
    CRIACAO DE SITES over 3 years later:

    I found your text very cool.

  284. Avatar
    iphone parts wholesale over 3 years later:

    Great quality article.

Comments