Oblac

Ko boli Kobol

11 min

COBOL. Članak koji sam napisao za StartIt, malko poboljšan; da ostane i ovde.

Ovih dana se u nemalom broju američkih država pojavila hitna potražnja za COBOL programerima. S obzirom da je reč o programskom jeziku koji je koncipiran krajem 50-tih godina prošlog veka - pre nekih 60 godina - ovakva potražnja predstavlja neobičan presedan.

Zašto COBOL

Krenimo ispočetka. COBOL je jezik koji je 60-tih korišćen na mainframe računarima, mahom u poslovnim sistemima: bankama, ili sistemima koje koriste uprave država. Ovi kompjuterski sistemi, od kojih su neki napravljeni 70-tih, još uvek su u upotrebi. Prema Reuters-ovom izveštaju iz 2017. više od 40% američkih bankarskih sistema još uvek radi u COBOL-u; preko 80% transakcija karticama se obavlja uz pomoć COBOL koda, a 95% ATM aparata je kodirano ovim jezikom. Sumarno, to je nekih 220 milijardi programskih linija COBOL koda koji je još uvek u upotrebi - samo u Americi.

COBOL je dizajniran par godina nakon FORTRAN-a, jezika kojeg su koristili mahom inženjeri; na dosta načina ova dva jezika liče jedan na drugi (što je ujedno i nekakav uvid u to davno doba softverskog razvoja). Ideja iza COBOLa je bila na mestu: stvoriti standardizovani poslovni kompjuterski jezik koji će se koristiti na širokom spektru računara; dakle, portabilan jezik za obradu podataka. Iz te namere dolazi i njegovo ime: COmputer Business Oriented Language. Na razvoju jezika su radili predstavnici korporacija, ali i ministarstvo odbrane Sjedinjenih Država. COBOL je trebalo da bude privremeno rešenje, usputna stanica; no pomenuto ministartstvo je pasivno-agresivno forsiralo proizvođače računara da pružaju podršku za COBOL, odbijajući da iznajme ili kupe sistem koji ne bi imao COBOL kompajler - ukoliko ne dokažu da on na neki način narušava performanse sistema. Za svega godinu dana, COBOL kreće na neumitan put da se susretne sa svojom sudbinom - i postane industrijski standard, i - možda - najkorišćeniji programski jezik ikada.

Jezik je ubrzo doživeo prva poboljšanja, kao što je bila mogućnost kreiranja izveštaja, što ga je učinilo još popularnijim. Krajem 60tih nastaje i prvi ANSI standard jezika; od tada je standard doživeo nekoliko revizija i dopuna, na svakih, ugrubo, desetak godina. Poslednja revizija je bila 2014., što i nije tako davno. COBOL je jedan od prvih kompjuterskih jezika “višeg nivoa”, u kome se program piše rečnikom koji više liči na govorni (engleski) nego na mašinske komande, što je za to vreme bila novina i vredna stvar. Takođe ima jaku podršku za procesiranje podataka ugrađenu u sam jezik; zamenjuje veliku količinu posla baratanja podacima koja se u to doba radila mahom ručno. Jezik su podržavali proizvođači mainframe računara, među kojima se izdvaja IBM; on nastavlja da do danas proizvodi nove verzije mainframe rešenja. Sve je to dovelo do toga da se COBOL usadi u velikom broju kompjuterskih sistema nastalim u narednim dekadama, od kojih neki obavljaju neumoljivo važne poslovne ili državne funkcije.

COBOL kao programski jezik

COBOL je, u suštini, jednostavan programski jezik. Ta jednostavnost, na svoj način, održava sve te milijarde linija koda; čineći ga jasnim, i usudio bih se reći, manjim otpornim na propuste. Da ne bude zabune: greši se podjednako u COBOLu kao i u bilo kom drugom modernom jeziku, ali samo odsustvo kompleksnijih koncepata čini jezik otpornijim, te stoga i lakšim za razumevanje i održavanje. Kako se COBOL razvijao, tako je uključivao i složenije koncepte; objektno-orijentisana svojstva stiče, na primer, u izdanju iz 2002. godine.

