Here's an example in ruby:
(1...10).each{ |x| print x }
Tell me, does the 10 print or not? You'll need a second glance plus a good memory to answer that question.Here's the same code in C++:
for (int x = 1; x < 10; x++)
cout << x;
Verbosity makes it easier for the non-you programmer to look at a random piece of code and decipher it. You feel smarter for having written that Ruby code (and the C++ is boring, I'll agree). But I'm gonna have to say the Ruby code has less readability outright just because it's so dense.The 10 doesn't print, btw.
for x in range(10): print x
irb(main):001:0> (1..10).max
=> 10
irb(main):002:0> (1...10).max
=> 9
Ruby suffers from a bit of Perl-syndrome, and relies too much on magic syntax and "conventions" created by library authors. It's a nice language and all, but I still prefer Python over Ruby since Python is a simple, clean and elegant language with just a small number of elegant concepts. >>> range(1,10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Leaving out the starting value starts at zero: >>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Which is like dotimes: [1]> (dotimes (i 10) (format t "~d" i))
0123456789
NIL
There's an implied "less than the supplied high value" in all cases.In my day job, the ultimate argument was hiring a new graduate who was writing good production code in the LFSP on his second day. An LFSP lets you create a language that fits the problem domain nicely. This works both in normal companies and in startups.
If you're saying that startups can prove the value of an LFSP by being successful with it, I agree. If you're saying that doing a project as a startup eliminates the risk of having code that is hard for someone else to maintain, then I disagree. There are plenty of reasons why a startup might need to find someone capable of working within their codebase.