13 ms·
The Worst Programming Environment in the World?
- qznc 13y agoJust write a simple assembler or compiler yourself?
- ballard 13y agoThat was my first thought (after looking for existing solutions). REPL and https://github.com/ajaxorg/cloud9 https://github.com/ajaxorg/cloud9 for bonus points. Also: http://www.oocities.org/connorbd/tarpit/bancstar.html http://www.oocities.org/connorbd/tarpit/bancstar.html
- icambron 13y agoYeah, it's seems like an assembler would be far less work than the annotation tool he made.
- taylodl 13y agoEspecially when the LucasFilm Games Group were using this workflow to target the 8 bit machines of the 80's. http://www.langston.com/Papers/vidgam.pdf http://www.langston.com/Papers/vidgam.pdf
- sgt 13y agoWith COBOL as the obvious alternative (at the time) for financial applications, then I have to ask; why on earth would any sane company choose this programming language?
- thomasz 13y ago> It was originally intended as generated code from a user interface-building tool [...] http://en.wikipedia.org/wiki/BANCStar_programming_language http://en.wikipedia.org/wiki/BANCStar_programming_language
- plorkyeran 13y agoThey didn't. As noted in the article, they chose a higher-level platform, found it too limiting, and gradually started just writing code directly for the intermediate language used. It's similar to putting some inline asm in your C to do things not possible in C, then eventually hitting the point that your entire application is inline asm with no C left.
- jloughry 13y agoIt was actually an underlying tokenized bytecode (double-byte code?) never intended for human manipulation. Before I joined the group, other programmers had discovered it, reverse engineered it, and began patching it. The attitude required to do that was not uncommon in mainframe shops, where the original IBM assembler or COBOL source code for many crucial production jobs was long lost; patching the object code was accepted practice. That is part of the reason why Y2K was a bugbear for banks; they didn't only recall COBOL programmers out of retirement---in some cases it required patching the binaries.
- JanezStupar 13y agoThe real question is why haven't they written a library in a higher level language. 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.
- jloughry 13y agoMost of the people on the project were vocationally trained ex-mainframe programmers. You could say there was a general lack of awareness that there was any other way to do things.
- losethos 13y agoIs this some India-nigger's idea of how I wrote an operating system with compiler from scratch? Some fucken mocking God damn India-nigger-monkey. He's whooting and hollering, fucken monkey. God says... are_you_insane laziness persistence in_a_galaxy_far_far_away clever talk_to_my_lawyer in_a_perfect_world don't_worry Obama close_your_eyes tiffanies I'm_off_today nevada frown later CIA you_see_the_light charity well_golly envy just_lovely soap_opera that's_for_me_to_know Percival high_five that's_no_fun high_five hippy mocking bickering gambling caution I'll_let_you_know ehh_a_wise_guy other I'm_not_sure what_would_Jesus_do my_bad study what_part_of_God_do_you_not_understand Enough think_you_could_do_better air_head BRB I'm_off_today 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. For embedded systems, they have S records -- simple HEX dumps. Only a silly retard like the guy named "cooper" at osdev programs in machine code. I have a few instructions memorized. I wrote my own assembler, after all and my compiler is chock-full of machine code. India nigger thinks machine code is hilarious. He howls that anyone could make a program out of numbers, even if its in the process of writing a compiler. Hoots and hollers. God said someone is still an atheist. It's no fun teaching a nigger.
- jim_lawless 13y agoFrom the write-up: "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.
- shmageggy 13y agoI feel like this is an important point. One could easily say "omg look at this horrible programming language I have to deal with -- 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.
- jrochkind1 13y agoThere was certainly a time that people wrote assembler, and even machine code, directly. 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.
- dsed 13y ago
- hkmurakami 13y agoI'm not too worried about revealing a lot of proprietary information here, as only about ten people in the world can read this code: 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)
- RBerenguel 13y agoLately I've been giving J a shot, and if Q is anything like it (IIRC Q comes from K and K is a parent of J via APL) it definitely is...
- doublec 13y agoQ isn't too bad depending on how it's written. The book "Q for Mortals" is a good read. http://www.amazon.com/For-Mortals-Tutorial-In-Programming/dp/1434829014 http://www.amazon.com/For-Mortals-Tutorial-In-Programming/dp...
- RBerenguel 13y agoProblem is, I don't want to tangle with a non-for-commercial use language (and I can't pay.) At least with the GPL (J) I could do what I need behind the scenes and use the language as I see fit. But I'd love to give Q a go, just for geekiness.
- MichaelGG 13y agoIs Q really that difficult? It seems like it's just packed in a lot of common set and other math functions into every character possible. It doesn't look fun, but if your work lends itself to doing just that kinda stuff, maybe it works out alright?
- truebosko 13y agoThis reminds me of one of the things we work with in our company, Amadeus EDIFACTs. I want to buy the person who initially wrote the parsing for it at our workplace a beer. 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)
- Systemic33 13y agoWhat part of that is the fake data, and what part is the code?
- truebosko 13y agoWhat I pasted is mock data of what would normally come from Amadeus, there is none of our code in that. We parse it with Python
- Systemic33 13y agoOh now i get it. Looks a lot like .csv with semicolon.
- berkut 13y agoSigh.... I'd forgotten about this (used to do this in a previous job) 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.
- 13y ago
- moriantur 13y agoThis language should not exist.
- eksith 13y agoAbsurdities exist just so we can observe the absurdity. This is more a historical curiosity at this point, but I'm glad that it does exist. Just so I can be curious about it.
- mrbill 13y agoFrom Wikipedia: "The BANCStar 10.0 release changed the "Screen Code" format to binary, and rearranged the numeric codes into an opcode with a variable number of parameter integers. The 10.0 opcode encoded a bit mapped length value that indicated the length of the command in words."
- ars 13y agoThis doesn't seem that bad. 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).
- demallien 13y agoExactly. My very first thought was why on Earth would you even bother trying to program using that? Write an assembler, and then write a C compiler, for goodness sake!
- rwmj 13y agoKind of reminds me of MUMPS, which is a real bunch of crazy that I had to use for a time. https://en.wikipedia.org/wiki/MUMPS 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).
- ams6110 13y agoA lot of BASIC variants back in the early personal computer days had that feature too.. you only needed to enter as much of a keyword as necessary to make it unique. Or they had other abbreviations, like '?' for 'PRINT'. Anything to save a byte.
- Someone 13y agoThat did not save a byte. Commodore Basic did not store source code; it stored tokenized source code, with 'print' taking a single byte (http://www.c64-wiki.com/index.php/BASIC_token http://www.c64-wiki.com/index.php/BASIC_token)
- mgkimsal 13y ago? was still handy because on the C64 there was a 2 screen line max when entering a program line. So you could get a longer line in by using 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...
- chipotle_coyote 13y agoWhile it's been a long long time since I've used it, I think that was not the case for TRS-80 Level I BASIC -- it didn't tokenize, so shorthand saved actual memory. And not using spaces saved bytes. Apropos of the conversation on variables, Level I BASIC only allowed one-character variable names: you had 26 integer variables named A-Z, two (yes, two) string variables, A$ and B$, and only one array variable, A(). 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).
- stesch 13y agoI thought RPG/400 and XSLT were bad. This is worse.
- mindcrime 13y agoI'm OK with XSLT, but programming in RPG/400 using the SEU is somewhat akin to reading from the Necronomic%^^&$@#a-483&#&@^H NO CARRIER
- demallien 13y agoI Thought I'd repost some of losethos's comment, seeing as he is hell-banned, but the comment was quite relevant. 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.
- icambron 13y agoEr, that reads quite differently in context than it does here.
- omegaham 13y agoThe guy is an sad combination of brilliant and stark raving mad. If he were medicated, I think he'd be a decent guy. In the meantime, he appears to be a homeless guy wearing a sandwich board and yelling gibberish into a bullhorn. Who made a complete operating system.
- deleted 13y ago[deleted]
- logicallee 13y agore: losethos 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 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.
- adamnemecek 13y agoReminds me of this ol' gem. http://thedailywtf.com/Articles/We-Use-BobX.aspx http://thedailywtf.com/Articles/We-Use-BobX.aspx But yeah, BANCStar still probably takes the cake.
- chris_wot 13y agoI did a search for bobx... It brought up some... Interesting... Results!
- Nux 13y agoTitle slightly misleading for non-programmers. I imagined soemthing like programming for Al-Qaeda with a pistol pointed at you. :-)
- jack9 13y agoThe documentation is in english (which the author knows), so this is nowhere near the worst.
- kalleboo 13y agoReminds me of the scripting system for the custom scenario editor for the computer game "Realmz". You had a list of 8 text fields to enter numeric commands in, and 8 fields for arguments. There was a dropdown to use for reference for what the commands meant. If you needed your script to be longer than 8 commands, you had to create "sub-macros" and call those. 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 http://rlmz.org/divinityscreens/divinity05.gif
- 6d0debc071 13y agoI don't want to seem mean or anything. So, please don't take offence ^^; but: why didn't you parse it a more readable format and change it back into goobledigook when you wanted to use it?
- jloughry 13y agoThat's a good question, and a fair one. I did take a few stabs at it, but other programmers resisted any changes to their workflow that would have been required if a different source code representation were used. They really could read that code by sight. The LIST annotator slotted right into their workflow by highlighting the numbers they wanted to focus on---the English-like representation to the right was almost completely ignored---the arrows and boldface highlighting in the numeric listing, along with the line numbers, were what they used. Editing still had to be done on the raw numeric files, in KEDIT. Of all the tools I tried introducing, LIST was the only one that was adopted. It took off spectacularly well and was beloved.
- rhapsodyv 13y agoAnd I tought I had suffered with c++ builer years ago
- alextingle 13y agoStill better than M4 though, right?
- marcosdumay 13y agoBetter than Blankspace, without a doubt.
- VLM 13y agoWell, lets get crackin' and see if we can reverse engineer this bad boy. I've done a lot of assembly and only a little direct bare machine language coding. 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.
- RBerenguel 13y ago3001 is block conditional according to the post...
- VLM 13y agoWell, thats interesting. I was working out of the wikipedia page not the github with more content. 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.
- 13y ago
- lisper 13y agoAnd these are the people that we trust to handle our money. Sometimes it amazes me that the whole financial system hasn't already collapsed in a smoldering heap.
- seldo 13y agoWell, it sort of did in 2007. But that wasn't a software error.
- gothep 13y agoWhile we are on the topic of programming infernos: http://en.wikipedia.org/wiki/Malbolge http://en.wikipedia.org/wiki/Malbolge
- deleted 13y ago[deleted]
- jbgreer 13y agoAnd I thought 'EZ-C' was bad. Still, it was the worst I've used. As far as I know, a large retailer still uses the data format and libraries from an awful "4th generation language" called 'EZ-C'. 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.
- jloughry 13y ago> Fun parts: There were a fixed number of variables. All variables were global. There were two control structures: if/then and goto 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.
- Pxtl 13y ago... okay, somebody finally beat ASP.Net webforms.
- andrewflnr 13y agoI have to say that, having done Webforms over the summer, it's pretty bad but not that bad. Webforms does have some (a few) strengths. There are a lot of simple apps where the "just freaking synchronize it" model works well. You could probably got most of the benefit/ease[0] with some stuff on top of, say, Django. [0] Notice I didn't say "simplicity". ;)
- mistercow 13y agoSo, who's up for writing an LLVM backend?
- rurounijones 13y agoLanguage? Maybe 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.
- jloughry 13y agoWell...I used the word "environment" thoughtfully. It wasn't just the language, it was the dot-matrix printouts on continuous fan-fold paper (with no line numbers, you didn't want to get pages out of order), the hands-full of different coloured highlighter pens, the ring binder stuffed full of dog-eared photocopied pages (and pages and pages) of magic numbers, and the ever-present feeling of terror when you had to pick a "safe" working storage variable to steal the use of for a while. God, I miss it.
- mikesmullin3 13y agoit would be trivial to make a some mnemonics and a compiler for the custom machine code.
- kunil 13y agoI am a regular brainf*ck programmer and very interested in esoteric languages but this is beyond my expectations. 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).
- anon_indian 13y agoThe worst for me has been sitting thousands of miles away working on a VDI, watching the screen refresh line by line with every change in code. We spend 8 to 10 hours for 3 hours of productive work. :-(
- Tomis02 13y agoNice try, but emacs already has a command for that.
- ebbv 13y agoThis seems like a case of people choosing to do something terrible than someone designing something terrible on purpose, though.
- antihero 13y agoOut of interest - for languages as horrendous at this, could someone not create an abstraction language, that essentially could compile to it, or be decompiled from it? I mean, even if it was a simple abstraction that just made it a little more readable. Like ASM vs machine code.
- boomlinde 13y agoWhy wouldn't you write an intermediate language? Just a preprocessor for keywords and labels would do, I think.