Danas nam program pisan u COBOLu izgleda rogobatno, čak i na trenutke bolno. Sintaksa je vrlo ‘pričljiva’, dokumentacija je nepotpuna… Daleko je od toga da je kul; popularnost COBOLa je poslednjih 20tak godina na niskom nivou. On ostaje jezik mainframe računara, prosto zatrpan u lavini modernih kompjuterskih jezika i rešenja kojima smo od skora preplavljeni. Fokus razvoja softvera je mahom pomeren na web, oblake; procesorska moć je daleko jača nego ranije; sve to zahteva novije koncepte i iznedrava drugačije programske jezike.

COBOL kao programski jezik i dalje živi. Iako nije postojao kao softver otvorenog koda u 80tim i 90tim, stvari se menjaju, te danas postoji i GNU verzija kompajlera. Postoje okruženja ili dodaci za razvoj COBOLa na svim operativnim sistemima; kao i on-line zajednice koje i dalje neguju veštine razvoja softvera u ovom programskom jeziku.

Šta raditi sa 200 milijardi linija COBOL koda?

To je upravo pitanje koje muči amerikance.

Korak nazad. Svest o korišćenju zastarelih (legacy) rešenja svakako postoji. 92 od 100 najboljih američkih banaka i dalje koriste mainframe računare, od toga 70% njih su Fortune 500 kompanije. Ako se prihvati da je COBOL pregazilo vreme, i da mainframe računare treba zameniti manjim serverima i cloud-računarima, zašto se to onda za sve ovo vreme nije desilo?

Zanimljivo je da u Americi postoji telo koje se bavi i evaluacijom održivosti sistema: Government Accountability Office. GAO je u više navrata izveštavao da postoje sistemi u vlasništvu države kojima je preko potreban dobar remont. Odeljenje za edukaciju, na primer, procesira studente na sistemu iz 1973. - koga održava 18 kontraktora i koji zahteva poseban hardver, te ga je teško integrisati sa modernim softverskim rešenjima. GAO smatra COBOL zastarelim programskim jezikom, što oslikava i uporedni problem nalaženja novih programera. Sa ovakvim deficitom radne snage, specijalisti za COBOL postaju preskupi.

Vratimo se na pitanje: zašto onda jednostavno ne napustimo COBOL i prosto migriramo na nove, moderne kompjuterske sisteme i rešenja?

Zato što bi to bilo skupo. Da naglasim: pre-sku-po je. Commonwealth Banka Australije je zamenila svoju COBOL platformu 2012.; za to joj je trebalo pet godina, a poduhvat je koštao 750 miliona dolara. Na drugom mestu, migracija sličnog sistema na Java platformu je trajala četiri godine, i nije još bila završena.

Zaključak se nameće sam: migracija sa stare platforme nije trivijalna niti jeftina stvar. Dok poslovni svet možda i može sebi da to priušti, silne državne institucije (Amerike) to, jednostavno, nisu u stanju. Odeljenje za unutrašnju bezbednost Amerike, na primer, koristi IBM z10 mainframe iz 2008. godine na kome se vrte programi pisani u COBOLu. Administracija socijalne službe Amerike ima u službi 60 miliona linija COBOL koda. Slično stanje je i sa drugim kompjuterskim sistemima državnih institucija Amerike; koriste se sistemi koji su stari i 40-tak godina.

COBOL je tu i, kako izgleda, neće biti zamenjen još dugo vremena.

Zašto sada?

U kriznim vremenima količina podataka koja se obrađuje je značajno uvećana. Primera radi, usled nadošlog talasa nezaposlenosti, količina prijava u New Yersey-ju se povećala 1600%, gde je 580 hiljada ljudi podnelo odgovarajuće zahteve upravi u kratkom roku.

Stari sistemi jednostavno ne mogu da podnesu ovakvu promenu saobraćaja. Zapravo, to ne može ni jedan sistem ukoliko nije od početka dizajniran na takav način. S druge strane, dizajnirati robusne sisteme je kompleksna stvar sama po sebi, te time sporija i skuplja za razvoj. Nažalost, u svetu koji želi sve za juče, trend kvaliteta razvoja softvara ne raste; no to je tema koja zaslužuje zasebnu razradu.

