Our Government Runs on a 60-Year-Old Coding Language, and Now Its Falling Apart
onezero.medium.com
onezero.medium.com
Old doesn’t necessarily mean worse and newer doesn’t necessarily mean better, but that logical foundation is easy to forget in a tech culture so often myopically focused on innovation(tm) and short-term profit or austerity above robustness.
The relative rarity of COBOL programmers aside, this is a just an garden variety f* up of keeping legacy systems around too long because they aren’t “broken”. And like technical debt, the money and effort to fix them, despite many warnings and pleas, is called a waste because there is no immediate benefit or profit.
Then something like this happens, and everyone forgets the shortsighted management or decision makers that ignored the risk and collected bonuses and praise for saving the Corp/taxpayers money. Those who warned about the debt coming due get nothing except being able to say “I told you so” for a few weeks until the whole thing blows over.
The cost of fixing technical debt has to outweigh the cost and risks of replacing legacy systems. Most ground-up rewrites fail, and that’s even more of a problem in the government sector. A working system with problems is still better than an imaginary system that will probably never go live. Google IRS, California DMV, Oregon utilities, etc. etc. for examples of how these rewrites actually work out.
Maybe in some cases they just need a new IBM mainframe instead of re-written software.
But, switching to something like Java would be far better. COBOL on mainframes has nothing to recommend it. There are good reasons nobody chooses to write new systems that way. For one, it's a single vendor tech in which that vendor is a huge firm in terminal decline and thus highly incentivised to squeeze customers financially as hard as possible; government IT spending is already wasteful without propping up the IBM share price.
There are few paths forward to improve such systems. Beyond the lack of skilled personnel, there's no real open source community or any community producing libraries or integrations.
The problems with these sorts of rewrites are that non-technical managers don't really understand the concept of tech debt until it's way too late and you have a situation like this one. There's no sense that constant improvement should be expected, like what you find in the tech industry, indeed they usually take pride in avoiding projects that are "technology for technologies sake". And that sounds very reasonable, right up until you discover people have basic expectations that you can't fulfil in any plausibly fast manner, or everyone who understands your system has retired and died.
So to justify any replatforming or upgrade project, it has to be done via promising lots of new features as part of the rewrite and that screws with the sequencing. Now it's not a tech upgrade project but rather a total upgrade of many different things simultaneously, including often rigid business processes.
Consider that we could write a headline like "Amazon runs on a 50-year-old operating system, and now it's falling apart." The sentence is not entirely untrue but rather misses the point.
The problem is this: these systems are old and, more significantly, have received extremely limited maintenance and enhancement over their lifetimes. This means that there are few people familiar with each system (a "bus factor" problem) and, more broadly, that the talent-base of COBOL programmers has been allowed to recede to near-zero. While a common modernization (or "recapitalization," a term preferred in government contracting) route in the tech industry might be to take a legacy system written in e.g. Java and progressively reimplement it in e.g. Python with a simplified architecture, a common recap route in government is to take a legacy system written in COBOL or s/370 assembly and transition it to an s/370 emulator running on HPUX on NonStop. I've been involved in such processes a couple of times. It has the advantage of maintaining the reliability properties of the legacy system at relatively low-cost since very little software work is involved. It has the tremendous disadvantage of allowing the organization to continue to not touch the software, with much of the work often outsourced to a vendor who need not be very familiar with the codebase either
You certainly wouldn't write anything in COBOL in 2020, but COBOL itself does have a robust and even fairly maintainable design. The problem is that any application written 20 years ago or more, regardless of language, is going to be tremendously difficult to modify to meet changing requirements and increased demand. Unemployment insurance applications reaching six million per week, for example, would strain a system designed using the most modern methodology which was specified for a few hundred thousand. The difference is that, with a newer system, there are likely to be in-house engineers or vendors who are very familiar with the system and will be able to expand its capacity more rapidly.
Another underlying problem is that legacy systems designed using a mainframe methodology are intended for vertical scaling - to process more records you buy a bigger machine (or expand the LPAR or what have you). While horizontal scaling has its own disadvantages there's a reason it's so popular today - it's a lot faster to buy more capacity from a cloud provider than to requisition a larger mainframe^w midcomputer^w emulation host. There are few vendors and government acquisitions are slow at the best of times, even under emergency sole-source rules.
In a way the whole thing is ironic, because a lot of COBOL application interfaces are faster than any software we use today. From the perspective of a human operator they can be absolutely outstanding once you get over a learning curve. However, the lack of any enhancements made to these systems mean that requirements changes are often "patched in peopleware" if you will, and you end up with clerks that can enter data an order of magnitude more efficiently than with a likely modern solution, but they then have to send the records to a virtual printer to be ingested into a Java EE solution... this kind of "enterprise patching" rapidly adds up to an extremely inefficient system.
It probably has much more to do with the fact that these COBOL programs were designed to run on IBM mainframe computers and to interact with various proprietary IBM subsystems (with names like CICS, VSAM, VTAM, DB2, etc.) These subsystems are non-trivial to learn and there’s been little/no incentive for anyone new to learn them for the last (at least) twenty years.
Finally, back in the 80’s and 90’s, some programs were written in IBM assembler language instead of COBOL, for example when there was a need for greater speed. Understanding and maintaining (or porting these programs to a non-mainframe environment) is also non-trivial.
I left the IBM mainframe world completely 20 years ago, switched over to working only on Unix/Linux systems, did that for 20 years, and am now happily retired. However I’m sure there are still lots of older IBM mainframe people around to handle these problems, they just cost money.
I agree with your point though.
every major RBMS is c or c++.
you don't write frontend's with c/c++ but if you're interacting with a datastore most are c.
the problem with c and c++'s age are legacy behaviors related to them we've since determined are not beneficial to actual programs and make reasoning about them harder.
When you are developing software, you just want that stuff to work. You don't want to have to dig around in the internals to figure things out.
That's why scripting languages have become so popular.
So businesses faced with this problem have a choice: accept that their code is written in an old language, and train programmers to learn it. Or pay big money to convert their code into... a language that will soon be obsolete, in an endless treadmill.
Isn't it better to be obsolete and not pay conversion costs, rather than be obsolete and pay perpetual conversion costs?
Yes, programmers are more productive in newer languages. However, you are never going to get rid of the old stuff, so you will always need some programmers versed in every language, at every stage of your conversion hamster wheel.
I starting thinking of this and thought:
- Much modern AI software depends on 63-year old fortran numerical methods code.
- the Brooklyn Bridge is 137 years old.
- the White House is 220 years old
- Aristotle was using logical reasoning over 2300 years ago.
Seriously, anyone with some programming experience can learn COBOL or any other language in a few weeks. Maybe with so many hip startups for concierge cat sitting closing down more programmers with time on their hands and no paycheck will crack the McCracken book (the one I learned COBOL from ages ago).
But so far all I’ve seen is people saying “welp others should learn cobol because there aren’t many programmers still in the workforce who know this language and it pays big bucks” but I could never find hard evidence. Where are the job ads? Where are the typical rates?