The Worst Programming Environment in the World?
github.com
github.com
"BANCStar actually came with a "screen generator" that was supposed to be used to construct applications. But the 5.1c version of the generator was so limited that experienced programmers soon began to pry off the covers and modify directly the intermediate code that the run-time module actually executed."
All of the numbers you're looking at are an object code for a VM that (apparently) allowed for user-defined screens in the BancStar product. Programmers found themselves reverse-engineering the meanings of the different numbers and began to build the text-format object-code by hand.
This doesn't appear to have ever been intended to be a programming environment in this form.
30001000: 55
30001001: 8b ec
30001003: 6a ff
30001005: 68 90 10 00 30
3000100a: 68 91 dc 4c 30"
When it's just x86 and nobody is supposed to be using it directly. Of course, we have workable tools that sit on top of machine code so we don't have to, and apparently that wasn't the case for OP, but I think that's more of a statement about their inability to do the one thing makes progress in computing possible: create abstractions.
People of course still do write assembler directly (but not as much as they used to!), but I don't think many have written machine code directly for a while. (Maybe for some specialized hardware?).
But yeah, it's good to note that this underlying sort of vm code wasn't intended to be written by humans... but I wouldn't say the customers were wrong, exactly, to successfully use it to do high business value things with the product they were locked into, that they couldn't otherwise.
It does make one think how happy the customers would have been if the vendor had provided an actually intended fleible scripting or 'macro' language, and then to think about the aspects of the market that still didn't lead to the vendor doing so.
Source: I know someone personally who worked at NFCS on BancSTAR.
I assume either the transition was too gradual so nobody quite realized the absurdity to a sufficient degree, or everyone was too busy running around with hair on fire getting the day's tasks done to spend any time on long-term improvement, or management forbade it as a waste of time. I'm curious which it was, or if it was something else.
I think, as I said in an earlier comment, that there was a general lack of awareness amongst the programmers on the team that anything better was possible. Most were not computer science graduates. Professional programmers they were. But I'll bet money that most had never heard of trees.
Management interest evolved over time from indifferent to actively hostile. The first generation LIST annotator improved productivity of the team and reduced errors probably at least fifty percent. Management took no notice at the time. Improvements to the tool, also developed out-of-hours, finally met with angry demands from management to stop and bury the results. Shortly afterwards the entire team was laid off.
One more question, if I may: once you got used to it, what was the productivity like? I imagine these sorts of things as taking days or weeks to make the simplest of changes, but maybe the horror I imagine becomes routine after a year or two of experience.
Edited to add: I never got over the white-knuckle feeling of it: everything global, limited supply of working-storage variables that were constantly being re-used, and interactions that could bite from a distance. One of the most useful features of the LIST annotator was that it generated an ordered cross-reference listing that could be directly compared. That feature made choosing safe working-storage variables a much safer activity.
I don't think that is uncommon. VM's are (almost?) always more capable than whatever language compiles to them (as are processors). I particuarly annoying example I have had to deal with is the Java VM. It has an instruction to take/release a lock on a variable. However, there was no language level feature that exposed this directly; and the synchronized construct added try/catch blocks so that you released the lock in a different scope than you took out the lock. This was espesially annoying because I was working on a 'decompiler' based on the idea of compiling JVM bytecode to Java source code. This meant that I basicly had to resort to pattern matching how javac compiles synchronized, so my solution was non generic. Also, Java for some stupid reason does not let you subclass Enum.
https://en.wikipedia.org/wiki/MUMPS
Edit: The examples on the wikipedia page make it look less crazy than it is. For example every keyword can be abbreviated to a single letter, and was abbreviated to a single letter in the code I had to read. Also, each variable is connected to a global database which (in 1990) had no ACID properties or staging system, so better hope your undebugged program didn't delete any patient data (or worse, randomly modify it).
10 ?"hello whatever..."
which would be expanded to
10 PRINT "hello whatever..."
Line numbers counted too, IIRC, so it was more important when you had 4 and 5 digit line numbers.
But it's been 25 years since I did any commodore basic - my memory might be a bit wrong on this...
It also had only three error messages: "WHAT?" (any syntax-related problem), "HOW?" (any execution error that wasn't syntax-related, like division by zero), and "SORRY" (out of memory).
http://thedailywtf.com/Articles/A_Case_of_the_MUMPS.aspx and http://thedailywtf.com/Articles/MUMPS-Madness.aspx
What I miss the most from other programming languages are features like public/private variables/methods, objects/classes + inheritance, type-checking, first-class functions, etc. (It does support try-catch and exception handling, however.) Even the above gripes aren't entirely 100%, as Intersystems extended MUMPS to have object-oriented features with Cache Objectscript, however, no one uses these so as not to be locked in to one vendor's non-standard implementation of the lagnguage. When comparing to say, Fortran-77, there's just no contest in my mind- out of everything I've programmed in, including VB, I hate Fortran by far the most.
Yes. There's a reason for that.
The etc. is the killer for me :-)
in the beginning, in the 70s or so, ram was very tight and the source was interpreted, not compiled; variable names were shortened to save memory. So the oldest core routines have single letter variable names
variables aren't declared; when you use a name, the interpreter just travels up the call stack looking for somewhere that variable is defined. so if you accidentally use the wrong name, especially with the strong bias to very short variable names, in nested enough code you will find that variable. This led to some amazing bugs
the prefix of the command to delete a node in the internal db (really just global sparse arrays) deleted everything. A coworker fat fingered that in a customer's prod systems and took down a hospital chain you've heard of. I just heard him wail, "Oh SHIT" and sprint out of our office; I later found out he ran for the recovery team.
they also had 15mm lines of vb6
oh, and they love h1b slave labor. Bring them over, abuse them, threaten to fire them if they don't work their asses off, and leave them with no transferable job skills. I presume the ceo uses her billions to salve her conscience.
It wasn't until years later that I realized I'd totally dodged a bullet.
I had never applied...
Or not. I'd recommend not.
The h1b worker knows he's a slave.
You could have just said "the variables are dynamically scoped" and be done with it. :-)
Yes, it's a bear to sift through poorly written MUMPS code. Yes, the language gives you more than enough rope to hang yourself. However, it's also possible to write code legibly and take advantage of abstractions that MUMPS provides (chiefly persistent arrays -- which are now ACID).
https://robtweed.wordpress.com/2013/05/24/making-mumps-accep...
https://github.com/dlwicksell/nodem
The Intersystems version: http://docs.intersystems.com/cache20122/csp/docbook/DocBook....
There could be some very interesting things done with this, using M as a NoSQL DB with javascript jquery-style abstractions for interacting with the DB.
I'm pretty sure the answers are "really slim" and "all of it".
There are techniques and strategies for containing legacy code which are pretty well known in the community. At minimum, this would involve wrapping it in a sane interface. You'd want to isolate global variable state too. Alternatively in Caché you can wrap it in classes (whose semantics are close to Java/.NET)
It's on our list to rewrite the legacy code "some day."
Ask me anything!
https://news.ycombinator.com/item?id=6312391
Also, this here thing is orders of magnitude worse than anything MUMPS and the comparison is very, very unfair.
/[a-z0-9]+/ means "match one or more characters in the range a-z or 0-9"
The real problem with regexes is that in many languages, they can't have whitespace or comments, so documenting them is a problem.
In a sane society, this would mean that there're lots of business opportunities in Finland to fix this. Alas, the widespread stealthy corruption prevents that.
Fun parts: There were a fixed number of variables. All variables were global. There were two control structures: if/then and goto
Imagine a Point-Of-Sale application written in such. A 100,000+ line Point-of-Sale program. Imagine the fun of chasing down re-use of a variable with no debugger.
EZ-C was supposed to be a simple language with built-in screen handling (via curses) and data file handling (with variant records and multiple indices). The theory was that you wrote code in EZ-C and debugged it, since the simpler syntax would reduce errors. EZ-C came with a program that would comple your source and link against EZ-C libraries. The best of all possible worlds - a nice interpreted language that compiled for blazing fast speed!
That was the theory. In practice, the compiler was broken, and so all programs ran via an interpreter called 'dparse'.
So (and I can hear you saying) I started to do what many of you would do: I started to write my own parser with the idea of building a compiler for the language. And that's when Mike, one of the older developers/admins/jack-of-all-trades/wise elders, stopped me. "Don't do that," he said, "because if you do that, we'll never stop writing in EZ-C."
And so I stopped immediately.
It's just like BANCStar! I forgot to mention that one of the most useful features of the LIST annotator was to generate a cross-reference listing. That feature alone made the practice of re-using working-storage variables much safer, because you could compare the cross-reference indexes of two different programs at a glance easily. I strongly encourage the development of that kind of safety/error-detection/error-prevention tool in any environment whenever possible.
Seriously, your Mike sounds like a wise person.
losethos: Smart American kids my age had C64s and Apple IIs. We all entered 6502 machine code into DATA statements in BASIC programs. Everyone did it. It seems so fantastical and primitive to a monkey, doesn't it. Generally, we used monitor program to disassemble and assemblers, though you had to buy an assembler. Every store had magazines with BASIC programs full of DATA statements with graphic and machine code data. People typed it in. We had xsum bytes on blocks.
What I've seen of his writing here (by clicking on my profile, turning on showdead, and going to userpage losethos) is about as mad as this,
http://www.chartrain.org/PDF/Finnegans.pdf
Actually, considerably less mad. Try to read that, and then try to read losethos's comments. which can you at least get some sense out of?
Why, losethos - if you ignore the 'crazy' sentences. If you ignore the 'crazy' sentences in the above link, by contrast, you are left with only chapter numbers and the closing words "Paris, 1922-1939."
At least in Losethos there is something in between the 'crazy' stuff.
Anyway, why did I choose the above link for comparison?
Because it's James Joyce!
So returning to Losethos. He might be 'stark, raving mad', but at least there's something to read and understand if we ignore all the detours.
Anyone who dismisses him outright clearly doesn't have a liberal arts education grounded in having to read real nonsense. After reading some of his posts, I have nothing to declare about his mental health - and neither should you.
He told the world he was schizophrenic, as well as describing at various times his (clearly schizophrenic) rationale for certain things, such as the random number generator that he believes God uses to talk to him. It's not a secret, and it's not something anybody is just guessing about.
It would have saved this thread a lot of arguing. (People misinterpreted the issue to be that he hand-coded an OS.)
http://forums.somethingawful.com/showthread.php?threadid=343...
>>losethos are you schizophrenic?
>Definitely. Are you? One minute accusing me of disability fraud, next minute not ntaking meds.
...the extent of your claim that he "he told the world he was schizophrenic" or can you find a more specific link?
You've edited it from your post now, but that he has strong credentials is neither in dispute nor relevant. Schizophrenia can present at different times in life, and even when its onset is early and obvious, it may not become anywhere close to debilitating for many years, even without any treatment at all.
[1] http://www.metafilter.com/119424/An-Operating-System-for-Son...
I can also see someone doing this exact same thing while trolling. So, for now, I will not go from a look at some guy's weird comment history to making a medical diagnosis of a stranger over the Internet. And I don't think anyone else should either.
It would also be interesting for you to apply your diagnosis skills to religious claims throughout history that God has spoken to someone, if you are able to do so over the Internet.
The idea that supposed prophets were often schizophrenic is hardly a novel notion to academia.
I'm unclear on your motive here. Do you want everyone to think he and anyone else acting similarly is a troll simply to be dismissed? Are you arguing for simply demonizing the mentally ill rather than offering any understanding, because there's a chance they might be trolls? And if they are trolls, might that not be a symptom of a different sort of mental illness?
I assume you're trying to accomplish some sort of goal you think worthwhile, but I'm at a loss to understand what it might actually be.
More generally, I would not try to read that much about people's personality from their writings on the Internet.
I suppose in an exceptional case like this you can. But isn't it enough to say that the guy cannot communicate without derailing himself onto delusional-sounding and off-topic religious interjections?
That would not require a diagnosis and would explain to everyone why the community regards him the way it does.
I don't know what he's like if/when he's on medication, but to me, it seems a shame that his posts end up not being seen. To that end, I appreciate someone having hoisted the salient portion.
So it's fine, I guess, not to judge him, but we ought to keep judging his comments, which are hellbanned for good reason.
I used to work on a small kernel just as a fun hobby project. I haven't had much time to do much with it lately but it was a lot of fun. I would think that this should be encouraged instead of mocked.
1. I see posts making fun of this guy's mental illness.
2. I see posts making fun of how he's working on an OS.
I don't think either one is particularly cool.
I presume from your response that you are OK with:
1. Making fun of mental illness. (I hope that mental illness doesn't have to afflict your family before you realize what's wrong with that.)
2. Making fun of working on an OS. (Still uncool.)
To answer your question, yes, I read his comments.
On behalf of people with mental and neurological issues of all stripes, please shut up. We don't need your "kind words". Just the opposite. We need people who think they're "defending" us by being holier-than-thou assholes to stop talking.
IMHO nobody's really made a convincing case that at least some small part of this community hasn't ostracized this guy for either his mental illness or for his interest in operating systems. Having looked at comments surrounding this guy I still see people doing both. I've gotten some nice replies from people who aren't trying to judge him but I still do see other users doing both. I wanted to speak my conscience about that.
Reflect on that for a while, then compare it to the first comment you made.
When I saw your reply to my reply I understood a bit better, and so please allow me to say right now: I am sorry. At the same time I did kind of feel that you went a little overboard in your reaction.
have you turned on showdead and seen some of his recent comments here on HN yet? seriously, you seem more interested in getting up on a soapbox and making wild generalizations about how the community 'makes fun of mental illness' - something I can't say I've seen much evidence of, quite the contrary in fact - than in actually familiarizing yourself with the guy in question.
But in my searches I did find people making fun of the guy very directly, albeit a long time ago and in some cases downvoted:
https://news.ycombinator.com/item?id=4466947 https://news.ycombinator.com/item?id=4467278
And the more recent discussions, even in this thread... I do feel they have a bit of a subtext.
It's common knowledge that losethos is a schizophrenic.
Nobody here does. It's just that this specific guy happens to have written a simple graphical OS from scratch apparently without anyone else's help.
He also believes God speaks to him through random noise and posts random text created from mixing up Bible verses as being what God just said. He is, really, classic schizophrenic. There's no other way to say it. He hears voices nobody else can hear and he believes it is God talking to him.
> Is this just the HN attitude of having just learned js/ruby yesterday and being afraid of low level details?
Now you're just embarrassing yourself.
No actually, I am not embarrassed to point out that this problem exists on HN. Read any comment thread that deals with low-level anything. It's painful.
Edit: Prerequisite: to feel just how painful it is, you must understand the topic being discussed.
Of course I do, which is why your comments are so laughable.
http://www.youtube.com/watch?v=P0MsDl39UL0
That's really weird stuff.
That said, it's not so much of a stretch to take a literal read of this:
> I get that he's mentally ill (I read up on his OS the other day)
... and conclude that there may be a link between OS and mental illness in the author's mind. I did find it a puzzling juxtaposition.
edit: grammar
Also they are unable to tell when I am joking or exaggerating.
I'm struggling to understand how an anecdote about that brings much that is 'relevant' or 'salient' to a discussion of truly oddball languages like BANCStar.
I understand that it is hard for some people to accept any part of what he's writing when he's expressing himself like that, though.
He's one of a few reasons why I keep showdead on, as while I fully understand why he's banned and wouldn't advocate undoing that, I also feel he should not be fully ignored.
Yeah, but (similarly to the 'environment' that is the subject of the post) those DATA statements contained the output of some sort of tool. Nobody wrote machine code this way.
I'd be careful about that claim.
It was not that unusual to "hand assemble" programs, as it was not that unusual to remember the codes. The 6502 has less than 60 documented opcodes (and quite a few undocumented ones with various weird but in some cases somewhat usable behaviour) and only a few addressing modes, and all opcodes are single byte, so knowing most or even all of them doesn't take that much exposure.
Some of those values are so ingrained that I still remember the decimal values, despite the fact that the moment I started using tools to work with assembly on the C64, it was all hex
e.g. 169 decimal is "load accumulator immediate" (LDA #[8 bit operand) on the 6502. (or A9 in hex)
Yeah, I grew up with 6502s, too.
You'll think I'm weaseling out here, but "hand assembly" isn't what I was talking about.
I feel the original comment implies that some people, intending to write significant machine code, sat down with BASIC and started typing in DATA statements. And I don't think that happened to any significant degree.
As in the case of the "programming environment" under discussion, machine language routines force-fed into BASIC DATA statements were the output of another tool or process -- whether assembled by hand or by machine -- and were an intermediate form that was never intended to be editable.
Not true. I personally did in Z80.
I was 12, couldn't afford an assembler, and my school wouldn't pay for one. I wasn't exactly writing VisiCalc, so a notebook and a pencil were plenty good enough.
I'd read some code that showed JMP $5000 and LDY 32 and figured people just knew that JMP was a particular byte, and LDY was a different one, and you just did it. While it did seem cumbersome, I didn't have much else to compare it to.
I wrote some small screen animation utilities (ASCII screencast recorders, essentially) and later some C128 'enhanced graphic mode' stuff, moving a pointer with a mouse. I think by that point I'd learned the C128 had a small assembler tool built in, so that made things easier.
also if you look up for http://en.wikipedia.org/wiki/KIM-1 you will see how I entered code, all with calculating jumps and branches in head. It is actually fun exercise
Example snippet, with fake data (AIR-BLK791;7A;;232;0750058720;1A1216900;007501\r\nAMD 0750068617;1/1; \r\nGW759208;1A1216900\r\nNXC1A 4O0ORDT030;0751;XYZC7213P;67502886;XYZC7213P;67502886;XYZC7213P;67502886;XYZC7213P;67502886;;;;;;;;;;;;;;;;;;;;;;TA 4O0ORDT\r\nA-LACSA;LR 1330\r\nB-TTP/INV/T3/RT\r\nC-7906/ 1833SEGS-1173LGSU-B-9--\r\nD-127531;121751;121751\r\nG-X ;;XYZXYZ;\r\nH-001;002OYYZ; ... continued)
Parsing airline flight bookings straight from raw sockets was not fun.
Thing is, it does the job, and if you watch users requesting and making bookings with the system (or other similar travel service bookings using things like VT320 terminals), I'd bet a web interface couldn't actually be faster. But only if you know how to use it.
Rather ironically, about 4 years ago, they added a "web service" to this which just wrapped the console output directly in a single set of XML tags - I kid you not - no attempt to nicely separate atoms into separate tags.
Anyone who hasn't had this job during their programming career is very lucky.
"Poogrokking"?
http://thedailywtf.com/Articles/We-Use-BobX.aspx
But yeah, BANCStar still probably takes the cake.
and here I thought my friend's quip, "they're only about 500 of us in the world" who can write in the Q programming language (for kx systems, another financial system) was mind-boggling. (Q is also knows for having incredibly terse, nearly unreadable syntax)
But I'd love to give Q a go, just for geekiness.
There's no lines without a first column, unlike pretty much all the others. I theorize the first column is opcode. You're running a lot of 3001 so I'm guessing thats "load" and it seems like you're clearing something a lot and occasionally stuffing real values in.
The second to last column looks kind of binary flag-y to me. Like LSB and 2LSB somehow team up to mean "zero flag". In fact I'm guessing opcode 8500 is a conditional skip.
The second column has a strange affinity to 1316 and its neighbor, and occasionally uses totally different class of numbers. So I'm guessing its the equivalent of variable name or more likely memory address.
I have a gut level guess the 11000 series opcodes are some kind of ALU op. Probably add. And you can add a constant, and condition codes in the 2nd to last column do things based on add result.
Another gut level guess... you're using signed ints and the last column is some kind of conditional jump and the OS lives in the upper half of memory which would be a negative number as per the last statement returning to the OS. I think you put your global libraries in the 30000 range and this module or whatever happens to live around reserved range of 22000 ish.
Then again maybe its crystal clear and if you just translate it into octal, you'll see PDP-8 instructions. Probably not, but...
I have this gut level guess this is a practical joke, like I'm supposed to recognize based on pattern matching that its a recursive implementation of a factorial.
I see the last column is for constant numerics and zero = 10000, interesting. I bet making a deposit or withdrawl of more than 10000 at a time takes some interesting code (or more likely, the UI hardcodes only 4 spaces)
Per the writeup, I imagine having 7 programmers on staff helped figure out what to do.
It's basically machine language (i.e. lower level than assembler). I remember programming in machine language on an Apple II - I had no assembler, just a photocopied table of the OP codes, and I calculated them myself and entered the hex numbers and ran it.
I wrote part of a tetris clone that way (although never finished it).
They have to be smart guys. If they didn't do it then there must be a good reason which is unfortunately ommited. Or they did it and this article is misleading and baity.
Maybe writing some kind of compiler would be a better idea. Or at least add a comment support and character check and more user friendly labels. They probably did that though (I hope they did).
I can't find a screenshot of the macro editing screen, but here's a different screen from the level editor to give you an idea http://rlmz.org/divinityscreens/divinity05.gif
Environment? The default Uniface "IDE" (Version 7 when I saw it in action) is a monstrosity that is surely given to programmers sent to hell.
God, I miss it.
Of all the tools I tried introducing, LIST was the only one that was adopted. It took off spectacularly well and was beloved.
I mean, even if it was a simple abstraction that just made it a little more readable. Like ASM vs machine code.
[0] Notice I didn't say "simplicity". ;)
I imagined soemthing like programming for Al-Qaeda with a pistol pointed at you. :-)
You're on Hacker News.