Ovakvo stanje stvari zahteva da se postojeći sistemi u vanrednim okolnostima korišćenja održavaju: nadgledaju, poprave ili ubrzaju. Manjak programera učinilo je da korisnici pogođeni uvećanim saobraćajem, prvenstveno državne institucije, javno vape za pristupačnim COBOL programerima. Odnedavno se na sve strane postavljaju on-line kursevi COBOLa; u tome prednjači IBM kome je, jasno, stalo da poveća bazu svojih korisnika.

Prethodni put kada je COBOL bio aktuelan je bilo na prelasku u 2000. godinu, povodom tkzv. Y2K greške. Industrija je imala vremena da se spremi za tako nešto, te je čak od 80tih počela da radi na tome. U slučaju iznenadnih kriza, kao što je ova pandemija, nije bilo mesta za pripremu.

Šta možemo da naučimo?

Ostaje nam da iz svega ovoga nešto i naučimo.

Mi, programeri, bivamo opsednuti đinđuvama softverskih novina. “Programeri su kao deca” - rekao mi je jednom CTO jedne singapurske banke - “jure unaokolo kao sumanuti: vidi ovo, vidi ono - privučeni tehnološkim novotarijama, a vrlo lako se poseku i nešto polome”, odgovarajući mi na pitanje o usvajanju novih tehnologija u njihovom bankarskom sistemu. I nije u krivu. Industrija ne mari da li se tvoj kod može napisati na ovaj ili onaj način - nju zanima da li će tvoj kod raditi i posle 20 godina i da li će i tada biti nekog ko će razumeti šta tu piše. Industrija je ta koja daje vrednost dobranom delu koda, na kraju krajeva. Tako, na primer: Java je novi COBOL i - ovo ću priznati samo jednom - Oracle zaista radi dobru stvar: održava čvrstu kompatibilnost sa starijim verzijama i jako oprezno uvodi novine. Prvi ja blatim Javu na sva usta kao najdosadniji moderni jezik na svetu; ali to iz mene govori (dosadni) koder, a ne inženjer.

Zato moramo biti pažljivi - jako pažljivi - sa tehnologijama koje usvajamo i koje postaju standard. Nisam siguran da li je organski pristup i pravi: kada usvajamo nešto samo zato što je popularno. Uzmimo Python na primer. Zamislite koliko bi koštalo industriju da prebaci programe iz verzije 2 u verziju 3, da su izabrale Python kao jezik za svoje kompjuterske sisteme. Ili pak AngularJS, promašeni koncept koji je bačen u korpu. Zato, ponavljam, moramo biti pažljivi sa time šta usvajamo. Nekada više nije i bolje.

Možemo još nešto da naučimo iz svega ovoga, a tiče se našeg svakodnevnog rada. Ako ništa drugo, bar da mi, koji razvijamo softver, ne zaboravimo podjednako važne vrednosti svakog kompjuterskog sistema: robusnost i održivost. Piši kod koji želiš da te nadživi. S druge strane, u robusnost i kvalitet se mora ulagati. “Što je brzo, to je i kuso”, reče stari COBOL programer.

BONUS: COBOL u praksi

GNU Cobol se na OSX lako instalira: brew install gnu-cobol. Kao editor možete koristit Sublime ili VS Code, oba imaju podršku za COBOL; za potonjeg je ona naprednija od prostog prepoznavanja sintakse.

To je to, spremni ste da budete stari.

