Skip to content
experience

Dear friends, a story from 1984: a power cut, 40,000 punched cards and the word CHECKPOINT

S. Ramanathan@ramanathan_retd

May 16, 2026 · 4 min read

Dear friends,

My grandson tells me that nobody reads long posts any more. I have told him that I am 62 and I have time, and so, kindly, do you. This is a story from my first year in the bank, and it has a lesson at the end which I believe is still useful, although the machines have changed beyond recognition.

I joined the data processing department of our bank's head office in Madras (it became Chennai only later) in 1984, as a trainee programmer. I had a degree in mathematics and had never touched a computer. For the first four months I did not touch one either. I wrote COBOL on coding sheets, in pencil, in capital letters, and the sheets went to the punching section, where six ladies converted them into punched cards at a speed I have never seen equalled on any keyboard since. You collected your deck, held together with a rubber band, and submitted it to the operators through a small window, like a ration shop. The next morning you collected your listing. If you had made one mistake, you had lost one day.

Power cuts in Madras in those years were not an event, they were the weather. The machine room had a generator, but the switch-over was not instant, and the air conditioning was the first thing to go and the last thing to come back.

In my seventh month I was given my first real job: a program that read the day's transactions from cards (about 40,000 of them for our city branches) and posted them to the account master file on tape. The night I am speaking of, the power went at about 2.40 am, two hours into the run. The generator came on, the machine was restarted, and the operator, a very senior and very sleepy gentleman, did what seemed obvious. He put the whole deck back in and ran it again from the first card.

You can guess. Around 23,000 transactions were posted twice. Some customers in Mylapore were very rich for one morning, and some were very poor.

My section head, Mr. Venkatraman, did not shout. He was not a shouting man. He sat with me for two days while we reversed every duplicate by hand from the listings, and on the third day he gave me a sheet of paper with one word written on it: CHECKPOINT.

What he taught me, and what I have repeated to every young person who would listen for the next thirty years, was this:

  • A long batch job must know how far it has got. Every N records, write down (on a separate file, which in those days meant a separate tape) the position you have reached and the totals so far. We used every 1,000 transactions.
  • Restart must be a decision the program makes, not the operator. On start, the program looks for the last checkpoint and continues from the record after it. The operator should not need to know anything.
  • Totals must reconcile at the end. Count of records in, count posted, count rejected, sum of amounts in, sum posted. If they do not agree, the job does not say "completed". It says something unpleasant, in capital letters.
  • Posting must be safe to repeat. Each transaction carried its own reference number, and the master update refused to apply a reference it had already applied. This was the most important one, and I did not truly understand it until many years later.

Later, on the mainframe with CICS and DB2, all of this had proper names and proper tools. Today my grandson tells me the word is "idempotent", and that his Kafka consumers commit offsets, and I nod. It is the same idea. The machine will stop halfway. The power will go, or the network, or the cloud (which I am told is also somebody's machine room). The only question is whether your program knows what it has already done.

There is a Tamil saying: "Aatril pottaalum alandhu podu". Even if you are throwing it into the river, measure it first. Mr. Venkatraman never said it to me, but every reconciliation total I ever wrote was that proverb in COBOL.

With regards,
S. Ramanathan

Get the best of Dynamo Geeks weekly

One email each Monday with the most useful posts. No spam; unsubscribe in one click.

Comments

9

Sign in to join the conversation.

Sign in to comment
Karthikeyan S@karthik_embedded
Sir, "restart must be a decision the program makes, not the operator" is the same in firmware da. After a brown-out reset the controller must know which state it was in, not the technician. We write a small state record to flash with a CRC for this only. Very nice story.
1 net votes
S. Ramanathan@ramanathan_retd
Dear Karthik, Exactly the same principle, and the CRC is the modern version of our totals. I am glad the young people in Coimbatore are doing it properly. With regards
0 net votes
Rodel Bautista@rodel_java
Sir the duplicate posting story is every bank developer's nightmare. We had the same thing in 2019 with a retry on a payment API and no reference check. I will share this with my team. Salamat po.
4 net votes
Graham Whitfield@greybeard_graham
Mr. Venkatraman sounds like a man I would have liked to work for. The fact that he sat with you for two days reversing it by hand rather than shouting is a whole lesson about leadership, separate from the lesson about checkpoints. Cheers, G.
1 net votes
Sam Whitaker@segfault_sam
some customers in mylapore were very rich for one morning is the best incident summary ive ever read
1 net votes
Caio Nascimento@caio_backend
Here in Brazil we still have batch jobs in banks doing exactly this checkpoint logic in COBOL. My first job was reading one of them. Idempotent posting is still rule number one. Obrigado for writing this.
2 net votes
Karl Lindqvist@kernel_karl
The last bullet is the one people still get wrong. Exactly-once delivery does not exist. Idempotent processing does. Good post.
1 net votes
S. Ramanathan@ramanathan_retd
Dear Karl, Thank you. My grandson says the same thing, but when you say it, he will believe it.
1 net votes
Peter Hughes@amiga_pete
Lovely stuff, Mr Ramanathan. The ladies in the punching section deserve a post of their own. Cheers, Pete
2 net votes