[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"sanity-pbtgnag-GyaxATvttMVEbcl0SHVrtdjhooHtKuu85GY":3,"sanity-HeZ3VEtlX3OX-aZEt9TcXsq182qoqrzEMjl4IgkNU2Q":1229},{"data":4,"sourceMap":-1},{"latestPodcast":5,"latestReleases":14,"post":39,"recent":1204},[6],{"_id":7,"publishedAt":8,"slug":9,"sponsored":12,"title":13},"d52b334e-4233-4e7d-a10b-bfba1472c2fb","2026-07-07T07:40:00.000Z",{"_type":10,"current":11},"slug","agent-orchestration-is-so-two-years-ago",null," Agent orchestration is so two-years ago",[15,21,27,33],{"_id":16,"publishedAt":17,"slug":18,"title":20},"eb5b66eb-9410-4329-83bb-22bbff39402a","2026-04-28T13:00:00.000Z",{"_type":10,"current":19},"turn-scattered-knowledge-into-trusted-intelligence","Turning scattered knowledge into trusted intelligence: Stack Internal 2026.3",{"_id":22,"publishedAt":23,"slug":24,"title":26},"369c2401-b62e-4a37-8ff8-bf603023ecad","2026-03-02T15:03:00.988Z",{"_type":10,"current":25},"what-s-new-at-stack-overflow-march-2026","What’s new at Stack Overflow: March 2026",{"_id":28,"publishedAt":29,"slug":30,"title":32},"5e9053a4-07ea-447c-91ea-29e0b6228537","2026-02-02T15:00:00.000Z",{"_type":10,"current":31},"what-s-new-at-stack-overflow-february-2026","What’s new at Stack Overflow: February 2026",{"_id":34,"publishedAt":35,"slug":36,"title":38},"a1b538eb-a8a6-46d0-80a1-ac70ec9bb935","2026-01-05T10:00:00.000-05:00",{"_type":10,"current":37},"what-s-new-at-stack-overflow-january-2026","What’s new at Stack Overflow: January 2026",{"_createdAt":40,"_id":41,"_rev":42,"_type":43,"_updatedAt":44,"author":45,"body":62,"comments":1164,"dateUrl":1165,"excerpt":1166,"image":1167,"legacyBody":1170,"product":12,"publishedAt":1173,"slug":1174,"sponsored":12,"tags":1176,"title":1203,"visible":1164},"2023-05-25T09:39:14Z","wp-post-15721","07ZbrKPSUrjrV4wQ6fIlpU","blogPost","2023-07-13T14:55:36Z",[46],{"_createdAt":47,"_id":48,"_rev":49,"_type":50,"_updatedAt":51,"avatar":52,"bio":57,"employee":58,"name":59,"slug":60},"2023-05-23T16:27:18Z","wp-author-cap-15133","07ZbrKPSUrjrV4wQ6fDpaa","blogAuthor","2023-06-20T15:05:10Z",{"_type":53,"asset":54},"image",{"_ref":55,"_type":56},"image-fb42299918166f47819645a45267277d31eb0ce0-40x40-jpg","reference","","none","Charles R. Martin",{"current":61},"charles-r-martin",[63,74,116,134,143,162,170,178,187,195,212,231,239,247,255,274,284,292,300,308,316,324,343,373,381,390,418,437,445,449,457,461,469,477,485,533,541,549,552,560,563,571,579,587,590,614,622,625,633,636,644,652,655,663,678,680,688,696,704,712,728,731,754,770,778,808,811,842,845,909,931,934,965,980,983,991,999,1002,1010,1013,1021,1024,1032,1040,1092,1132,1140,1148,1156],{"_key":64,"_type":65,"children":66,"markDefs":72,"style":73},"014fd887fb0d","block",[67],{"_key":68,"_type":69,"marks":70,"text":71},"014fd887fb0d0","span",[],"Once upon a time, when the world and computers were new, I was in an Associate's Degree program for Data Processing—there were no \"computer science\" programs then—in which I had to study accounting, math, statistics, and three computer languages: IBM\u002F360 Basic Assembly Language, FORTRAN, and COBOL. By the 80's, students were being told that COBOL was a dead language, and no one was studying it any more.",[],"normal",{"_key":75,"_type":65,"children":76,"markDefs":108,"style":73},"0096248db2c8",[77,81,86,90,95,99,104],{"_key":78,"_type":69,"marks":79,"text":80},"0096248db2c80",[],"Now, in 2020, ",{"_key":82,"_type":69,"marks":83,"text":85},"0096248db2c81",[84],"f4220640611f","governments and banks",{"_key":87,"_type":69,"marks":88,"text":89},"0096248db2c82",[]," are ",{"_key":91,"_type":69,"marks":92,"text":94},"0096248db2c83",[93],"c484f10eda2a","pleading for COBOL",{"_key":96,"_type":69,"marks":97,"text":98},"0096248db2c84",[]," programmers, the ",{"_key":100,"_type":69,"marks":101,"text":103},"0096248db2c85",[102],"89166647749d","language that wouldn't die",{"_key":105,"_type":69,"marks":106,"text":107},"0096248db2c86",[],".",[109,112,114],{"_key":84,"_type":110,"href":111,"reference":12},"link","https:\u002F\u002Fwww.cnn.com\u002F2020\u002F04\u002F08\u002Fbusiness\u002Fcoronavirus-cobol-programmers-new-jersey-trnd\u002Findex.html",{"_key":93,"_type":110,"href":113,"reference":12},"http:\u002F\u002Fwww.kake.com\u002Fstory\u002F41983960\u002Funemployment-woes-continue-as-system-remains-overloaded",{"_key":102,"_type":110,"href":115,"reference":12},"https:\u002F\u002Fthenewstack.io\u002Fcobol-everywhere-will-maintain\u002F",{"_key":117,"_type":65,"children":118,"markDefs":132,"style":73},"9230fca9e229",[119,123,128],{"_key":120,"_type":69,"marks":121,"text":122},"9230fca9e2290",[],"Governor Laura Kelly of Kansas ",{"_key":124,"_type":69,"marks":125,"text":127},"9230fca9e2291",[126],"c5a7da30cf59","said",{"_key":129,"_type":69,"marks":130,"text":131},"9230fca9e2292",[],":",[133],{"_key":126,"_type":110,"href":113,"reference":12},{"_key":135,"_type":65,"children":136,"markDefs":141,"style":142},"aadf2657ee0f",[137],{"_key":138,"_type":69,"marks":139,"text":140},"aadf2657ee0f0",[],"“So many of our Departments of Labor across the country are still on the COBOL system. You know very, very old technology,” Kelly said Tuesday. “Our Department of Labor had recognized that that was an issue and had initiated modernization, and, unfortunately, that's something that takes time. This (virus) interfered and they had to cease the transition to a much more robust system. So they're operating on really old stuff.”",[],"blockquote",{"_key":144,"_type":65,"children":145,"markDefs":159,"style":73},"d602684ead7e",[146,150,155],{"_key":147,"_type":69,"marks":148,"text":149},"d602684ead7e0",[],"New Jersey Governor Phil Murphy ",{"_key":151,"_type":69,"marks":152,"text":154},"d602684ead7e1",[153],"39417175e389","made a television appearance",{"_key":156,"_type":69,"marks":157,"text":158},"d602684ead7e2",[]," to plead for COBOL programmers to help.",[160],{"_key":153,"_type":110,"href":161,"reference":12},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=HSVgHlSTPYQ",{"_key":163,"_type":65,"children":164,"markDefs":169,"style":73},"7e22f705bc21",[165],{"_key":166,"_type":69,"marks":167,"text":168},"7e22f705bc210",[],"So, how can you learn COBOL, make big bucks, and save lots of state agencies that need new code to deal with all the new government stimulus programs?",[],{"_key":171,"_type":65,"children":172,"markDefs":177,"style":73},"f6dd791908fd",[173],{"_key":174,"_type":69,"marks":175,"text":176},"f6dd791908fd0",[],"Let's find out.",[],{"_key":179,"_type":65,"children":180,"markDefs":185,"style":186},"623ac35b6642",[181],{"_key":182,"_type":69,"marks":183,"text":184},"623ac35b66420",[],"COBOL? What's this COBOL?",[],"h2",{"_key":188,"_type":65,"children":189,"markDefs":194,"style":73},"1012a497a3bc",[190],{"_key":191,"_type":69,"marks":192,"text":193},"1012a497a3bc0",[],"COBOL stands for COmmon Business Oriented Language. One of the first of the high-level languages, it was put together by a group sponsored by the Department of Defense to develop a common business language. That group came to be called CODASYL—the Committee on Data Systems Languages—and defined a \"common business oriented language,\" drawing from Grace Hopper's FLOW-MATIC, and other languages including Univac's AIMACO and IBM's COMTRAN. The resulting language went through more revisions, but rapidly became the dominant language for building business systems, and it has remained dominant since.",[],{"_key":196,"_type":65,"children":197,"markDefs":211,"style":73},"12e642dec35d",[198,202,207],{"_key":199,"_type":69,"marks":200,"text":201},"12e642dec35d0",[],"Plenty of companies still use COBOL, including IBM, UPS, and Cigna. Mario Ceballos, a software engineer at Cigna, told me, “The syntax is kept simple to allow ",{"_key":203,"_type":69,"marks":204,"text":206},"12e642dec35d1",[205],"strong","non-programmers",{"_key":208,"_type":69,"marks":209,"text":210},"12e642dec35d2",[]," (“The Business”) to read it and understand it. COBOL is meant to be explicit, because there shouldn’t be room for assumptions.”",[],{"_key":213,"_type":65,"children":214,"markDefs":228,"style":73},"d6ed263f92d0",[215,219,224],{"_key":216,"_type":69,"marks":217,"text":218},"d6ed263f92d00",[],"Of course, it has had its critics. In 1975, Edsgar Dijkstra ",{"_key":220,"_type":69,"marks":221,"text":223},"d6ed263f92d01",[222],"a732d15d36e6","famously proclaimed",{"_key":225,"_type":69,"marks":226,"text":227},"d6ed263f92d02",[]," that “The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence[sic].\" This undoubtedly led to the decline of teaching COBOL in universities, but it remained the dominant business language.",[229],{"_key":222,"_type":110,"href":230,"reference":12},"https:\u002F\u002Fwww.goodreads.com\u002Fquotes\u002F496316-the-use-of-cobol-cripples-the-mind-its-teaching-should",{"_key":232,"_type":65,"children":233,"markDefs":238,"style":73},"a54ce0221716",[234],{"_key":235,"_type":69,"marks":236,"text":237},"a54ce02217160",[],"But finding people with COBOL skills can be tough. “The mainframe is a very difficult platform to learn, and that’s due to the cost,” said Ceballos. “Individuals do not have the money to pay to lease a mainframe. A very small amount of schools teach courses on mainframes and COBOL. When IBM started remote work and outsourcing, they stopped incentivizing American schools to teach courses in Mainframes and COBOL. The talent pool shifted from on-shore to off-shore. Any local talent will be expensive with their consulting fees.”",[],{"_key":240,"_type":65,"children":241,"markDefs":246,"style":186},"11eed09c0ad1",[242],{"_key":243,"_type":69,"marks":244,"text":245},"11eed09c0ad10",[],"Why is COBOL still dominant?",[],{"_key":248,"_type":65,"children":249,"markDefs":254,"style":73},"e3e93042d596",[250],{"_key":251,"_type":69,"marks":252,"text":253},"e3e93042d5960",[],"Compared to common programming languages today, COBOL is different, and in some ways very limited: you can't do dynamic memory allocation, you can't easily access low-level features of the operating system or particular computer architecture. The most common forms of the language can't use recursion. You'd never want to write a compiler in COBOL. A computer science student presented with COBOL would be appalled.",[],{"_key":256,"_type":65,"children":257,"markDefs":271,"style":73},"c9e41d0b9c83",[258,262,267],{"_key":259,"_type":69,"marks":260,"text":261},"c9e41d0b9c830",[],"This is a category error. In modern terminology, COBOL is actually a ",{"_key":263,"_type":69,"marks":264,"text":266},"c9e41d0b9c831",[265],"486260cce7c7","domain-specific language",{"_key":268,"_type":69,"marks":269,"text":270},"c9e41d0b9c832",[],", specific to the particular domain of business programming. Robert Glass identified specific ways in which COBOL is better suited to business programming than general-purposes languages, among them:",[272],{"_key":265,"_type":110,"href":273,"reference":12},"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F809574\u002Fwhat-is-a-domain-specific-language-anybody-using-it-and-in-what-way",{"_key":275,"_type":65,"children":276,"level":281,"listItem":282,"markDefs":283,"style":73},"91d54ed05693",[277],{"_key":278,"_type":69,"marks":279,"text":280},"91d54ed056930",[],"A business-oriented language needs to declare, manage, and manipulate heterogenous data. Business programs mix fixed and variable length strings, floating-point, integer, and decimal data with wild abandon in complicated record structures, often with variable parts. Database programmers are familiar with some of these issues, and object-relational mapping tools trip over these complexities regularly.",1,"bullet",[],{"_key":285,"_type":65,"children":286,"level":281,"listItem":282,"markDefs":291,"style":73},"692b8ef3d5d5",[287],{"_key":288,"_type":69,"marks":289,"text":290},"692b8ef3d5d50",[],"Business and financial data needs to be managed using true decimal data types. Accounting systems must be correct to the last decimal digit and need to reproduce exactly the results of hand-calculation; conventional floating-point numbers lead to complexities and errors.",[],{"_key":293,"_type":65,"children":294,"level":281,"listItem":282,"markDefs":299,"style":73},"5a00f630d30a",[295],{"_key":296,"_type":69,"marks":297,"text":298},"5a00f630d30a0",[],"A business-oriented language needs to access and manipulate large amounts of record-structured data maintained externally.",[],{"_key":301,"_type":65,"children":302,"markDefs":307,"style":73},"2cd819946ba6",[303],{"_key":304,"_type":69,"marks":305,"text":306},"2cd819946ba60",[],"Now, none of this is beyond the capabilities of general-purpose programming languages, of course. But in COBOL, it's native to the language.",[],{"_key":309,"_type":65,"children":310,"markDefs":315,"style":73},"dc232b273339",[311],{"_key":312,"_type":69,"marks":313,"text":314},"dc232b2733390",[],"We can debate the need for COBOL, but the fact is that hundreds of billions of lines of COBOL exist, and attempts to migrate away from COBOL have not generally been successful.",[],{"_key":317,"_type":65,"children":318,"markDefs":323,"style":186},"24d568e9ea01",[319],{"_key":320,"_type":69,"marks":321,"text":322},"24d568e9ea010",[],"Your first COBOL program",[],{"_key":325,"_type":65,"children":326,"markDefs":340,"style":73},"22691b613f4d",[327,331,336],{"_key":328,"_type":69,"marks":329,"text":330},"22691b613f4d0",[],"The source files are simple text files. Having a useful programming editor with language support is as convenient for COBOL as any other language, if not more so. The easiest thing for a beginner is to use ",{"_key":332,"_type":69,"marks":333,"text":335},"22691b613f4d1",[334],"fe042d709d4b","Visual Studio Code",{"_key":337,"_type":69,"marks":338,"text":339},"22691b613f4d2",[],", the only competitor for my affections since EMACS.",[341],{"_key":334,"_type":110,"href":342,"reference":12},"https:\u002F\u002Fcode.visualstudio.com\u002F",{"_key":344,"_type":65,"children":345,"markDefs":368,"style":73},"a1625af77f59",[346,350,355,359,364],{"_key":347,"_type":69,"marks":348,"text":349},"a1625af77f590",[],"There are surprisingly many VSCode extensions for COBOL. Right now, I'm using the ",{"_key":351,"_type":69,"marks":352,"text":354},"a1625af77f591",[353],"b2659798520b","bitlang",{"_key":356,"_type":69,"marks":357,"text":358},"a1625af77f592",[]," code colorizer and ",{"_key":360,"_type":69,"marks":361,"text":363},"a1625af77f593",[362],"02b2a74a2d55","Broadcom COBOL language support",{"_key":365,"_type":69,"marks":366,"text":367},"a1625af77f594",[],". A lot of the others are intended for people programming in a mainframe environment, but that adds complexity we don't need for an introduction.",[369,371],{"_key":353,"_type":110,"href":370,"reference":12},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=bitlang.cobol",{"_key":362,"_type":110,"href":372,"reference":12},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=broadcomMFD.cobol-language-support",{"_key":374,"_type":65,"children":375,"markDefs":380,"style":73},"84016ad852a5",[376],{"_key":377,"_type":69,"marks":378,"text":379},"84016ad852a50",[],"So, to summarize, to begin to experiment with COBOL:",[],{"_key":382,"_type":65,"children":383,"level":281,"listItem":388,"markDefs":389,"style":73},"df4ea93482f1",[384],{"_key":385,"_type":69,"marks":386,"text":387},"df4ea93482f10",[],"Download and install Visual Studio Code if you haven't already.","number",[],{"_key":391,"_type":65,"children":392,"level":281,"listItem":388,"markDefs":415,"style":73},"4347a6d78dde",[393,397,402,406,411],{"_key":394,"_type":69,"marks":395,"text":396},"4347a6d78dde0",[],"Install the ",{"_key":398,"_type":69,"marks":399,"text":401},"4347a6d78dde1",[400],"8102bb85418d","bitlang.cobol",{"_key":403,"_type":69,"marks":404,"text":405},"4347a6d78dde2",[]," and ",{"_key":407,"_type":69,"marks":408,"text":410},"4347a6d78dde3",[409],"b05fdd3f5b65","Broadcom COBOL Language Support",{"_key":412,"_type":69,"marks":413,"text":414},"4347a6d78dde4",[]," extensions.",[416,417],{"_key":400,"_type":110,"href":370,"reference":12},{"_key":409,"_type":110,"href":372,"reference":12},{"_key":419,"_type":65,"children":420,"level":281,"listItem":388,"markDefs":434,"style":73},"8597b1d265f7",[421,425,430],{"_key":422,"_type":69,"marks":423,"text":424},"8597b1d265f70",[],"Install ",{"_key":426,"_type":69,"marks":427,"text":429},"8597b1d265f71",[428],"b61052238dbe","GnuCOBOL",{"_key":431,"_type":69,"marks":432,"text":433},"8597b1d265f72",[],". (Honestly, if anything is going to cause trouble, it will be this. The Homebrew installation on MacOS worked fine, and I don't have other systems with which to test. On Windows, MicroFocus has a free trial for Visual Studio COBOL and Azure support for experimentation.)",[435],{"_key":428,"_type":110,"href":436,"reference":12},"https:\u002F\u002Fopen-cobol.sourceforge.io\u002Ffaq\u002Findex.html#using-gnucobol",{"_key":438,"_type":65,"children":439,"markDefs":444,"style":73},"6ab3561dfe79",[440],{"_key":441,"_type":69,"marks":442,"text":443},"6ab3561dfe790",[],"There you are, you've installed everything and you're ready to write your first COBOL program. As is traditional, we'll start with the Ur-program, \"Hello, world\".",[],{"_key":446,"_type":53,"alt":12,"asset":447,"caption":57,"markDefs":12},"0ce4e03b4b95",{"_ref":448,"_type":56},"image-1720dc6fcc0c6957b6d72fc0534d83ec4181e10a-1600x920-png",{"_key":450,"_type":65,"children":451,"markDefs":456,"style":73},"024cafd1a5a0",[452],{"_key":453,"_type":69,"marks":454,"text":455},"024cafd1a5a00",[],"So here's your first surprise as a new COBOL programmer: COBOL cares about what column your code is in. In a traditional COBOL program, the source has several components:",[],{"_key":458,"_type":53,"alt":12,"asset":459,"caption":57,"markDefs":12},"f4b5586c060c",{"_ref":460,"_type":56},"image-ba2c6eefdc86de7b6ad65867f1d5110dd505fb19-1600x1237-jpg",{"_key":462,"_type":65,"children":463,"markDefs":468,"style":73},"32bcd1d6f53c",[464],{"_key":465,"_type":69,"marks":466,"text":467},"32bcd1d6f53c0",[],"Columns 1-6 are there for a sequence number. Column 7 is called the indicator area; in general, it's mostly used to indicate comments by putting an asterisk '*' in that column. Code then goes in columns 8 through 72, and columns 73-80 are basically free for the programmers use.",[],{"_key":470,"_type":65,"children":471,"markDefs":476,"style":73},"e8aabe8439f0",[472],{"_key":473,"_type":69,"marks":474,"text":475},"e8aabe8439f00",[],"This is all based around the days when we put our source into 80-column Hollerith cards.",[],{"_key":478,"_type":65,"children":479,"markDefs":484,"style":73},"362a47eb1375",[480],{"_key":481,"_type":69,"marks":482,"text":483},"362a47eb13750",[],"Modern COBOL compilers also accept a free format which doesn't force your code into the 80-column straitjacket, but a very large proportion of existing code is still in the card-image format. For right now, we'll stick with card images.",[],{"_key":486,"_type":65,"children":487,"markDefs":532,"style":73},"5927977aef31",[488,492,496,500,504,507,511,515,519,523,528],{"_key":489,"_type":69,"marks":490,"text":491},"5927977aef310",[],"Brace yourselves: COBOL is not a block-structured language like nearly any other language you've ever used. A major design goal for COBOL from the first was that it should be \"self-documenting\" with an English-like syntax. Instead of having functions or subroutines and blocks, we have ",{"_key":493,"_type":69,"marks":494,"text":495},"5927977aef311",[205],"divisions",{"_key":497,"_type":69,"marks":498,"text":499},"5927977aef312",[],", ",{"_key":501,"_type":69,"marks":502,"text":503},"5927977aef313",[205],"sections",{"_key":505,"_type":69,"marks":506,"text":499},"5927977aef314",[],{"_key":508,"_type":69,"marks":509,"text":510},"5927977aef315",[205],"paragraphs",{"_key":512,"_type":69,"marks":513,"text":514},"5927977aef316",[],", and ",{"_key":516,"_type":69,"marks":517,"text":518},"5927977aef317",[205],"statements",{"_key":520,"_type":69,"marks":521,"text":522},"5927977aef318",[],". (We'll see something almost like a subroutine with the ",{"_key":524,"_type":69,"marks":525,"text":527},"5927977aef319",[526],"code","PERFORM",{"_key":529,"_type":69,"marks":530,"text":531},"5927977aef3110",[]," verb below.)",[],{"_key":534,"_type":65,"children":535,"markDefs":540,"style":73},"4c0eb66a67cc",[536],{"_key":537,"_type":69,"marks":538,"text":539},"4c0eb66a67cc0",[],"Oh, right, we also have verbs for COBOL operators.",[],{"_key":542,"_type":65,"children":543,"markDefs":548,"style":73},"1ff2ca1fdaa1",[544],{"_key":545,"_type":69,"marks":546,"text":547},"1ff2ca1fdaa10",[],"Here's \"Hello, World\" in COBOL:",[],{"_key":550,"_type":526,"code":551,"markDefs":12},"04004d8670ff","       IDENTIFICATION DIVISION. \n       PROGRAM-ID. HELLO.\n       PROCEDURE DIVISION.\n           DISPLAY \"Hello, world\".\n       END PROGRAM HELLO.",{"_key":553,"_type":65,"children":554,"markDefs":559,"style":73},"dcf8509ab144",[555],{"_key":556,"_type":69,"marks":557,"text":558},"dcf8509ab1440",[],"Compared to some languages it's a little wordy, but honestly not so bad. Compare it to a simple Java version:",[],{"_key":561,"_type":526,"code":562,"markDefs":12},"d813e91654ca","public class Hello {\n\tpublic static void main(String[] args){\n\t\tSystem.out.println(\"Hello, world!\");\n\t}\n}",{"_key":564,"_type":65,"children":565,"markDefs":570,"style":73},"31a95de27bfb",[566],{"_key":567,"_type":69,"marks":568,"text":569},"31a95de27bfb0",[],"Like all \"Hello, world\" programs it doesn't do much—but if you've been told that it takes 90 lines to write a basic program in COBOL, well, you've been misled.",[],{"_key":572,"_type":65,"children":573,"markDefs":578,"style":73},"139906568c4d",[574],{"_key":575,"_type":69,"marks":576,"text":577},"139906568c4d0",[],"Now let's take the \"Hello world\" program apart for our first example.",[],{"_key":580,"_type":65,"children":581,"markDefs":586,"style":73},"92927331180d",[582],{"_key":583,"_type":69,"marks":584,"text":585},"92927331180d0",[],"The first line is:",[],{"_key":588,"_type":526,"code":589,"markDefs":12},"01cf3033a882","IDENTIFICATION DIVISION.",{"_key":591,"_type":65,"children":592,"markDefs":613,"style":73},"42b2ef5a756b",[593,597,601,605,609],{"_key":594,"_type":69,"marks":595,"text":596},"42b2ef5a756b0",[],"COBOL programs always have at least an identification division and a procedure division. The identification division has one important paragraph, the ",{"_key":598,"_type":69,"marks":599,"text":600},"42b2ef5a756b1",[526],"PROGRAM-ID",{"_key":602,"_type":69,"marks":603,"text":604},"42b2ef5a756b2",[],". You need to give the program a name here. The name doesn't need to correspond to the file name or pretty much anything, except when your COBOL program is being called from another COBOL program. This is through the ",{"_key":606,"_type":69,"marks":607,"text":608},"42b2ef5a756b3",[526],"CALL",{"_key":610,"_type":69,"marks":611,"text":612},"42b2ef5a756b4",[]," verb, which we're not going to cover.",[],{"_key":615,"_type":65,"children":616,"markDefs":621,"style":73},"ecdeaed0a443",[617],{"_key":618,"_type":69,"marks":619,"text":620},"ecdeaed0a4430",[],"We do need to have a program ID, so we add",[],{"_key":623,"_type":526,"code":624,"markDefs":12},"8d7268b4832a","IDENTIFICATION DIVISION.\nPROGRAM-ID. HELLO.",{"_key":626,"_type":65,"children":627,"markDefs":632,"style":73},"0b7a03c342ae",[628],{"_key":629,"_type":69,"marks":630,"text":631},"0b7a03c342ae0",[],"There are a lot of other things that commonly go into the identification division. I'll add a couple of common examples.",[],{"_key":634,"_type":526,"code":635,"markDefs":12},"9f19acc927aa","IDENTIFICATION DIVISION.\nPROGRAM-ID. HELLO.\nAUTHOR. CHARLES R MARTIN.\nDATE-WRITTEN. 2020-APR-11.",{"_key":637,"_type":65,"children":638,"markDefs":643,"style":73},"f19b7748c41a",[639],{"_key":640,"_type":69,"marks":641,"text":642},"f19b7748c41a0",[],"In modern environments, however, these are comments.",[],{"_key":645,"_type":65,"children":646,"markDefs":651,"style":73},"e2abc90047a0",[647],{"_key":648,"_type":69,"marks":649,"text":650},"e2abc90047a00",[],"Speaking of modern environments, by the way, COBOL doesn't require all-caps like I've been using. GnuCOBOL would be perfectly happy with",[],{"_key":653,"_type":526,"code":654,"markDefs":12},"ccc25e4d9463","       identification division.\n       program-id. tut2.\n       author. charlie martin.\n       procedure division.\n           display \"hello, world\".\n       end program tut2.",{"_key":656,"_type":65,"children":657,"markDefs":662,"style":73},"a81cda199b7c",[658],{"_key":659,"_type":69,"marks":660,"text":661},"a81cda199b7c0",[],"I'm just having a little misty-eyed nostalgia here.",[],{"_key":664,"_type":65,"children":665,"markDefs":677,"style":73},"bff5d3852424",[666,670,674],{"_key":667,"_type":69,"marks":668,"text":669},"bff5d38524240",[],"Don't judge me.So let's finish up our \"Hello, world.\" The execution part of a COBOL program is in the ",{"_key":671,"_type":69,"marks":672,"text":673},"bff5d38524241",[205],"procedure division",{"_key":675,"_type":69,"marks":676,"text":107},"bff5d38524242",[],[],{"_key":679,"_type":526,"code":551,"markDefs":12},"3be7e952e976",{"_key":681,"_type":65,"children":682,"markDefs":687,"style":73},"7db9be18ce54",[683],{"_key":684,"_type":69,"marks":685,"text":686},"7db9be18ce540",[],"There's one more bit of card-image format here. Notice that `DISPLAY \"Hello, world\"` is indented four columns. That's because the part from column 8-72 actually has two parts: the A section, from column 8-11, and the B section from column 12 on. Divisions, sections, and paragraphs need to start in the A section; code statements should start in the B section.",[],{"_key":689,"_type":65,"children":690,"markDefs":695,"style":186},"8db94572835c",[691],{"_key":692,"_type":69,"marks":693,"text":694},"8db94572835c0",[],"Extended COBOL Example",[],{"_key":697,"_type":65,"children":698,"markDefs":703,"style":73},"87cc63adadb0",[699],{"_key":700,"_type":69,"marks":701,"text":702},"87cc63adadb00",[],"Of course, \"Hello, World\" doesn't really give you a good picture for any language, so let's look a little deeper into COBOL with something that at least resembles a real business program. We're going to use a pretty common example: computing a paycheck for hourly employees, including computing Federal, State, and FICA tax.",[],{"_key":705,"_type":65,"children":706,"markDefs":711,"style":73},"3224cf979ef1",[707],{"_key":708,"_type":69,"marks":709,"text":710},"3224cf979ef10",[],"Having done it, I can tell you this is not an easy thing to do in reality—the tax tables are complex and arcane—so we're going to simplify and make the Federal tax rate 16.4 percent, state 7 percent, and fix the FICA rate at 6.2 percent while carefully choosing our pay rate and hours worked to not hit the FICA cap. We're only doing hourly workers, and we compute hours over 40 as overtime at 1.5 times the base rate.",[],{"_key":713,"_type":65,"children":714,"markDefs":727,"style":73},"126a69ca39dd",[715,719,723],{"_key":716,"_type":69,"marks":717,"text":718},"126a69ca39dd0",[],"No point in repeating the identification division. We start with a new division, the ",{"_key":720,"_type":69,"marks":721,"text":722},"126a69ca39dd1",[205],"environment division",{"_key":724,"_type":69,"marks":725,"text":726},"126a69ca39dd2",[],", which exists to collect the interface between the COBOL program and the outside world.",[],{"_key":729,"_type":526,"code":730,"markDefs":12},"3b65c4c8955c","       ENVIRONMENT DIVISION.\n       INPUT-OUTPUT SECTION.\n       FILE-CONTROL.\n           SELECT TIMECARDS\n               ASSIGN TO \"TIMECARDS.DAT\"\n                   ORGANIZATION IS LINE SEQUENTIAL.",{"_key":732,"_type":65,"children":733,"markDefs":753,"style":73},"84a7a37614f6",[734,738,742,746,750],{"_key":735,"_type":69,"marks":736,"text":737},"84a7a37614f60",[],"Once again, we're going to exercise some aspects of COBOL that will be surprising to people who haven't worked in the record-oriented world of data-processing. In UNIX, Linux, MacOS, or Windows, a ",{"_key":739,"_type":69,"marks":740,"text":741},"84a7a37614f61",[205],"record ",{"_key":743,"_type":69,"marks":744,"text":745},"84a7a37614f62",[],"is a line of text followed by some end of line character or characters. This causes a problem for traditional COBOL, but COBOL compilers implement a non-standard extension to handle this: ",{"_key":747,"_type":69,"marks":748,"text":749},"84a7a37614f63",[526],"ORGANIZATION IS LINE SEQUENTIAL",{"_key":751,"_type":69,"marks":752,"text":107},"84a7a37614f64",[],[],{"_key":755,"_type":65,"children":756,"markDefs":769,"style":73},"b9d33086a9c0",[757,761,765],{"_key":758,"_type":69,"marks":759,"text":760},"b9d33086a9c00",[],"The input-output section simply assigns a symbolic name (",{"_key":762,"_type":69,"marks":763,"text":764},"b9d33086a9c01",[526],"TIMECARDS",{"_key":766,"_type":69,"marks":767,"text":768},"b9d33086a9c02",[],") to the file and connects it to the file in the outside environment.",[],{"_key":771,"_type":65,"children":772,"markDefs":777,"style":73},"513383e80ae0",[773],{"_key":774,"_type":69,"marks":775,"text":776},"513383e80ae00",[],"The next part of the program describes the data we're working with. In COBOL, all data is generally presumed to be contained in fixed-format records. Those records have a hierarchical structure that's indicated by the level numbers: 01 is the top level, and subdivisions get higher numbers. I used 02, 03, and so forth, but that's arbitrary; we used to use 01, 05, and so on because it was easier to insert cards without repunching them all.",[],{"_key":779,"_type":65,"children":780,"markDefs":807,"style":73},"194e53dda8d2",[781,785,789,793,796,800,804],{"_key":782,"_type":69,"marks":783,"text":784},"194e53dda8d20",[],"But now we introduce another division, the ",{"_key":786,"_type":69,"marks":787,"text":788},"194e53dda8d21",[205],"data division",{"_key":790,"_type":69,"marks":791,"text":792},"194e53dda8d22",[],". As you probably guessed, this is for data. We're using two ",{"_key":794,"_type":69,"marks":795,"text":503},"194e53dda8d23",[205],{"_key":797,"_type":69,"marks":798,"text":799},"194e53dda8d24",[],". First is the",{"_key":801,"_type":69,"marks":802,"text":803},"194e53dda8d25",[205]," file section",{"_key":805,"_type":69,"marks":806,"text":107},"194e53dda8d26",[],[],{"_key":809,"_type":526,"code":810,"markDefs":12},"fee6e02d86a2","       DATA DIVISION.\n       FILE SECTION.\n           FD TIMECARDS.\n           01 TIMECARD.\n               02 EMPLOYEE-NAME.\n                   03 EMP-FIRSTNAME PIC X(10).\n                   03 EMP-SURNAME   PIC X(15).\n               02 HOURS-WORKED PIC 99V9.\n               02 PAY-RATE     PIC 99.",{"_key":812,"_type":65,"children":813,"markDefs":841,"style":73},"047f963cad04",[814,818,821,825,829,833,837],{"_key":815,"_type":69,"marks":816,"text":817},"047f963cad040",[],"This is our input, which is fixed format; we're connecting it to the ",{"_key":819,"_type":69,"marks":820,"text":764},"047f963cad041",[526],{"_key":822,"_type":69,"marks":823,"text":824},"047f963cad042",[]," file with the ",{"_key":826,"_type":69,"marks":827,"text":828},"047f963cad043",[526],"FD",{"_key":830,"_type":69,"marks":831,"text":832},"047f963cad044",[]," line. Following that is the ",{"_key":834,"_type":69,"marks":835,"text":836},"047f963cad045",[205],"working storage ",{"_key":838,"_type":69,"marks":839,"text":840},"047f963cad046",[],"section. It looks a little unfamiliar if you're not used to COBOL, but really, I'm just declaring variables I'll use in the program later.",[],{"_key":843,"_type":526,"code":844,"markDefs":12},"44e2f6b3a96d","       WORKING-STORAGE SECTION.\n      * temporary variables in computational usage.\n      *    intermediate values for computing paycheck with overtime\n           01 REGULAR-HOURS    PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-HOURS   PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-RATE    PIC 9(4)V99 USAGE COMP.\n           01 REGULAR-PAY      PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-PAY     PIC 9(4)V99 USAGE COMP.\n      *    computed parts of the paycheck\n           01 GROSS-PAY        PIC 9(4)V99 USAGE COMP.\n           01 FED-TAX          PIC 9(4)V99 USAGE COMP.\n           01 STATE-TAX        PIC 9(4)V99 USAGE COMP.\n           01 FICA-TAX         PIC 9(4)V99 USAGE COMP.\n           01 NET-PAY          PIC 9(4)V99 USAGE COMP.\n",{"_key":846,"_type":65,"children":847,"markDefs":908,"style":73},"bd5549c12a7e",[848,852,857,861,865,869,872,876,880,884,888,892,896,900,904],{"_key":849,"_type":69,"marks":850,"text":851},"bd5549c12a7e0",[],"The ",{"_key":853,"_type":69,"marks":854,"text":856},"bd5549c12a7e1",[855],"em","unfamiliar ",{"_key":858,"_type":69,"marks":859,"text":860},"bd5549c12a7e2",[],"part of this is the ",{"_key":862,"_type":69,"marks":863,"text":864},"bd5549c12a7e3",[526],"PIC",{"_key":866,"_type":69,"marks":867,"text":868},"bd5549c12a7e4",[]," (or PICTURE) clause. COBOL is not strongly typed at all. Instead, more like C, every declaration is identifying a piece of memory; the ",{"_key":870,"_type":69,"marks":871,"text":864},"bd5549c12a7e5",[526],{"_key":873,"_type":69,"marks":874,"text":875},"bd5549c12a7e6",[]," tells COBOL how to interpret that memory with a \"picture\". In this case, ",{"_key":877,"_type":69,"marks":878,"text":879},"bd5549c12a7e7",[526],"9(4)v99",{"_key":881,"_type":69,"marks":882,"text":883},"bd5549c12a7e8",[]," tells COBOL that a chunk of memory named, for example ",{"_key":885,"_type":69,"marks":886,"text":887},"bd5549c12a7e9",[526],"REGULAR-HOURS",{"_key":889,"_type":69,"marks":890,"text":891},"bd5549c12a7e10",[]," is to be interpreted as a six-digit number that is assumed to have a decimal point (the ",{"_key":893,"_type":69,"marks":894,"text":895},"bd5549c12a7e11",[526],"V",{"_key":897,"_type":69,"marks":898,"text":899},"bd5549c12a7e12",[],") in front of the last two digits. ",{"_key":901,"_type":69,"marks":902,"text":903},"bd5549c12a7e13",[526],"USAGE COMP",{"_key":905,"_type":69,"marks":906,"text":907},"bd5549c12a7e14",[]," tells COBOL to use an internal format that's suited to fast arithmetic. What that format actually is is somewhat flexible and depends on the architecture, which means you'd best not depend on it being the same everywhere.",[],{"_key":910,"_type":65,"children":911,"markDefs":930,"style":73},"e33670d9e431",[912,916,919,923,926],{"_key":913,"_type":69,"marks":914,"text":915},"e33670d9e4310",[],"If you want to be confident of this, don't use ",{"_key":917,"_type":69,"marks":918,"text":903},"e33670d9e4311",[526],{"_key":920,"_type":69,"marks":921,"text":922},"e33670d9e4312",[],", which leads to another part of the data, the format for a check to be output. These fields are the default usage, which is printable where ",{"_key":924,"_type":69,"marks":925,"text":903},"e33670d9e4313",[526],{"_key":927,"_type":69,"marks":928,"text":929},"e33670d9e4314",[]," is not.",[],{"_key":932,"_type":526,"code":933,"markDefs":12},"88560a2a6986","           01 PAYCHECK.\n               02 PRT-EMPLOYEE-NAME    PIC X(25).\n               02 FILLER               PIC X.\n               02 PRT-HOURS-WORKED     PIC 99.9.\n               02 FILLER               PIC X.\n               02 PRT-PAY-RATE         PIC 99.9.\n               02 PRT-GROSS-PAY        PIC $,$$9.99.\n               02 PRT-FED-TAX          PIC $,$$9.99.\n               02 PRT-STATE-TAX        PIC $,$$9.99.\n               02 PRT-FICA-TAX         PIC $,$$9.99.\n               02 FILLER               PIC X(5).\n               02 PRT-NET-PAY          PIC $*,**9.99.",{"_key":935,"_type":65,"children":936,"markDefs":964,"style":73},"a058b84f7a8a",[937,941,944,948,952,956,960],{"_key":938,"_type":69,"marks":939,"text":940},"a058b84f7a8a0",[],"The only really fun stuff here is that we have some new ",{"_key":942,"_type":69,"marks":943,"text":864},"a058b84f7a8a1",[526],{"_key":945,"_type":69,"marks":946,"text":947},"a058b84f7a8a2",[]," formats: ",{"_key":949,"_type":69,"marks":950,"text":951},"a058b84f7a8a3",[526],"$,$$9.99",{"_key":953,"_type":69,"marks":954,"text":955},"a058b84f7a8a4",[]," has a leading dollar sign that is always against the leftmost digit, and ",{"_key":957,"_type":69,"marks":958,"text":959},"a058b84f7a8a5",[526],"$*,**9.99",{"_key":961,"_type":69,"marks":962,"text":963},"a058b84f7a8a6",[]," fills the space between the dollar sign and the first digits with *.",[],{"_key":966,"_type":65,"children":967,"markDefs":979,"style":73},"e0c101050e42",[968,972,976],{"_key":969,"_type":69,"marks":970,"text":971},"e0c101050e420",[],"I'll show the entire program shortly, but I do want to point out the way COBOL does math, as in ",{"_key":973,"_type":69,"marks":974,"text":975},"e0c101050e421",[526],"COMPUTE-GROSS-PAY",{"_key":977,"_type":69,"marks":978,"text":131},"e0c101050e422",[],[],{"_key":981,"_type":526,"code":982,"markDefs":12},"71db34d3ac86","       COMPUTE-GROSS-PAY.\n           IF HOURS-WORKED > 40 THEN\n               MULTIPLY PAY-RATE BY 1.5 GIVING OVERTIME-RATE\n               MOVE 40 TO REGULAR-HOURS\n               SUBTRACT 40 FROM HOURS-WORKED GIVING OVERTIME-HOURS\n               MULTIPLY REGULAR-HOURS BY PAY-RATE GIVING REGULAR-PAY\n               MULTIPLY OVERTIME-HOURS BY OVERTIME-RATE\n                   GIVING OVERTIME-PAY\n               ADD REGULAR-PAY TO OVERTIME-PAY GIVING GROSS-PAY\n           ELSE\n               MULTIPLY HOURS-WORKED BY PAY-RATE GIVING GROSS-PAY\n           END-IF\n           .",{"_key":984,"_type":65,"children":985,"markDefs":990,"style":73},"266b6417ed37",[986],{"_key":987,"_type":69,"marks":988,"text":989},"266b6417ed370",[],"Yes, standard COBOL makes you spell it out.",[],{"_key":992,"_type":65,"children":993,"markDefs":998,"style":73},"408965007662",[994],{"_key":995,"_type":69,"marks":996,"text":997},"4089650076620",[],"So here's the full program.",[],{"_key":1000,"_type":526,"code":1001,"markDefs":12},"b350d5fb0b89","       IDENTIFICATION DIVISION.\n       PROGRAM-ID. PAYCHECKS.\n       AUTHOR. CHARLES R. MARTIN.\n       DATE-WRITTEN. 2020-APR-15.\n       ENVIRONMENT DIVISION.\n       INPUT-OUTPUT SECTION.\n       FILE-CONTROL.\n           SELECT TIMECARDS\n               ASSIGN TO \"TIMECARDS.DAT\"\n                   ORGANIZATION IS LINE SEQUENTIAL.\n       DATA DIVISION.\n       FILE SECTION.\n           FD TIMECARDS.\n           01 TIMECARD.\n               02 EMPLOYEE-NAME.\n                   03 EMP-FIRSTNAME PIC X(10).\n                   03 EMP-SURNAME   PIC X(15).\n               02 HOURS-WORKED PIC 99V9.\n               02 PAY-RATE     PIC 99.\n       WORKING-STORAGE SECTION.\n      * temporary variables in computational usage.\n      *    intermediate values for computing paycheck with overtime\n           01 REGULAR-HOURS    PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-HOURS   PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-RATE    PIC 9(4)V99 USAGE COMP.\n           01 REGULAR-PAY      PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-PAY     PIC 9(4)V99 USAGE COMP.\n      *    computed parts of the paycheck\n           01 GROSS-PAY        PIC 9(4)V99 USAGE COMP.\n           01 FED-TAX          PIC 9(4)V99 USAGE COMP.\n           01 STATE-TAX        PIC 9(4)V99 USAGE COMP.\n           01 FICA-TAX         PIC 9(4)V99 USAGE COMP.\n           01 NET-PAY          PIC 9(4)V99 USAGE COMP.\n      * print format of the check\n           01 PAYCHECK.\n               02 PRT-EMPLOYEE-NAME    PIC X(25).\n               02 FILLER               PIC X.\n               02 PRT-HOURS-WORKED     PIC 99.9.\n               02 FILLER               PIC X.\n               02 PRT-PAY-RATE         PIC 99.9.\n               02 PRT-GROSS-PAY        PIC $,$$9.99.\n               02 PRT-FED-TAX          PIC $,$$9.99.\n               02 PRT-STATE-TAX        PIC $,$$9.99.\n               02 PRT-FICA-TAX         PIC $,$$9.99.\n               02 FILLER               PIC X(5).\n               02 PRT-NET-PAY          PIC $*,**9.99.\n      * Tax rates -- 77 level aha！\n           77 Fed-tax-rate     Pic V999 Value Is .164 .\n           77 State-tax-rate   Pic V999 Value Is .070 .\n           77 Fica-tax-rate    Pic V999 Value Is .062 .\n      * 88 Level is for conditions.\n           01 END-FILE             PIC X.\n               88  EOF VALUE \"T\".\n       PROCEDURE DIVISION.\n       BEGIN.\n           PERFORM INITIALIZE-PROGRAM.\n           PERFORM PROCESS-LINE WITH TEST BEFORE UNTIL EOF\n           PERFORM CLEAN-UP.\n           STOP RUN.\n       INITIALIZE-PROGRAM.\n           OPEN INPUT TIMECARDS.\n       PROCESS-LINE.\n           READ TIMECARDS INTO TIMECARD\n               AT END MOVE \"T\" TO END-FILE.\n           IF NOT EOF THEN\n               PERFORM COMPUTE-GROSS-PAY\n               PERFORM COMPUTE-FED-TAX\n               PERFORM COMPUTE-STATE-TAX\n               PERFORM COMPUTE-FICA\n               PERFORM COMPUTE-NET-PAY\n               PERFORM PRINT-CHECK\n            END-IF.\n       COMPUTE-GROSS-PAY.\n           IF HOURS-WORKED > 40 THEN\n               MULTIPLY PAY-RATE BY 1.5 GIVING OVERTIME-RATE\n               MOVE 40 TO REGULAR-HOURS\n               SUBTRACT 40 FROM HOURS-WORKED GIVING OVERTIME-HOURS\n               MULTIPLY REGULAR-HOURS BY PAY-RATE GIVING REGULAR-PAY\n               MULTIPLY OVERTIME-HOURS BY OVERTIME-RATE\n                   GIVING OVERTIME-PAY\n               ADD REGULAR-PAY TO OVERTIME-PAY GIVING GROSS-PAY\n           ELSE\n               MULTIPLY HOURS-WORKED BY PAY-RATE GIVING GROSS-PAY\n           END-IF\n           .\n       COMPUTE-FED-TAX.\n           MULTIPLY GROSS-PAY BY FED-TAX-RATE GIVING FED-TAX\n           .\n       COMPUTE-STATE-TAX.\n      * Compute lets us use a more familiar syntax\n           COMPUTE STATE-TAX = GROSS-PAY * STATE-TAX-RATE\n           .\n       COMPUTE-FICA.\n           MULTIPLY GROSS-PAY BY FICA-TAX-RATE GIVING FICA-TAX\n           .\n       COMPUTE-NET-PAY.\n           SUBTRACT FED-TAX STATE-TAX FICA-TAX FROM GROSS-PAY\n               GIVING NET-PAY\n           .          \n       PRINT-CHECK.\n           MOVE EMPLOYEE-NAME  TO PRT-EMPLOYEE-NAME\n           MOVE HOURS-WORKED   TO PRT-HOURS-WORKED\n           MOVE PAY-RATE       TO PRT-PAY-RATE\n           MOVE GROSS-PAY      TO PRT-GROSS-PAY\n           MOVE FED-TAX        TO PRT-FED-TAX\n           MOVE STATE-TAX      TO PRT-STATE-TAX\n           MOVE FICA-TAX       TO PRT-FICA-TAX\n           MOVE NET-PAY        TO PRT-NET-PAY\n           DISPLAY PAYCHECK\n           .\n        CLEAN-UP.\n           CLOSE TIMECARDS.\n        END PROGRAM PAYCHECKS.",{"_key":1003,"_type":65,"children":1004,"markDefs":1009,"style":73},"3c0a3883dfc2",[1005],{"_key":1006,"_type":69,"marks":1007,"text":1008},"3c0a3883dfc20",[],"Here's the data file:",[],{"_key":1011,"_type":526,"code":1012,"markDefs":12},"1a0bca3a7465","Charlie   Martin         41015\nTerry     Lacy           32007",{"_key":1014,"_type":65,"children":1015,"markDefs":1020,"style":73},"5b78f542090c",[1016],{"_key":1017,"_type":69,"marks":1018,"text":1019},"5b78f542090c0",[],"and here's the output:",[],{"_key":1022,"_type":526,"code":1023,"markDefs":12},"2aef9252444d","$ cobc -x paycheck.cob \n$ .\u002Fpaycheck \nCharlie   Martin          41.0 15.0 $622.50 $102.09  $43.57  $38.59     $**438.25\nTerry     Lacy            32.0 07.0 $224.00  $36.73  $15.68  $13.88     $**157.71\n$",{"_key":1025,"_type":65,"children":1026,"markDefs":1031,"style":186},"9826fc345404",[1027],{"_key":1028,"_type":69,"marks":1029,"text":1030},"9826fc3454040",[],"Resources to learn COBOL",[],{"_key":1033,"_type":65,"children":1034,"markDefs":1039,"style":73},"7a9b90670171",[1035],{"_key":1036,"_type":69,"marks":1037,"text":1038},"7a9b906701710",[],"There are actually quite a number of courses and books to learn COBOL. Many of the courses are from overseas, because offshoring firms have been meeting the demand for COBOL for years.",[],{"_key":1041,"_type":65,"children":1042,"markDefs":1083,"style":73},"100551fcae5d",[1043,1047,1052,1056,1061,1065,1070,1074,1079],{"_key":1044,"_type":69,"marks":1045,"text":1046},"100551fcae5d0",[],"I bought and ran through ",{"_key":1048,"_type":69,"marks":1049,"text":1051},"100551fcae5d1",[1050],"abcea6dfaa87","this Udemy course",{"_key":1053,"_type":69,"marks":1054,"text":1055},"100551fcae5d2",[],", which is pretty good, and among several COBOL books on Kindle, I like ",{"_key":1057,"_type":69,"marks":1058,"text":1060},"100551fcae5d3",[1059],"2041fe555928","Beginning COBOL for Programmers",{"_key":1062,"_type":69,"marks":1063,"text":1064},"100551fcae5d4",[]," by Michael Coughlan. There are a mountain of YouTube videos, of which I only looked at a few. ",{"_key":1066,"_type":69,"marks":1067,"text":1069},"100551fcae5d5",[1068],"5f30664f394c","This one",{"_key":1071,"_type":69,"marks":1072,"text":1073},"100551fcae5d6",[]," seems good, but ",{"_key":1075,"_type":69,"marks":1076,"text":1078},"100551fcae5d7",[1077],"58927464445a","search for COBOL",{"_key":1080,"_type":69,"marks":1081,"text":1082},"100551fcae5d8",[]," and you'll find lots more.",[1084,1086,1088,1090],{"_key":1050,"_type":110,"href":1085,"reference":12},"https:\u002F\u002Fwww.udemy.com\u002Fcourse\u002Fmainframe-the-complete-cobol-course-from-beginner-to-expert\u002F",{"_key":1059,"_type":110,"href":1087,"reference":12},"https:\u002F\u002Fwww.amazon.com\u002FBeginning-COBOL-Programmers-Michael-Coughlan\u002Fdp\u002F1430262532",{"_key":1068,"_type":110,"href":1089,"reference":12},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=f3WVa2zyyGE",{"_key":1077,"_type":110,"href":1091,"reference":12},"https:\u002F\u002Fwww.youtube.com\u002Fresults?search_query=COBOL",{"_key":1093,"_type":65,"children":1094,"markDefs":1125,"style":73},"7372f18d1efb",[1095,1099,1104,1108,1113,1117,1122],{"_key":1096,"_type":69,"marks":1097,"text":1098},"7372f18d1efb0",[],"There will be more to come as well. On April 9th, IBM and the Open Mainframe Project ",{"_key":1100,"_type":69,"marks":1101,"text":1103},"7372f18d1efb1",[1102],"1a46daab4db3","announced a joint project",{"_key":1105,"_type":69,"marks":1106,"text":1107},"7372f18d1efb2",[]," to connect states with COBOL skills and to teach COBOL Programming. It has several resources, including a ",{"_key":1109,"_type":69,"marks":1110,"text":1112},"7372f18d1efb3",[1111],"cd1acec816d3","bulletin board for COBOL programmers",{"_key":1114,"_type":69,"marks":1115,"text":1116},"7372f18d1efb4",[]," who want to get back in the business, and the beginnings of ",{"_key":1118,"_type":69,"marks":1119,"text":1121},"7372f18d1efb5",[1120],"a9d8b69f7a88","an open source COBOL course",{"_key":1123,"_type":69,"marks":1124,"text":107},"7372f18d1efb6",[],[1126,1128,1130],{"_key":1102,"_type":110,"href":1127,"reference":12},"https:\u002F\u002Fnewsroom.ibm.com\u002F2020-04-09-IBM-and-Open-Mainframe-Project-Mobilize-to-Connect-States-with-COBOL-Skills",{"_key":1111,"_type":110,"href":1129,"reference":12},"https:\u002F\u002Fcommunity.openmainframeproject.org\u002Fc\u002Fcalling-all-cobol-programmers\u002F",{"_key":1120,"_type":110,"href":1131,"reference":12},"https:\u002F\u002Fgithub.com\u002Fopenmainframeproject",{"_key":1133,"_type":65,"children":1134,"markDefs":1139,"style":186},"3beddf2ea039",[1135],{"_key":1136,"_type":69,"marks":1137,"text":1138},"3beddf2ea0390",[],"Why does COBOL have a bad reputation?",[],{"_key":1141,"_type":65,"children":1142,"markDefs":1147,"style":73},"34852bc4e258",[1143],{"_key":1144,"_type":69,"marks":1145,"text":1146},"34852bc4e2580",[],"As you can see from this little example, COBOL is not like your normal programming language. You can't write a compiler or a kernel module in COBOL, and the syntax is not what we've grown to expect. But then consider another common domain-specific language: SQL. The syntax is kind of weird, and the semantics depend on relational algebra.",[],{"_key":1149,"_type":65,"children":1150,"markDefs":1155,"style":73},"afff3d232bb9",[1151],{"_key":1152,"_type":69,"marks":1153,"text":1154},"afff3d232bb90",[],"“Programming on the mainframe gives you a glimpse on how software used to be built,” said Ceballlos. “It’s like a time capsule for any modern programmer. Most of it is still very manual compared to modern DEVOPS and automation techniques.”",[],{"_key":1157,"_type":65,"children":1158,"markDefs":1163,"style":73},"b17b34283082",[1159],{"_key":1160,"_type":69,"marks":1161,"text":1162},"b17b342830820",[],"COBOL is, in a lot of ways, an antiquated, bad programming language. But for its particular domain, it's better than anything else.",[],true,"2020\u002F04\u002F20","The suddenly strained unemployment systems often run on a 60-year-old programming language, COBOL. So, how can you learn it, make big bucks, and save lots of state agencies that need new code to deal with all the new government stimulus programs?",{"_type":53,"asset":1168},{"_ref":1169,"_type":56},"image-9071e2dfef3edec6f4719afe499fbb56f97d1051-2122x1412-jpg",{"code":1171,"language":1172},"\u003C!-- wp:paragraph -->\n\u003Cp>Once upon a time, when the world and computers were new, I was in an Associate's Degree program for Data Processing—there were no \"computer science\" programs then—in which I had to study accounting, math, statistics, and three computer languages: IBM\u002F360 Basic Assembly Language, FORTRAN, and COBOL. By the 80's, students were being told that COBOL was a dead language, and no one was studying it any more.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Now, in 2020, \u003Ca href=\"https:\u002F\u002Fwww.cnn.com\u002F2020\u002F04\u002F08\u002Fbusiness\u002Fcoronavirus-cobol-programmers-new-jersey-trnd\u002Findex.html\">governments and banks\u003C\u002Fa> are \u003Ca href=\"http:\u002F\u002Fwww.kake.com\u002Fstory\u002F41983960\u002Funemployment-woes-continue-as-system-remains-overloaded\">pleading for COBOL\u003C\u002Fa> programmers, the \u003Ca href=\"https:\u002F\u002Fthenewstack.io\u002Fcobol-everywhere-will-maintain\u002F\">language that wouldn't die\u003C\u002Fa>.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Governor Laura Kelly of Kansas \u003Ca href=\"http:\u002F\u002Fwww.kake.com\u002Fstory\u002F41983960\u002Funemployment-woes-continue-as-system-remains-overloaded\">said\u003C\u002Fa>:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:quote -->\n\u003Cblockquote class=\"wp-block-quote\">\u003Cp>“So many of our Departments of Labor across the country are still on the COBOL system. You know very, very old technology,” Kelly said Tuesday. “Our Department of Labor had recognized that that was an issue and had initiated modernization, and, unfortunately, that's something that takes time. This (virus) interfered and they had to cease the transition to a much more robust system. So they're operating on really old stuff.”\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003C!-- \u002Fwp:quote -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>New Jersey Governor Phil Murphy \u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=HSVgHlSTPYQ\">made a television appearance\u003C\u002Fa> to plead for COBOL programmers to help.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>So, how can you learn COBOL, make big bucks, and save lots of state agencies that need new code to deal with all the new government stimulus programs?\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Let's find out.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>COBOL? What's this COBOL?\u003C\u002Fh2>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>COBOL stands for \u003Cspan style=\"text-decoration: underline;\">CO\u003C\u002Fspan>mmon \u003Cspan style=\"text-decoration: underline;\">B\u003C\u002Fspan>usiness \u003Cspan style=\"text-decoration: underline;\">O\u003C\u002Fspan>riented \u003Cspan style=\"text-decoration: underline;\">L\u003C\u002Fspan>anguage. One of the first of the high-level languages, it was put together by a group sponsored by the Department of Defense to develop a common business language. That group came to be called CODASYL—the Committee on Data Systems Languages—and defined a \"common business oriented language,\" drawing from Grace Hopper's FLOW-MATIC, and other languages including Univac's AIMACO and IBM's COMTRAN. The resulting language went through more revisions, but rapidly became the dominant language for building business systems, and it has remained dominant since.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Plenty of companies still use COBOL, including IBM, UPS, and Cigna. Mario Ceballos, a software engineer at Cigna, told me, “The syntax is kept simple to allow \u003Cstrong>non-programmers\u003C\u002Fstrong> (“The Business”) to read it and understand it. COBOL is meant to be explicit, because there shouldn’t be room for assumptions.”\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Of course, it has had its critics. In 1975, Edsgar Dijkstra \u003Ca href=\"https:\u002F\u002Fwww.goodreads.com\u002Fquotes\u002F496316-the-use-of-cobol-cripples-the-mind-its-teaching-should\">famously proclaimed\u003C\u002Fa> that “The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence[sic].\" This undoubtedly led to the decline of teaching COBOL in universities, but it remained the dominant business language.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>But finding people with COBOL skills can be tough. “The mainframe is a very difficult platform to learn, and that’s due to the cost,” said Ceballos. “Individuals do not have the money to pay to lease a mainframe. A very small amount of schools teach courses on mainframes and COBOL. When IBM started remote work and outsourcing, they stopped incentivizing American schools to teach courses in Mainframes and COBOL. The talent pool shifted from on-shore to off-shore.&nbsp; Any local talent will be expensive with their consulting fees.”\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>Why is COBOL still dominant?\u003C\u002Fh2>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Compared to common programming languages today, COBOL is different, and in some ways very limited: you can't do dynamic memory allocation, you can't easily access low-level features of the operating system or particular computer architecture. The most common forms of the language can't use recursion. You'd never want to write a compiler in COBOL. A computer science student presented with COBOL would be appalled.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>This is a category error. In modern terminology, COBOL is actually a \u003Ca href=\"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F809574\u002Fwhat-is-a-domain-specific-language-anybody-using-it-and-in-what-way\">domain-specific language\u003C\u002Fa>, specific to the particular domain of business programming. Robert Glass identified specific ways in which COBOL is better suited to business programming than general-purposes languages, among them:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:list -->\n\u003Cul>\u003Cli>A business-oriented language needs to declare, manage, and manipulate heterogenous data. Business programs mix fixed and variable length strings, floating-point, integer, and decimal data with wild abandon in complicated record structures, often with variable parts. Database programmers are familiar with some of these issues, and object-relational mapping tools trip over these complexities regularly.\u003C\u002Fli>\u003Cli>Business and financial data needs to be managed using true decimal data types. Accounting systems must be correct to the last decimal digit and need to reproduce exactly the results of hand-calculation; conventional floating-point numbers lead to complexities and errors.\u003C\u002Fli>\u003Cli>A business-oriented language needs to access and manipulate large amounts of record-structured data maintained externally.\u003C\u002Fli>\u003C\u002Ful>\n\u003C!-- \u002Fwp:list -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Now, none of this is beyond the capabilities of general-purpose programming languages, of course. But in COBOL, it's native to the language.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>We can debate the need for COBOL, but the fact is that hundreds of billions of lines of COBOL exist, and attempts to migrate away from COBOL have not generally been successful.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>Your first COBOL program\u003C\u002Fh2>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The source files are simple text files. Having a useful programming editor with language support is as convenient for COBOL as any other language, if not more so. The easiest thing for a beginner is to use \u003Ca href=\"https:\u002F\u002Fcode.visualstudio.com\u002F\">Visual Studio Code\u003C\u002Fa>, the only competitor for my affections since EMACS.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>There are surprisingly many VSCode extensions for COBOL. Right now, I'm using the \u003Ca href=\"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=bitlang.cobol\">bitlang\u003C\u002Fa> code colorizer and \u003Ca href=\"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=broadcomMFD.cobol-language-support\">Broadcom COBOL language support\u003C\u002Fa>. A lot of the others are intended for people programming in a mainframe environment, but that adds complexity we don't need for an introduction.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>So, to summarize, to begin to experiment with COBOL:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:list {\"ordered\":true} -->\n\u003Col>\u003Cli>Download and install Visual Studio Code if you haven't already.\u003C\u002Fli>\u003Cli>Install the \u003Ca href=\"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=bitlang.cobol\">bitlang.cobol\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=broadcomMFD.cobol-language-support\">Broadcom COBOL Language Support\u003C\u002Fa> extensions.&nbsp;\u003C\u002Fli>\u003Cli>Install \u003Ca href=\"https:\u002F\u002Fopen-cobol.sourceforge.io\u002Ffaq\u002Findex.html#using-gnucobol\">GnuCOBOL\u003C\u002Fa>. (Honestly, if anything is going to cause trouble, it will be this. The Homebrew installation on MacOS worked fine, and I don't have other systems with which to test. On Windows, MicroFocus has a free trial for Visual Studio COBOL and Azure support for experimentation.)\u003C\u002Fli>\u003C\u002Fol>\n\u003C!-- \u002Fwp:list -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>There you are, you've installed everything and you're ready to write your first COBOL program. As is traditional, we'll start with the Ur-program, \"Hello, world\".\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph {\"align\":\"center\"} -->\n\u003Cp class=\"has-text-align-center\">\u003Cimg width=\"624\" height=\"359\" src=\"https:\u002F\u002Flh6.googleusercontent.com\u002FmPe_4eeFaPBXxQ3dOLE1aeYe-dvcLy5rcdVDsoHBfbcXc4D-F0AiEnMiQc1zh5nX6qHIE0IEBZTmfyI6IozPNK2XlvKvtn8RpRRnF-FW-CBSoZfBEX3fWv1-dSDbHQ\">\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>So here's your first surprise as a new COBOL programmer: COBOL cares about what column your code is in. In a traditional COBOL program, the source has several components:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:image -->\n\u003Cfigure class=\"wp-block-image\">\u003Cimg src=\"https:\u002F\u002Flh5.googleusercontent.com\u002F9_07Ebnz1KHuHr8HubLF_YPmbM8_eshMb-m5YD6GmmZRAx3Tt4WgV1gATxRJ0o2_DyY-T0XYwsL2QbNzofAbgdtydq-l9oBGsAsBtYBGJEbrAsDNJRZCX3oyHXB3-A\" alt=\"\"\u002F>\u003C\u002Ffigure>\n\u003C!-- \u002Fwp:image -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Columns 1-6 are there for a sequence number. Column 7 is called the indicator area; in general, it's mostly used to indicate comments by putting an asterisk '*' in that column. Code then goes in columns 8 through 72, and columns 73-80 are basically free for the programmers use.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>This is all based around the days when we put our source into 80-column Hollerith cards.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Modern COBOL compilers also accept a free format which doesn't force your code into the 80-column straitjacket, but a very large proportion of existing code is still in the card-image format. For right now, we'll stick with card images.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Brace yourselves: COBOL is not a block-structured language like nearly any other language you've ever used. A major design goal for COBOL from the first was that it should be \"self-documenting\" with an English-like syntax. Instead of having functions or subroutines and blocks, we have \u003Cstrong>divisions\u003C\u002Fstrong>, \u003Cstrong>sections\u003C\u002Fstrong>, \u003Cstrong>paragraphs\u003C\u002Fstrong>, and \u003Cstrong>statements\u003C\u002Fstrong>. (We'll see something almost like a subroutine with the \u003Ccode>PERFORM\u003C\u002Fcode> verb below.)\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Oh, right, we also have verbs for COBOL operators.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Here's \"Hello, World\" in COBOL:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>       IDENTIFICATION DIVISION. \n       PROGRAM-ID. HELLO.\n       PROCEDURE DIVISION.\n           DISPLAY \"Hello, world\".\n       END PROGRAM HELLO.\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Compared to some languages it's a little wordy, but honestly not so bad. Compare it to a simple Java version:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>public class Hello {\n\tpublic static void main(String&#91;] args){\n\t\tSystem.out.println(\"Hello, world!\");\n\t}\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Like all \"Hello, world\" programs it doesn't do much—but if you've been told that it takes 90 lines to write a basic program in COBOL, well, you've been misled.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Now let's take the \"Hello world\" program apart for our first example.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The first line is:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:preformatted -->\n\u003Cpre class=\"wp-block-preformatted\">IDENTIFICATION DIVISION.\u003C\u002Fpre>\n\u003C!-- \u002Fwp:preformatted -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>COBOL programs always have at least an identification division and a procedure division. The identification division has one important paragraph, the \u003Ccode>PROGRAM-ID\u003C\u002Fcode>. You need to give the program a name here. The name doesn't need to correspond to the file name or pretty much anything, except when your COBOL program is being called from another COBOL program. This is through the \u003Ccode>CALL\u003C\u002Fcode> verb, which we're not going to cover.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>We do need to have a program ID, so we add\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>IDENTIFICATION DIVISION.\nPROGRAM-ID. HELLO.\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>There are a lot of other things that commonly go into the identification division. I'll add a couple of common examples.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>IDENTIFICATION DIVISION.\nPROGRAM-ID. HELLO.\nAUTHOR. CHARLES R MARTIN.\nDATE-WRITTEN. 2020-APR-11.\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>In modern environments, however, these are comments.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Speaking of modern environments, by the way, COBOL doesn't require all-caps like I've been using. GnuCOBOL would be perfectly happy with\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>       identification division.\n       program-id. tut2.\n       author. charlie martin.\n       procedure division.\n           display \"hello, world\".\n       end program tut2.\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>I'm just having a little misty-eyed nostalgia here.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Don't judge me.So let's finish up our \"Hello, world.\" The execution part of a COBOL program is in the \u003Cstrong>procedure division\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>       IDENTIFICATION DIVISION. \n       PROGRAM-ID. HELLO.\n       PROCEDURE DIVISION.\n           DISPLAY \"Hello, world\".\n       END PROGRAM HELLO.\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>There's one more bit of card-image format here. Notice that `DISPLAY \"Hello, world\"` is indented four columns. That's because the part from column 8-72 actually has two parts: the A section, from column 8-11, and the B section from column 12 on. Divisions, sections, and paragraphs need to start in the A section; code statements should start in the B section.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>Extended COBOL Example\u003C\u002Fh2>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Of course, \"Hello, World\" doesn't really give you a good picture for any language, so let's look a little deeper into COBOL with something that at least resembles a real business program. We're going to use a pretty common example: computing a paycheck for hourly employees, including computing Federal, State, and FICA tax.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Having done it, I can tell you this is not an easy thing to do in reality—the tax tables are complex and arcane—so we're going to simplify and make the Federal tax rate 16.4 percent, state 7 percent, and fix the FICA rate at 6.2 percent while carefully choosing our pay rate and hours worked to not hit the FICA cap. We're only doing hourly workers, and we compute hours over 40 as overtime at 1.5 times the base rate.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>No point in repeating the identification division. We start with a new division, the \u003Cstrong>environment division\u003C\u002Fstrong>, which exists to collect the interface between the COBOL program and the outside world.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>       ENVIRONMENT DIVISION.\n       INPUT-OUTPUT SECTION.\n       FILE-CONTROL.\n           SELECT TIMECARDS\n               ASSIGN TO \"TIMECARDS.DAT\"\n                   ORGANIZATION IS LINE SEQUENTIAL.\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Once again, we're going to exercise some aspects of COBOL that will be surprising to people who haven't worked in the record-oriented world of data-processing. In UNIX, Linux, MacOS, or Windows, a \u003Cstrong>record \u003C\u002Fstrong>is a line of text followed by some end of line character or characters. This causes a problem for traditional COBOL, but COBOL compilers implement a non-standard extension to handle this: \u003Ccode>ORGANIZATION IS LINE SEQUENTIAL\u003C\u002Fcode>.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The input-output section simply assigns a symbolic name (\u003Ccode>TIMECARDS\u003C\u002Fcode>) to the file and connects it to the file in the outside environment.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The next part of the program describes the data we're working with. In COBOL, all data is generally presumed to be contained in fixed-format records. Those records have a hierarchical structure that's indicated by the level numbers: 01 is the top level, and subdivisions get higher numbers. I used 02, 03, and so forth, but that's arbitrary; we used to use 01, 05, and so on because it was easier to insert cards without repunching them all.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>But now we introduce another division, the \u003Cstrong>data division\u003C\u002Fstrong>. As you probably guessed, this is for data. We're using two \u003Cstrong>sections\u003C\u002Fstrong>. First is the\u003Cstrong> file section\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>       DATA DIVISION.\n       FILE SECTION.\n           FD TIMECARDS.\n           01 TIMECARD.\n               02 EMPLOYEE-NAME.\n                   03 EMP-FIRSTNAME PIC X(10).\n                   03 EMP-SURNAME   PIC X(15).\n               02 HOURS-WORKED PIC 99V9.\n               02 PAY-RATE     PIC 99.\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>This is our input, which is fixed format; we're connecting it to the \u003Ccode>TIMECARDS\u003C\u002Fcode> file with the \u003Ccode>FD\u003C\u002Fcode> line. Following that is the \u003Cstrong>working storage \u003C\u002Fstrong>section. It looks a little unfamiliar if you're not used to COBOL, but really, I'm just declaring variables I'll use in the program later.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>       WORKING-STORAGE SECTION.\n      * temporary variables in computational usage.\n      *    intermediate values for computing paycheck with overtime\n           01 REGULAR-HOURS    PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-HOURS   PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-RATE    PIC 9(4)V99 USAGE COMP.\n           01 REGULAR-PAY      PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-PAY     PIC 9(4)V99 USAGE COMP.\n      *    computed parts of the paycheck\n           01 GROSS-PAY        PIC 9(4)V99 USAGE COMP.\n           01 FED-TAX          PIC 9(4)V99 USAGE COMP.\n           01 STATE-TAX        PIC 9(4)V99 USAGE COMP.\n           01 FICA-TAX         PIC 9(4)V99 USAGE COMP.\n           01 NET-PAY          PIC 9(4)V99 USAGE COMP.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The \u003Cem>unfamiliar \u003C\u002Fem>part of this is the \u003Ccode>PIC\u003C\u002Fcode> (or PICTURE) clause. COBOL is not strongly typed at all. Instead, more like C, every declaration is identifying a piece of memory; the \u003Ccode>PIC\u003C\u002Fcode> tells COBOL how to interpret that memory with a \"picture\". In this case, \u003Ccode>9(4)v99\u003C\u002Fcode> tells COBOL that a chunk of memory named, for example \u003Ccode>REGULAR-HOURS\u003C\u002Fcode> is to be interpreted as a six-digit number that is assumed to have a decimal point (the \u003Ccode>V\u003C\u002Fcode>) in front of the last two digits. \u003Ccode>USAGE COMP\u003C\u002Fcode> tells COBOL to use an internal format that's suited to fast arithmetic. What that format actually is is somewhat flexible and depends on the architecture, which means you'd best not depend on it being the same everywhere.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>If you want to be confident of this, don't use \u003Ccode>USAGE COMP\u003C\u002Fcode>, which leads to another part of the data, the format for a check to be output. These fields are the default usage, which is printable where \u003Ccode>USAGE COMP\u003C\u002Fcode> is not.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>           01 PAYCHECK.\n               02 PRT-EMPLOYEE-NAME    PIC X(25).\n               02 FILLER               PIC X.\n               02 PRT-HOURS-WORKED     PIC 99.9.\n               02 FILLER               PIC X.\n               02 PRT-PAY-RATE         PIC 99.9.\n               02 PRT-GROSS-PAY        PIC $,$$9.99.\n               02 PRT-FED-TAX          PIC $,$$9.99.\n               02 PRT-STATE-TAX        PIC $,$$9.99.\n               02 PRT-FICA-TAX         PIC $,$$9.99.\n               02 FILLER               PIC X(5).\n               02 PRT-NET-PAY          PIC $*,**9.99.\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The only really fun stuff here is that we have some new \u003Ccode>PIC\u003C\u002Fcode> formats: \u003Ccode>$,$$9.99\u003C\u002Fcode> has a leading dollar sign that is always against the leftmost digit, and \u003Ccode>$*,**9.99\u003C\u002Fcode> fills the space between the dollar sign and the first digits with *.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>I'll show the entire program shortly, but I do want to point out the way COBOL does math, as in \u003Ccode>COMPUTE-GROSS-PAY\u003C\u002Fcode>:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>       COMPUTE-GROSS-PAY.\n           IF HOURS-WORKED > 40 THEN\n               MULTIPLY PAY-RATE BY 1.5 GIVING OVERTIME-RATE\n               MOVE 40 TO REGULAR-HOURS\n               SUBTRACT 40 FROM HOURS-WORKED GIVING OVERTIME-HOURS\n               MULTIPLY REGULAR-HOURS BY PAY-RATE GIVING REGULAR-PAY\n               MULTIPLY OVERTIME-HOURS BY OVERTIME-RATE\n                   GIVING OVERTIME-PAY\n               ADD REGULAR-PAY TO OVERTIME-PAY GIVING GROSS-PAY\n           ELSE\n               MULTIPLY HOURS-WORKED BY PAY-RATE GIVING GROSS-PAY\n           END-IF\n           .\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Yes, standard COBOL makes you spell it out.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>So here's the full program.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>       IDENTIFICATION DIVISION.\n       PROGRAM-ID. PAYCHECKS.\n       AUTHOR. CHARLES R. MARTIN.\n       DATE-WRITTEN. 2020-APR-15.\n       ENVIRONMENT DIVISION.\n       INPUT-OUTPUT SECTION.\n       FILE-CONTROL.\n           SELECT TIMECARDS\n               ASSIGN TO \"TIMECARDS.DAT\"\n                   ORGANIZATION IS LINE SEQUENTIAL.\n       DATA DIVISION.\n       FILE SECTION.\n           FD TIMECARDS.\n           01 TIMECARD.\n               02 EMPLOYEE-NAME.\n                   03 EMP-FIRSTNAME PIC X(10).\n                   03 EMP-SURNAME   PIC X(15).\n               02 HOURS-WORKED PIC 99V9.\n               02 PAY-RATE     PIC 99.\n       WORKING-STORAGE SECTION.\n      * temporary variables in computational usage.\n      *    intermediate values for computing paycheck with overtime\n           01 REGULAR-HOURS    PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-HOURS   PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-RATE    PIC 9(4)V99 USAGE COMP.\n           01 REGULAR-PAY      PIC 9(4)V99 USAGE COMP.\n           01 OVERTIME-PAY     PIC 9(4)V99 USAGE COMP.\n      *    computed parts of the paycheck\n           01 GROSS-PAY        PIC 9(4)V99 USAGE COMP.\n           01 FED-TAX          PIC 9(4)V99 USAGE COMP.\n           01 STATE-TAX        PIC 9(4)V99 USAGE COMP.\n           01 FICA-TAX         PIC 9(4)V99 USAGE COMP.\n           01 NET-PAY          PIC 9(4)V99 USAGE COMP.\n      * print format of the check\n           01 PAYCHECK.\n               02 PRT-EMPLOYEE-NAME    PIC X(25).\n               02 FILLER               PIC X.\n               02 PRT-HOURS-WORKED     PIC 99.9.\n               02 FILLER               PIC X.\n               02 PRT-PAY-RATE         PIC 99.9.\n               02 PRT-GROSS-PAY        PIC $,$$9.99.\n               02 PRT-FED-TAX          PIC $,$$9.99.\n               02 PRT-STATE-TAX        PIC $,$$9.99.\n               02 PRT-FICA-TAX         PIC $,$$9.99.\n               02 FILLER               PIC X(5).\n               02 PRT-NET-PAY          PIC $*,**9.99.\n      * Tax rates -- 77 level aha！\n           77 Fed-tax-rate     Pic V999 Value Is .164 .\n           77 State-tax-rate   Pic V999 Value Is .070 .\n           77 Fica-tax-rate    Pic V999 Value Is .062 .\n      * 88 Level is for conditions.\n           01 END-FILE             PIC X.\n               88  EOF VALUE \"T\".\n       PROCEDURE DIVISION.\n       BEGIN.\n           PERFORM INITIALIZE-PROGRAM.\n           PERFORM PROCESS-LINE WITH TEST BEFORE UNTIL EOF\n           PERFORM CLEAN-UP.\n           STOP RUN.\n       INITIALIZE-PROGRAM.\n           OPEN INPUT TIMECARDS.\n       PROCESS-LINE.\n           READ TIMECARDS INTO TIMECARD\n               AT END MOVE \"T\" TO END-FILE.\n           IF NOT EOF THEN\n               PERFORM COMPUTE-GROSS-PAY\n               PERFORM COMPUTE-FED-TAX\n               PERFORM COMPUTE-STATE-TAX\n               PERFORM COMPUTE-FICA\n               PERFORM COMPUTE-NET-PAY\n               PERFORM PRINT-CHECK\n            END-IF.\n       COMPUTE-GROSS-PAY.\n           IF HOURS-WORKED > 40 THEN\n               MULTIPLY PAY-RATE BY 1.5 GIVING OVERTIME-RATE\n               MOVE 40 TO REGULAR-HOURS\n               SUBTRACT 40 FROM HOURS-WORKED GIVING OVERTIME-HOURS\n               MULTIPLY REGULAR-HOURS BY PAY-RATE GIVING REGULAR-PAY\n               MULTIPLY OVERTIME-HOURS BY OVERTIME-RATE\n                   GIVING OVERTIME-PAY\n               ADD REGULAR-PAY TO OVERTIME-PAY GIVING GROSS-PAY\n           ELSE\n               MULTIPLY HOURS-WORKED BY PAY-RATE GIVING GROSS-PAY\n           END-IF\n           .\n       COMPUTE-FED-TAX.\n           MULTIPLY GROSS-PAY BY FED-TAX-RATE GIVING FED-TAX\n           .\n       COMPUTE-STATE-TAX.\n      * Compute lets us use a more familiar syntax\n           COMPUTE STATE-TAX = GROSS-PAY * STATE-TAX-RATE\n           .\n       COMPUTE-FICA.\n           MULTIPLY GROSS-PAY BY FICA-TAX-RATE GIVING FICA-TAX\n           .\n       COMPUTE-NET-PAY.\n           SUBTRACT FED-TAX STATE-TAX FICA-TAX FROM GROSS-PAY\n               GIVING NET-PAY\n           .          \n       PRINT-CHECK.\n           MOVE EMPLOYEE-NAME  TO PRT-EMPLOYEE-NAME\n           MOVE HOURS-WORKED   TO PRT-HOURS-WORKED\n           MOVE PAY-RATE       TO PRT-PAY-RATE\n           MOVE GROSS-PAY      TO PRT-GROSS-PAY\n           MOVE FED-TAX        TO PRT-FED-TAX\n           MOVE STATE-TAX      TO PRT-STATE-TAX\n           MOVE FICA-TAX       TO PRT-FICA-TAX\n           MOVE NET-PAY        TO PRT-NET-PAY\n           DISPLAY PAYCHECK\n           .\n        CLEAN-UP.\n           CLOSE TIMECARDS.\n        END PROGRAM PAYCHECKS.\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Here's the data file:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Charlie   Martin         41015\nTerry     Lacy           32007\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>and here's the output:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>$ cobc -x paycheck.cob \n$ .\u002Fpaycheck \nCharlie   Martin          41.0 15.0 $622.50 $102.09  $43.57  $38.59     $**438.25\nTerry     Lacy            32.0 07.0 $224.00  $36.73  $15.68  $13.88     $**157.71\n$\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C!-- \u002Fwp:code -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>Resources to learn COBOL\u003C\u002Fh2>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>There are actually quite a number of courses and books to learn COBOL. Many of the courses are from overseas, because offshoring firms have been meeting the demand for COBOL for years.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>I bought and ran through \u003Ca href=\"https:\u002F\u002Fwww.udemy.com\u002Fcourse\u002Fmainframe-the-complete-cobol-course-from-beginner-to-expert\u002F\">this Udemy course\u003C\u002Fa>, which is pretty good, and among several COBOL books on Kindle, I like \u003Ca href=\"https:\u002F\u002Fwww.amazon.com\u002FBeginning-COBOL-Programmers-Michael-Coughlan\u002Fdp\u002F1430262532\">Beginning COBOL for Programmers\u003C\u002Fa> by Michael Coughlan. There are a mountain of YouTube videos, of which I only looked at a few. \u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=f3WVa2zyyGE\">This one\u003C\u002Fa> seems good, but \u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fresults?search_query=COBOL\">search for COBOL\u003C\u002Fa> and you'll find lots more.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>There will be more to come as well. On April 9th, IBM and the Open Mainframe Project \u003Ca href=\"https:\u002F\u002Fnewsroom.ibm.com\u002F2020-04-09-IBM-and-Open-Mainframe-Project-Mobilize-to-Connect-States-with-COBOL-Skills\">announced a joint project\u003C\u002Fa> to connect states with COBOL skills and to teach COBOL Programming. It has several resources, including a \u003Ca href=\"https:\u002F\u002Fcommunity.openmainframeproject.org\u002Fc\u002Fcalling-all-cobol-programmers\u002F\">bulletin board for COBOL programmers\u003C\u002Fa> who want to get back in the business, and the beginnings of \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fopenmainframeproject\">an open source COBOL course\u003C\u002Fa>.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>Why does COBOL have a bad reputation?\u003C\u002Fh2>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>As you can see from this little example, COBOL is not like your normal programming language. You can't write a compiler or a kernel module in COBOL, and the syntax is not what we've grown to expect. But then consider another common domain-specific language: SQL. The syntax is kind of weird, and the semantics depend on relational algebra.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>&nbsp;“Programming on the mainframe gives you a glimpse on how software used to be built,” said Ceballlos. “It’s like a time capsule for any modern programmer. Most of it is still very manual compared to modern DEVOPS and automation techniques.”\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>COBOL is, in a lot of ways, an antiquated, bad programming language. But for its particular domain, it's better than anything else.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->","html","2020-04-20T17:17:00.000Z",{"current":1175},"brush-up-your-cobol-why-is-a-60-year-old-language-suddenly-in-demand",[1177,1185,1187,1191,1196,1201],{"_createdAt":1178,"_id":1179,"_rev":1180,"_type":1181,"_updatedAt":1178,"slug":1182,"title":1184},"2023-05-23T16:43:21Z","wp-tagcat-bulletin","9HpbCsT2tq0xwozQfkc4ih","blogTag",{"current":1183},"bulletin","Bulletin",{"_createdAt":1178,"_id":1179,"_rev":1180,"_type":1181,"_updatedAt":1178,"slug":1186,"title":1184},{"current":1183},{"_createdAt":1178,"_id":1188,"_rev":1180,"_type":1181,"_updatedAt":1178,"slug":1189,"title":1190},"wp-tagcat-cobol",{"current":1190},"cobol",{"_createdAt":1178,"_id":1192,"_rev":1180,"_type":1181,"_updatedAt":1178,"slug":1193,"title":1195},"wp-tagcat-code-for-a-living",{"current":1194},"code-for-a-living","Code for a Living",{"_createdAt":1178,"_id":1197,"_rev":1180,"_type":1181,"_updatedAt":1178,"slug":1198,"title":1200},"wp-tagcat-stackoverflow",{"current":1199},"stackoverflow","Stackoverflow",{"_createdAt":1178,"_id":1197,"_rev":1180,"_type":1181,"_updatedAt":1178,"slug":1202,"title":1200},{"current":1199},"Brush up your COBOL: Why is a 60 year old language suddenly in demand?",[1205,1211,1217,1223],{"_id":1206,"publishedAt":1207,"slug":1208,"sponsored":12,"title":1210},"76c9771b-34e6-4d98-8641-ecefc711f0ef","2026-07-06T15:23:34.559Z",{"_type":10,"current":1209},"when-the-sensor-starts-thinking-snortml-agentic-ai-and-the-evolving-architecture-of-intrusion-detection","When the sensor starts thinking: SnortML, agentic AI, and the evolving architecture of intrusion detection",{"_id":1212,"publishedAt":1213,"slug":1214,"sponsored":12,"title":1216},"28e560af-f0aa-4d46-bd90-f435ad604aa7","2026-06-26T14:00:27.102Z",{"_type":10,"current":1215},"paging-charity-how-can-engineering-leaders-avoid-becoming-bond-villains","Paging Charity! How can engineering leaders avoid becoming Bond villains?",{"_id":1218,"publishedAt":1219,"slug":1220,"sponsored":12,"title":1222},"4b22c2a3-3779-4966-93eb-5230391dbdce","2026-06-23T14:08:58.595Z",{"_type":10,"current":1221},"your-ai-shipped-a-backend-that-boots-that-is-the-whole-problem","Your AI shipped a backend that boots. That is the whole problem.",{"_id":1224,"publishedAt":1225,"slug":1226,"sponsored":12,"title":1228},"5cf362e1-fe7b-45af-b69c-914731c6a052","2026-06-23T14:00:00.000Z",{"_type":10,"current":1227},"the-2026-developer-survey-is-now-open-for-human-developers-only","The 2026 Developer Survey is now open (for human developers only)!",{"data":1230,"sourceMap":-1},{"count":1231,"lastTimestamp":1232},165,"2024-01-12T16:32:03Z"]