I will concede that there is a culture of trying to be a bit too clever on the k4 mailing list but it's perfectly possible to write maintainable code in kdb+
I will concede that there is a culture of trying to be a bit too clever on the k4 mailing list but it's perfectly possible to write maintainable code in kdb+
I'm guessing that best way to address this issue is through liberal use of explanatory comments.
There is no reason not to use camel cased variable names and indent functions, if/else blocks etc, and when written this way the code can be perfectly legible even to non q programmers.
Something else that leads people into the write-only trap is that the usual way of working with the language is to use the REPL loop while working, where you can tend to be doing multiple things on 1 line. It's just laziness not to reformat and clean up the code afterwards though.
There is: it makes the program bigger. Program source code length is significant, and if you have more lines, you have more opportunities for bugs.
Compiler errors do. But you catch those first run.
If tab vs 2 spaces vs 3 spaces can induce a logic error that is a purposely obtuse language.
Bugs do hide in variable names and whitespace.
thisIsALongVariableName = True
thisIsaLongVariableName = True
is easy to spot when they're side-by-side, but not so much when they're two pages away from each other. Python's tabs and spaces can confuse the indention in cases so that code that "looks" aligned actually isn't.If you haven't run into a problem caused by a typo, you haven't been programming long enough.
Typos affect everyone. It is not a function of the language that causes you to mistype. It is that the program is long and you cannot see the whole thing that causes you to miss it.
> Is it the case of K, Q or whatever its name is?
{foo}[] generates an error because foo is unbound. What's the difference between {foox} and {fooy}? They both might be variables, and yet it is only by reading the program that you can tell which one is correct.
In any language with mandatory variable declaration the code wouldn't even compile. And any decent IDE would even flag this while writing the code.
Nonsense. memmove and memcpy are both defined, and if you choose the wrong one your program compiles and runs, but it simply produces the wrong result.
> And any decent IDE would even flag this while writing the code.
There is no IDE that will flag this. Advanced whole-program static analysis has a hard time with this problem and I'm not aware of any general solutions.
Long variable names may take more characters, but there is no way they increase bugs.
Indenting(!) doesn't even take many more characters if you use tabs...
Mathematics notation is so notoriously awful that mathematicians often can't even read equations from other disciplines without significant extra context.
- you need to write same variable name on each step of derivation of a formula
- paper and blackboards don't have autocomplete
- juxtaposition is used for multiplication, thus SwapBlue can be Swap times Blue or a single variable called SwapBlue, spacing for multiplication is not a good solution when writing to board/paper
Edit, see http://mathoverflow.net/questions/8295/origins-of-mathematic... for the confusion this causes..
No, it's not supposed to be a joke.
Steve McConnell 1993 observed density is proportional to source program length, so this should be obvious to every programmer: If a small program (as measured in source code bytes) is more likely to be a correct program, then this follows.
A major issue with discussing programming is the sheer number of people who believe they know how to program, when any non-programmer could see quite obviously that they don't: A professional bridge-builder doesn't often fail to build a bridge, but a professional CMS programmer seems to unable to get much past hello world without a bug or two; Less code will therefore produce less bugs.
There is a summary of his advice here[1], but just to highlight
Describe everything the routine does And we mean literally everything. If that makes the name ridiculously long, the name isn't the problem. Your routine is.
And
Make names as long as necessary According to McConnell, the optimum name length for a variable is 9 to 15 characters; routines tend to be more complex and therefore deserve longer names. Make your names as long as they need to be in order to make them understandable.
I've read McConnell, and your claims are so completely the opposite of what he recommends that I'm still unconvinced you aren't trolling.
[1] https://blog.codinghorror.com/i-shall-call-it-somethingmanag...
"A study from Basili and Perricone found that routine size was inversely correlated with errors: as the size of routines increased (up to 200 lines of code), the number of errors per line decreased (Basili and Perricone 1984).
And the conclusion (on page 174): …None of the studies that reported decreased cost, decreased error rates, or both with larger routines distinguished among sizes larger than 200 lines, and you're bound to run into an upper limit of understandability as you pass 200 lines of code
With that in mind, consider that KDB's SQL92 interface is 35 lines (the parser is 14 lines). It may be an extreme example of what McConnell is observing, and yet was himself unable to learn from.
> I'm still unconvinced you aren't trolling.
Look at it this way: Here is software that is faster than what you can write (or maybe you want to write your own taxi problem implementation), and if you don't try hard, you will miss out in finding out how to do something that you can't do.
That downvote button is so easy, that internet person is just a troll, I've been programming for ages, so of course I know what I'm talking about, but if you look through my comment history, you might find it easier to convince yourself at least that I believe that program length matters and permit yourself a discussion about it. You might learn something.
* https://news.ycombinator.com/item?id=8476294
* https://news.ycombinator.com/item?id=8477064
* https://news.ycombinator.com/item?id=10872209
and so on.
I find it difficult to agree that using non-representative names for variables or functions improves understadability.
Notably, using something like x to represent a meaningful value means the brain has to hold the mapping between the two, which will decrease the number of useful pieces of information kept in short term memory[1].
The brain doesn't keep track of the number of characters in a variable name.
[1] http://www.psych.utoronto.ca/users/peterson/psy430s2001/Mill...
The issue, for me, is not readability but context. Even a word or two (e.g. cuts, begins, dims) helps greatly to establish the context of the code. Like having a map before hiking.
A comment can clearly provide that context without making the variable names long.
[1]: https://news.ycombinator.com/item?id=8747314
> The brain doesn't keep track of the number of characters in a variable name.
Surely you must appreciate that if we use too many characters the window will scroll?
as your opponent has mentioned, context is the key. you operate with objects in your brain, and the faster the transition from code element to the brain object, the better you understand the code. long names make this lookup unnecessarily difficult.
The "characters to clever/unmaintainable" ratios you achieve with k (which most kdb+ platforms end up reaching for at some point) are almost unparalleled. A famous example of how awesome/powerful/ridiculous k can be is the "4 lines of K" text editor: http://www.kparc.com/$/edit.k
I guess my point is that letting your guard down, for even a single line, can be orders of magnitude more trouble than it would be in most languages and for that reason I wouldn't base a new stack on it. Also, the developers for it are rare-ish and expensive + it has a serious learning curve for those unfamiliar with FP or Lisp.
Or do those single character tokens have special meanings in k? Which would be even worse.
It can seem that way, but there is value in dense programs: They take up less room on the screen. This means you can see where you repeat yourself, and can often find bugs by just reading your code.
I can't count the number of times I scrolled over some code and missed a bug.