Hajde da pogledamo kako izgleda jedan COBOL program:

        IDENTIFICATION DIVISION.
        PROGRAM-ID. HELLO.
        DATA DIVISION.
          WORKING-STORAGE SECTION.
          *> 9 — numeric A — alphabetic X — alphanumeric V — decimal S — sign
          01 NUM-VAR PIC S9(3)V9(2).
          01 COUNT1 PIC 9(2) VALUE 0.
          01 NUM PIC 9(9).
          01 TEXT-VAR PIC X(8) VALUE 'OBLAC.RS'.
          01 STR1 PIC X(8).
          01 STR2 PIC X(8).
          01 GROUP-VAR.
            05 BROJ PIC 9(3) VALUE 173.
            05 NAZIV PIC X(15) VALUE 'LALALAND'.
          01 CHECK-VAL PIC 9(9).
            88 PASS VALUES ARE 044 THRU 100.
            88 FAIL VALUES ARE 000 THRU 43.
        PROCEDURE DIVISION.
          DISPLAY 'CIAO COBOL'.
          MOVE 2.1 TO NUM-VAR.
          DISPLAY "NUM VAR : "NUM-VAR.
          DISPLAY "TEXT VAR : "TEXT-VAR.
          DISPLAY "GROUP VAR : "GROUP-VAR.
          COMPUTE NUM = (NUM-VAR * NUM-VAR).
          DISPLAY "MUL : "NUM.

          IF NUM > 3 AND NUM LESS THAN 100 THEN
            DISPLAY "Da!"
          END-IF

          MOVE NUM TO CHECK-VAL
          IF FAIL
            DISPLAY "Ups"
          END-IF

          INSPECT TEXT-VAR TALLYING COUNT1 FOR CHARACTERS.
          DISPLAY "Broji : "COUNT1.
          INSPECT TEXT-VAR REPLACING ALL 'C' BY 'K'.
          UNSTRING TEXT-VAR DELIMITED BY '.'
            INTO STR1, STR2
          END-UNSTRING.
          DISPLAY STR1

          PERFORM FN WITH TEST AFTER UNTIL COUNT1=0.
        STOP RUN.

        FN.
          DISPLAY 'Hi!'.
          SUBTRACT 1 FROM COUNT1.

Pre svega, ovo nije greška - prve kolone u programu su rezervisane i ne koriste se prilikom pisanja koda. Sedma kolona je takođe posebna. Kod se piše od osme kolone. Sve se piše velikim slovima, pa je zgodno uključiti Caps-Lock :)

COBOL program je podeljen na celine (DIVISION). U prvoj deklarišemo promenljive. Ne postoje unapred definisani tipovi, već se tip podatka definiše odmah pri deklaraciji. Zanimljive su i grupne varijable (liče na strukture), kao i neka vrsta enum varijable (CHECK_VAL).

U proceduralnom delu se piše program. Gornji radi neke osnovne računske radnje i pitalice. Rad sa stringovima je posebno zametan; potrebno je puno toga napisati za jednostavne manipulacije. Poslednje prikazano je kako se procedura pozova više puta, u petlji.

Ono zašta je COBOL napravljen je i obrada podataka, a to znači rad sa fajlovima. Sam jezik ima ugrađen u sebe rad sa fajlovima i zapisima. Evo kako to izgleda:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. FILES.

       ENVIRONMENT DIVISION.
         INPUT-OUTPUT SECTION.
           FILE-CONTROL.
             SELECT ZAPISI ASSIGN TO 'zapisi.txt'
             ORGANIZATION IS SEQUENTIAL.

       DATA DIVISION.
         FILE SECTION.
           FD ZAPISI.
           01 ZAPISI-STRUCT.
             02 UID PIC 9(6).
             02 NOTE PIC X(30).
             02 ACCOUNT.
               03 AMOUNT PIC 9(6)V9(2).
               03 BALANCE PIC 9(6)V9(2).
             02 ACCOUNT-ID PIC 9(7).
             02 ACCOUNT-OWNER PIC A(50).

         WORKING-STORAGE SECTION.
           01 ZAPISI-RECORD.
             02 UID PIC 9(6) VALUE 123456.
             02 NOTE PIC X(30) VALUE 'TESTIRAM'.
             02 ACCOUNT.
               03 AMOUNT PIC 9(6)V9(2) VALUE 000173.98.
               03 BALANCE PIC 9(6)V9(2) VALUE 000173.12.
             02 ACCOUNT-ID PIC 9(7).
             02 ACCOUNT-OWNER PIC A(50).

       PROCEDURE DIVISION.
         DISPLAY 'WRITING RECORD: 'ZAPISI-RECORD.
         OPEN OUTPUT ZAPISI
           WRITE ZAPISI-STRUCT FROM ZAPISI-RECORD
         CLOSE ZAPISI

       STOP RUN.

Gornji program upisuje sadržaj u fajl. Fajlovi sa kojima se barata su obični, struktuirani tekstualni fajlovi; ako ih otvorite garantujem nalet vajba osamdesetih (ako ste ih uopšte doživeli).

Gornji programi se kompajliraju sa cobc -x <ime>.cob čime se dobija izvršni program.