ah vysokogo urovnya, ispol'zuemyh v rezhime on-lajn, bud' to v paketnom rezhime ili interaktivno. Kak ya dokazyval, takie yazyki i sistemy ochen' sil'no oblegchayut zhizn' programmistov. Poskol'ku mashiny sdelany dlya lyudej, a ne lyudi dlya mashin, ih ispol'zovanie opravdano kak s ekonomicheskoj tochki zreniya, tak i chisto po- chelovecheski. Glava 16. Serebryanoj puli net - sushchnost' i akcidenciya v programmnoj inzhennerii Net ni odnogo otkrytiya ni v tehnologii, ni v metodah upravleniya, odno tol'ko ispol'zovanie kotorogo obeshchalo by v techenie blizhajshego desyatiletiya na poryadok povysit' proizvoditel'nost', nadezhnost', prostotu razrabotki programmnogo obespecheniya. Rezyume1 Sozdanie programmnogo obespecheniya vsegda vklyuchaet v sebya sushchestvennye zadachi - modelirovanie slozhnyh konceptual'nyh struktur, sostavlyayushchih abstraktnyj programmnyj ob容kt, i vtorostepennye zadachi - sozdanie predstavlenij etih abstraktnyh ob容ktov s pomoshch'yu yazykov programmirovaniya i otobrazhenie ih v mashinnye yazyki s uchetom ogranichenij po pamyati i skorosti. V proshlom rost produktivnosti programmirovaniya po bol'shej chasti dostigalsya blagodarya ustraneniyu iskusstvennyh pregrad, delavshih vtorostepennye zadachi chrezmerno trudnymi, naprimer, zhestkih apparatnyh ogranichenij, neudobnyh yazykov programmirovaniya, nehvatki mashinnogo vremeni. Kakaya chast' raboty razrabotchikov programmnogo obespecheniya vse eshche svyazana so vtorostepennymi, a ne s sushchestvennymi obstoyatel'stvami? Esli ona zanimaet menee 9/10 vseh zatrat, to, dazhe svedya vse vtorostepennye zatraty k nulyu, my ne poluchim rosta proizvoditel'nosti na poryadok velichin. Poetomu, pohozhe, nastalo vremya obratit'sya k sushchestvennym zadacham programmirovaniya, svyazannym s modelirovaniem konceptual'nyh struktur bol'shoj slozhnosti. YA predlagayu: - Ispol'zovat' massovyj rynok, chtoby izbezhat' sozdaniya togo, chto mozhno kupit'. - Ispol'zovat' bystroe maketirovanie kak chast' zaplanirovannyh iteracij dlya ustanovleniya tehnicheskih trebovanij k programmnomu obespecheniyu. - Organichno narashchivat' programmy, dobavlyaya k sistemam vse bol'shuyu funkcional'nost' po mere ih zapuska, ispol'zovaniya i testirovaniya. - Vyyavlyat' i rastit' vydayushchihsya razrabotchikov koncepcij novogo pokoleniya. Vvedenie Iz vseh monstrov, kotorymi napolneny koshmary nashego fol'klora, samymi strashnymi yavlyayutsya oborotni, poskol'ku nas pugaet neozhidannoe prevrashchenie togo, chto nam horosho znakomo, v nechto uzhasnoe. My ishchem serebryanye puli, kotorye mogli by volshebnym obrazom ulozhit' oborotnej napoval. Horosho znakomyj programmnyj proekt napominaet takih oborotnej (po krajnej mere, v predstavlenii menedzherov, ne yavlyayushchihsya tehnicheskimi specialistami) tem, chto, buduchi prostym i nevinnym na vid, on mozhet stat' chudishchem provalennyh grafikov raboty, razduvshihsya byudzhetov i nerabotayushchih produktov. I my slyshim otchayannye kriki s pros'bami dat' serebryanuyu pulyu - nechto, sposobnoe snizit' stoimost' programmnyh produktov tak zhe rezko, kak snizilas' stoimost' komp'yuterov. No, vglyadyvayas' v predstoyashchee desyatiletie, my ne vidim nikakoj serebryanoj puli. Net ni odnogo otkrytiya ni v tehnologii, ni v metodah upravleniya, odno tol'ko ispol'zovaniya kotoryh obeshchalo by hot' na poryadok velichin povysit' proizvoditel'nost', nadezhnost', prostotu. V etoj glave my popytaemsya uvidet', pochemu eto tak, issleduya prirodu zadach programmirovaniya i svojstva predlagaemyh pul'. Odnako skepticizm - eto ne pessimizm. Hotya my ne vidim oshelomlyayushchih proryvov i dejstvitel'no schitaem ih nesvojstvennymi prirode programmirovaniya, proishodit mnogo vselyayushchih nadezhdy novovvedenij. Disciplinirovannye i posledovatel'nye usiliya, napravlennye na ih razvitie, rasprostranenie i ispol'zovanie, dejstvitel'no mogut dat' rost na poryadok velichin. Net carskogo puti, no vse zhe put' est'. Pervym shagom k lecheniyu boleznej stala zamena predstavlenij o demonah i "sokah" v organizme teoriej bakterij. Sam etot shag, obeshchavshij nadezhdu, oproverg vse mechty o chudesnom iscelenii. On podskazal issledovatelyam, chto progress budet osushchestvlyat'sya shazhkami, s bol'shim trudom, i chto postoyannoe i neoslabnoe vnimanie nuzhno udelyat' sanitarii. To zhe proishodit segodnya s programmnoj inzheneriej. Neizbezhny li trudnosti? Trudnosti, vytekayushchie iz sushchnosti Serebryanyh pul' ne tol'ko ne vidno v nastoyashchee vremya, no v silu samoj prirody programmnogo obespecheniya maloveroyatno, chto oni voobshche budut najdeny - ne budet izobretenij, sposobnyh povliyat' na produktivnost' sozdaniya, nadezhnost' i prostotu programmnogo obespecheniya tak, kak elektronika, tranzistory i integral'nye shemy - na apparatnoe obespechenie komp'yuterov. Ne sleduet ozhidat', chto kogda-libo v budushchem kazhdye dva goda budet proishodit' dvukratnyj rost. Vo-pervyh, sleduet schitat' neobychnym ne to, chto tak medlenno proishodit progress v programmirovanii, a to, chto on tak bystro idet v apparatnom obespechenii komp'yuterov. Ni odna drugaya tehnologiya za vsyu istoriyu civilizacii ne imela za 30 let svoego razvitiya rosta sootnosheniya proizvoditel'nost'/cena na shest' poryadkov. Ni odna drugaya tehnologiya ne pozvolyaet vybrat', kakoj vyigrysh predpochest': uluchshit' tehnicheskie harakteristiki ili snizit' zatraty. Oba eti vyigrysha stali vozmozhny blagodarya perehodu proizvodstva komp'yuterov iz sborochnogo proizvodstva v obrabatyvayushchee. Vo-vtoryh, chtoby posmotret', kakoj skorosti razvitiya mozhno ozhidat' ot programmnyh tehnologij, polezno izuchit' imeyushchiesya v nih trudnosti. Sleduya Aristotelyu, ya delyu ih na sushchnosti - trudnosti, vnutrenne prisushchie prirode programmnogo obespecheniya, i akcidencii - trudnosti, kotorye segodnya soputstvuyut proizvodstvu programmnogo obespecheniya, no ne yavlyayutsya vnutrenne emu prisushchimi. Akcidencii ya rassmatrivayu v sleduyushchem paragrafe. Snachala rassmotrim sushchnost'. Sushchnost'yu programmnogo ob容kta yavlyaetsya konstrukciya, sostoyashchaya iz sceplennyh vmeste koncepcij: naborov dannyh, vzaimosvyazej mezhdu elementami dannyh, algoritmov i vyzovov funkcij. |ta sushchnost' yavlyaetsya abstraktnoj v tom otnoshenii, chto konceptual'naya konstrukciya ostaetsya odnoj i toj zhe pri razlichnyh predstavleniyah. Tem ne menee ona obladaet vysokoj tochnost'yu i bol'shim chislom detalej. YA schitayu, chto slozhnost' sozdaniya programmnogo obespecheniya zaklyuchaetsya v zadanii tehnicheskih trebovanij, proektirovanii i proverke etoj konceptual'noj konstrukcii, a ne v zatratah, svyazannyh s ee predstavleniem i proverkoj tochnosti predstavleniya. Konechno, my delaem sintaksicheskie oshibki, no v bol'shinstve sistem oni nesushchestvenny v sravnenii s konceptual'nymi oshibkami. Verno to, chto sozdanie programmnyh sistem vsegda budet trudnym. Serebryanoj puli net po samoj prirode veshchej. Rassmotrim neot容mlemye svojstva etoj nesokratimoj sushchnosti sovremennyh programmnyh sistem: slozhnost', soglasovannost', izmenyaemost' i nezrimost'. Slozhnost'. Slozhnost' programmnyh ob容ktov bolee zavisit ot ih razmerov, chem, vozmozhno, dlya lyubyh drugih sozdavaemyh chelovekom konstrukcij, poskol'ku nikakie dve ih chasti ne shozhi mezhdu soboj (po krajnej mere, vyshe urovnya operatorov). Esli oni shozhi, to my ob容dinyaem ih v odnu podprogrammu, otkrytuyu ili zakrytuyu. V etom otnoshenii programmnye sistemy imeyut glubokoe otlichie ot komp'yuterov, domov i avtomobilej, gde povtoryayushchiesya elementy imeyutsya v izobilii. Sami cifrovye komp'yutery slozhnee, chem bol'shinstvo izgotavlivaemyh lyud'mi veshchej. CHislo ih sostoyanij ochen' veliko, poetomu ih trudno ponimat', opisyvat' i testirovat'. U programmnyh sistem chislo vozmozhnyh sostoyanij na poryadki velichin prevyshaet chislo sostoyanij komp'yuterov. Analogichno, masshtabirovanie programmnogo ob容kta - eto ne prosto uvelichenie v razmere teh zhe samyh elementov, eto obyazatel'no uvelichenie chisla razlichnyh elementov. V bol'shinstve sluchaev eti elementy vzaimodejstvuyut mezhdu soboj nekim nelinejnym obrazom, i slozhnost' celogo rastet znachitel'no bystree, chem linejno. Slozhnost' programm yavlyaetsya sushchestvennym, a ne vtorostepennym svojstvom. Poetomu opisaniya programmnyh ob容ktov, abstragiruyushchiesya ot ih slozhnosti, chasto abstragiruyutsya ot ih sushchnosti. Matematika i fizicheskie nauki za tri stoletiya dostigli bol'shih uspehov, sozdavaya uproshchennye modeli slozhnyh fizicheskih yavlenij, poluchaya iz etih modelej svojstva i proveryaya ih opytnym putem. |to udavalos' blagodarya tomu, chto slozhnosti, ignorirovavshiesya v modelyah, ne byli sushchestvennymi svojstvami yavlenij. I eto ne dejstvuet, kogda slozhnosti yavlyayutsya sushchnost'yu. Mnogie klassicheskie trudnosti razrabotki programmnogo obespecheniya proistekayut ih etoj slozhnosti sushchnosti i ee nelinejnogo rosta pri uvelichenii razmera. Slozhnost' sluzhit prichinoj trudnosti processa obshcheniya mezhdu uchastnikami brigady razrabotchikov, chto vedet k oshibkam v produkte, prevysheniyu stoimosti razrabotki, zatyagivaniyu vypolneniya grafikov rabot. Slozhnost' sluzhit prichinoj trudnosti perechisleniya, a tem bolee ponimaniya, vseh vozmozhnyh sostoyanij programmy, a otsyuda voznikaet ee nenadezhnost'. Slozhnost' funkcij sluzhit prichinoj trudnostej pri ih vyzove, iz-za chego programmami trudno pol'zovat'sya. Slozhnost' struktury sluzhit prichinoj trudnostej pri razvitii programm i dobavlenii novyh funkcij tak, chtoby ne voznikali pobochnye effekty. Slozhnost' struktury sluzhit istochnikom nevizualizuemyh sostoyanij, v kotoryh narushaetsya sistema zashchity. Slozhnost' sluzhit prichinoj ne tol'ko tehnicheskih, no i administrativnyh problem. Iz-za slozhnosti trudno osushchestvlyat' nadzor, a v rezul'tate stradaet konceptual'naya celostnost'. Trudno najti i derzhat' pod kontrolem vse svobodnye koncy. Obuchenie i ponimanie stanovitsya kolossal'noj nagruzkoj, iz-za chego tekuchest' rabochej sily prevrashchaetsya v katastrofu. Soglasovannost'. Lyudi, svyazannye s programmirovaniem, ne odinoki v problemah slozhnosti. Fizika imeet delo s ob容ktami chrezvychajnoj slozhnosti dazhe na urovne elementarnyh chastic. Odnako fizik rabotaet v tverdoj uverennosti, chto mozhno najti obshchie principy, bud' to kvarki ili obshchaya teoriya polya. |jnshtejn neodnokratno utverzhdal, chto priroda dolzhna imet' prostye ob座asneniya, poskol'ku Bogu ne svojstvenny kapriznost' i proizvol. U razrabotchika programmnogo obespecheniya net takoj uteshitel'noj very. Slozhnost', s kotoroj on dolzhen sovladat', po bol'shej chasti yavlyaetsya proizvol'noj, neobosnovanno vyzvannoj mnogochislennymi chelovecheskimi ustanovleniyami i sistemami, kotorym dolzhny udovletvorit' ego interfejsy. Sistemy razlichayutsya interfejsami i menyayutsya vo vremeni ne v silu neobhodimosti, a lish' potomu, chto byli sozdany ne Bogom, a raznymi lyud'mi. Vo mnogih sluchayah programmnoe obespechenie dolzhno soglasovyvat'sya, poskol'ku tol'ko chto poyavilos' na scene. V drugih sluchayah ono dolzhno soglasovyvat'sya, poskol'ku est' oshchushchenie, chto ego legche vsego soglasovat'. No vo vseh sluchayah znachitel'naya chast' slozhnosti proishodit ot soglasovaniya s drugimi interfejsami, i eto nevozmozhno uprostit' tol'ko v rezul'tate pereproektirovaniya programmnogo obespecheniya. Izmenyaemost'. Programmnye ob容kty postoyanno podverzheny izmeneniyam. Konechno, eto otnositsya i k zdaniyam, avtomobilyam, komp'yuteram. No proizvedennye veshchi redko podvergayutsya izmeneniyam posle izgotovleniya. Ih zamenyayut novye modeli, ili sushchestvennye izmeneniya vklyuchayut v bolee pozdnie serijnye ekzemplyary togo zhe bazovogo proekta. Otzyvy u potrebitelej avtomobilej na praktike vstrechayutsya ves'ma redko, a izmeneniya rabotayushchih komp'yuterov eshche rezhe. To i drugoe sluchaetsya znachitel'no rezhe, chem modifikaciya rabotayushchego programmnogo obespecheniya. Otchasti eto proishodit potomu, chto programmnoe obespechenie v sisteme voploshchaet ee naznachenie, a naznachenie bolee vsego oshchushchaet vliyanie izmenenij. Otchasti eto proishodit potomu, chto programmnoe obespechenie legche izmenit': eto chistaya mysl', beskonechno podatlivaya. Zdaniya tozhe perestraivayutsya, no priznavaemaya vsemi vysokaya stoimost' izmenenij umeryaet kaprizy novatorov. Vse udachnye programmnye produkty podvergayutsya izmeneniyam. Pri etom dejstvuyut dva processa. Vo-pervyh, kak tol'ko obnaruzhivaetsya pol'za programmnogo produkta, nachinayutsya popytki primeneniya ego na grani ili za predelami pervonachal'noj oblasti. Trebovanie rasshireniya funkcij ishodit, v osnovnom, ot pol'zovatelej, kotorye udovletvoreny osnovnym naznacheniem i izobretayut dlya nego novye primeneniya. Vo-vtoryh, udachnyj programmnyj produkt zhivet dol'she obychnogo sroka sushchestvovaniya mashiny, dlya kotoroj on pervonachal'no byl sozdan. Prihodyat esli ne novye komp'yutery, to novye diski, novye monitory, novye printery, i programma dolzhna byt' soglasovana s vozmozhnostyami novyh mashin. Koroche, programmnyj produkt vstroen v kul'turnuyu matricu prilozhenij, pol'zovatelej, zakonov i mashin. Vse oni nepreryvno menyayutsya, i ih izmeneniya neizbezhno trebuyut izmeneniya programmnogo produkta. Nezrimost'. Programmnyj produkt nevidim i nevizualizuem. Geometricheskie abstrakcii yavlyayutsya moshchnym instrumentom. Plan zdaniya pomogaet arhitektoru i zakazchiku ocenit' prostranstvo, vozmozhnosti peremeshcheniya, vidy. Stanovyatsya ochevidnymi protivorechiya, mozhno zametit' upushcheniya. Masshtabnye chertezhi mehanicheskih detalej i ob容mnye modeli molekul, buduchi abstrakciyami, sluzhat toj zhe celi. Geometricheskaya real'nost' shvatyvaetsya v geometricheskoj abstrakcii. Real'nost' programmnogo obespecheniya ne vstraivaetsya estestvennym obrazom v prostranstvo. Poetomu u nego net gotovogo geometricheskogo predstavleniya podobno tomu, kak mestnost' predstavlyaetsya kartoj, kremnievye mikroshemy - diagrammami, komp'yutery - shemami soedinenij. Kak tol'ko my pytaemsya graficheski predstavit' strukturu programmy, my obnaruzhivaem, chto trebuetsya ne odin, a neskol'ko neorientirovannyh grafov, nalozhennyh odin na drugoj. Neskol'ko grafov mogut predstavlyat' upravlyayushchie potoki, potoki dannyh, shemy zavisimostej, vremennyh posledovatel'nostej, sootnoshenij prostranstva imen. Obychno oni dazhe ne yavlyayutsya ploskimi, ne to chto ierarhicheskimi. Na praktike odnim iz sposobov ustanovleniya konceptual'nogo kontrolya nad takoj strukturoj yavlyaetsya obrezanie svyazej do teh por, poka odin ili neskol'ko grafov ne stanut ierarhicheskimi.2 Nesmotrya na progress, dostignutyj v ogranichenii i uproshchenii struktur programmnogo obespecheniya, oni ostayutsya nevizualizuemymi po svoej prirode, tem samym lishaya nas odnogo iz naibolee moshchnyh instrumentov operirovaniya koncepciyami. |tot nedostatok ne tol'ko zatrudnyaet individual'nyj process proektirovaniya, no i ser'ezno zatrudnyaet obshchenie mezhdu razrabotchikami. Prezhnie proryvy razreshili vtorostepennye trudnosti Esli rassmotret' tri naibolee plodotvornyh shaga v proizoshedshem razvitii programmnyh tehnologij, to obnaruzhitsya, chto vse oni byli sdelany v napravlenii resheniya razlichnyh krupnyh problem razrabotki programm, no eti problemy zatragivali vtorostepennye, a ne otnosyashchiesya k sushchnosti trudnosti. Mozhno takzhe videt' estestvennye predely ekstrapolirovaniya kazhdogo ih etih napravlenij. YAzyki vysokogo urovnya. Konechno, naibol'shee znachenie dlya rosta proizvoditel'nosti, nadezhnosti i prostoty imelo vse bolee shirokoe ispol'zovanie yazykov vysokogo urovnya. Bol'shinstvo issledovatelej schitaet, chto etim byl dostignut, po krajnej mere, pyatikratnyj rost proizvoditel'nosti pri odnovremennom vyigryshe v nadezhnosti, prostote i legkosti ponimaniya. CHto delaet yazyk vysokogo urovnya? On osvobozhdaet programmu ot znachitel'noj doli neobyazatel'noj slozhnosti. Abstraktnaya programma sostoit iz konceptual'nyh konstrukcij: operacij, tipov dannyh, posledovatel'nostej i svyazi. Konkretnaya mashinnaya programma svyazana s bitami, registrami, usloviyami, perehodami, kanalami, diskami i prochim. V toj mere, v kakoj v yazyke vysokogo urovnya voploshcheny neobhodimye abstraktnoj programme konstrukcii i izbegayutsya konstrukcii nizshego poryadka, on likvidiruet celyj uroven' slozhnosti, sovershenno ne yavlyayushchijsya neobhodimym svojstvom programmy. Samoe bol'shee, chto mozhet sdelat' yazyk vysokogo urovnya, - eto predostavit' vse konstrukcii, kotorye po zamyslu programmista soderzhit abstraktnaya programma. Konechno, uroven' utonchennosti nashih predstavlenij o strukturah dannyh, tipah dannyh i operaciyah neuklonno rastet, no s postoyanno ubyvayushchej skorost'yu. I yazyki v svoem razvitii vse bol'she priblizhayutsya k izoshchrennosti nashego myshleniya. Bolee togo, s nekotorogo momenta dal'nejshaya razrabotka yazykov vysokogo urovnya stanovitsya obuzoj, oslozhnyayushchej, a ne uproshchayushchej intellektual'nye zadachi pol'zovatelya, redko ispol'zuyushchego ezotericheskie konstrukcii. Razdelenie vremeni. Bol'shinstvo issledovatelej schitaet, chto blagodarya rabote v rezhime razdeleniya vremeni proizoshel bol'shoj rost proizvoditel'nosti truda programmistov i kachestva sozdavaemyh programmnyh produktov, hotya i ne takoj znachitel'nyj, kak vyzvannyj ispol'zovaniem yazykov vysokogo urovnya. Razdelenie vremeni pomogaet reshit' sovsem druguyu zadachu. Blagodarya razdeleniyu vremeni obespechivaetsya bezotlagatel'nost', i potomu vozmozhnost' imet' obshchee vpechatlenie o slozhnosti. Iz-za medlennoj oborachivaemosti pri paketnoj obrabotke my neizbezhno zabyvaem melochi, esli ne samoe napravlenie nashej mysli, v tot moment, kogda my prervalis' i nachali kompilyaciyu i vypolnenie programmy. |tot obryv mysli dorogo obhoditsya po vremeni, poskol'ku prihoditsya vosstanavlivat' ee v pamyati. V hudshem sluchae, mozhno voobshche poteryat' predstavlenie o tom, chto proishodit so slozhnoj sistemoj. Medlennaya oborachivaemost', kak i slozhnosti mashinnyh yazykov, yavlyaetsya vtorostepennoj, a ne sushchestvennoj trudnost'yu processa programmirovaniya. Predel'nyj vklad, vnosimyj razdeleniem vremeni, opredelyaetsya neposredstvenno. Glavnoe - eto sokratit' vremya otklika sistemy. Po mere priblizheniya ego k nulyu, ono perehodit porog skorosti chelovecheskogo vospriyatiya, sostavlyayushchej okolo 100 millisekund. Dal'she nikakoj vygody poluchit' uzhe nel'zya. Ob容dinennye sredy programmirovaniya. Schitaetsya, chto Unix i Interlisp, pervye shiroko rasprostranennye integrirovannye sredy programmirovaniya, povysili proizvoditel'nost' v neskol'ko raz. Pochemu? Oni napravleny na preodolenie vtorostepennyh trudnostej sovmestnogo ispol'zovaniya programm putem ispol'zovaniya obshchih bibliotek, unificirovannyh formatov fajlov, kanalov i fil'trov. V rezul'tate konceptual'nye struktury, kotorye, v principe, vsegda mogut vyzyvat', obmenivat'sya dannymi i ispol'zovat' drug druga, poluchayut vozmozhnost' osushchestvlyat' eto prakticheski. |to dostizhenie, v svoyu ochered', stimulirovalo razvitie celyh instrumental'nyh naborov, poskol'ku vsyakij novyj instrument mog primenyat'sya k lyubym programmam, ispol'zuya standartnye formaty. Blagodarya etim uspeham sredy programmirovaniya stali predmetom mnogih segodnyashnih issledovanij v programmnoj inzhenerii. V sleduyushchem paragrafe my rassmotrim, chto ot nih mozhno ozhidat', i kakie im prisushche ogranicheniya. Nadezhdy na serebro Rassmotrim teper' te tehnicheskie dostizheniya, kotorye chashche vsego vydvigayutsya kandidatami na rol' serebryanoj puli. K kakim zadacham oni obrashchayutsya? Zadacham, otnosyashchimsya k sushchnosti, ili ostatkam nashih akcidentnyh slozhnostej? Predlagayut li oni revolyucionnoe razvitie ili poshagovoe prodvizhenie? Ada i drugie dostizheniya yazykov vysokogo urovnya. Odnim iz naibolee reklamiruemyh dostizhenij poslednego vremeni yavlyaetsya yazyk programmirovaniya Ada - yazyk vysokogo urovnya obshchego naznacheniya 80-h godov. Ada dejstvitel'no ne tol'ko otrazhaet evolyucionnoe razvitie koncepcij yazykov, no i voploshchaet cherty, podderzhivayushchie sovremennye idei proektirovaniya i modul'nosti. Vozmozhno, bol'shim dostizheniem yavlyaetsya ne yazyk Ada, a filosofiya Ada kak filosofiya modul'nosti, abstraktnyh tipov dannyh, ierarhicheskogo strukturirovaniya. Ada, pozhaluj peregruzhen vozmozhnostyami, buduchi estestvennym produktom processa, porodivshego trebovaniya, polozhennye v osnovu ego razrabotki. |to ne smertel'no, poskol'ku podmnozhestva rabochih slovarej mogut reshit' problemu izucheniya, a progress elektroniki dast nam deshevye milliony operacij v sekundu, reshayushchie problemu kompilyacii. Razvitie strukturirovannosti programmnyh sistem - eto ochen' horoshee primenenie dlya deneg, kotorye my tratim na priobretenie vse bol'shih vychislitel'nyh moshchnostej. Operacionnye sistemy, gromko osuzhdavshiesya v 60-h godah za dorogoviznu pamyati i vychislenij, okazalis' horoshim sposobom primeneniya bystrodejstviya i deshevoj pamyati, poluchennyh v rezul'tate bystrogo razvitiya apparatnyh sredstv. Tem ne menee Ada ne stanet toj serebryanoj pulej, kotoraya ulozhit monstra nizkoj proizvoditel'nosti proizvodstva programmnogo obespecheniya. V konce koncov eto vsego lish' eshche odin yazyk vysokogo urovnya, a samuyu bol'shuyu otdachu ot primeneniya takih yazykov my uzhe poluchili pri pervom perehode ot vtorostepennoj slozhnosti mashin k bolee abstraktnoj formulirovke poshagovyh reshenij. Posle ustraneniya teh akcidencij ostalis' menee sushchestvennye, i vygody ot ih ustraneniya budet, konechno, men'she. YA predvizhu, chto cherez desyatiletie, kogda ocenyat effektivnost' Ada, budet priznan znachitel'nyj vklad etogo yazyka, no ne blagodarya kakoj-libo otdel'noj ego vozmozhnosti i dazhe ne blagodarya im vsem vmeste vzyatym. Ne stanut prichinoj uspehov i novye sredy programmirovaniya na Ada. Naibol'shim vkladom Ada yavitsya to, chto perehod na etot yazyk posluzhit prichinoj izucheniya programmistami sovremennyh metodov proektirovaniya programmnogo obespecheniya. Ob容ktno-orientirovannoe programmirovanie. Mnogie, izuchayushchie iskusstvo programmirovaniya, svyazyvayut s ob容ktno-orientirovannym programmirovaniem bol'she nadezhd, chem s lyubymi drugimi sovremennymi tehnicheskimi uvlecheniyami.3 YA prinadlezhu k ih chislu. Mark SHerman (Mark Sherman) iz Dartmuta zamechaet, chto sleduet provodit' otlichie mezhdu dvumya raznymi ideyami, figuriruyushchimi pod etim nazvaniem: abstraktnyh tipov dannyh i ierarhicheskih tipov, nazyvaemyh takzhe klassami. Ponyatie abstraktnogo tipa dannyh sostoit v tom, chto tip ob容kta opredelyaetsya imenem, mnozhestvom dopustimyh znachenij i mnozhestvom dopustimyh operacij, a ne organizaciej hraneniya, kotoraya dolzhna byt' skryta. Primerami yavlyayutsya pakety Ada (s zashchishchennymi tipami) i moduli v yazyke Modula. Ierarhicheskie tipy, takie klassy v Simula-67, pozvolyayut opredelyat' obshchie interfejsy, kotorye v dal'nejshem mozhno utochnyat' s pomoshch'yu podchinennyh tipov. |ti dve koncepcii ortogonal'ny: mogut byt' otkrytye ierarhii i skrytie bez ierarhij. Obe koncepcii dejstvitel'no yavlyayutsya dostizheniem v iskusstve programmirovaniya. Kazhdaya iz nih ustranyaet eshche odnu vtorostepennuyu slozhnost', pozvolyaya razrabotchiku vyrazit' sushchnost' svoego proekta bez ispol'zovaniya bol'shogo kolichestva sintaksicheskogo materiala, ne dobavlyayushchego novogo informacionnogo soderzhaniya. Ispol'zovanie kak abstraktnyh, tak i ierarhicheskih tipov ustranyaet vtorostepennye trudnosti bolee vysokogo poryadka i pozvolyaet vyrazit' proekt na bolee vysokom urovne. I vse zhe takie dostizheniya mogut ne bolee chem ustranit' vtorostepennye trudnosti pri vyrazhenii proekta. Sushchestvenna slozhnost' samogo proekta, na chto reshenie takih zadach nikak ne mozhet povliyat'. Dobit'sya vyigrysha na poryadok velichin s pomoshch'yu ob容ktno-orientirovannogo programmirovaniya mozhno lish' v tom sluchae, esli ostayushchayasya segodnya v nashem yazyke programmirovaniya neobyazatel'naya rabota po specifikacii tipov sama po sebe otvetstvenna za 9/10 usilij, zatrachivaemyh na proektirovanie programmnogo produkta. V etom ya ne somnevayus'. Iskusstvennyj intellekt. Mnogie ozhidayut, chto uspehi v oblasti iskusstvennogo intellekta pozvolyat osushchestvit' revolyucionnyj perevorot, kotoryj prineset rost proizvoditel'nosti razrabotki programmnogo obespecheniya i ego kachestva na poryadki velichin.4 YA etogo ne zhdu. CHtoby uvidet', pochemu, razberem, chto ponimaetsya pod "iskusstvennym intellektom", a zatem posmotrim, kakie vozmozhny primeneniya. Parnas vnes yasnost' v terminologicheskij haos: Segodnya v hodu dva sovershenno raznyh opredeleniya II. II-1: ispol'zovanie komp'yuterov dlya resheniya zadach, kotorye ran'she mogli byt' resheny tol'ko s pomoshch'yu chelovecheskogo intellekta. II-2: ispol'zovanie special'nyh priemov programmirovaniya, izvestnyh kak evristicheskoe, ili osnovannoe na pravilah, programmirovanie. Pri takom podhode izuchayut dejstviya ekspertov, chtoby opredelit', kakimi evristikami i prakticheskim pravilami oni pol'zuyutsya pri reshenii zadach... Programma korrektiruetsya dlya resheniya zadach tak, kak, po-vidimomu, ee reshaet chelovek. U pervogo opredeleniya skol'zkij smysl... Koe-chto ukladyvaetsya segodnya v opredelenie II-1, no kak tol'ko my vidim rabotu programmy i ponimaem zadachu, my uzhe ne dumaem o nej, kak o II... K neschast'yu, ya ne vizhu yadra metodov, kotorye unikal'ny v etoj oblasti... Po bol'shej chasti metody problemno-orientirovanny, i dlya ih perenosa trebuyutsya izvestnye abstrakciya i tvorchestvo.5 YA polnost'yu soglasen s etoj kritikoj. Priemy, ispol'zuemye dlya raspoznavaniya rechi, vykazyvayut malo shodstva s metodami raspoznavaniya izobrazhenij, pri etom v ekspertnyh sistemah ispol'zuyutsya metody, otlichnye ot teh i drugih. YA zatrudnyayus' skazat', k primeru, kakoe vliyanie raspoznavanie izobrazhenij mozhet okazat' na metody programmirovaniya. To zhe samoe spravedlivo v otnoshenii raspoznavaniya rechi. Pri razrabotke programm trudno reshit', chto imenno skazat', a ne sobstvenno skazat'. Nikakoe oblegchenie vyrazheniya ne mozhet dat' bol'she, chem neznachitel'nye vygody. Metody ekspertnyh sistem II-2 zasluzhivayut otdel'nogo paragrafa. |kspertnye sistemy. Naibolee razvitoj i shiroko primenyaemoj chast'yu iskusstvennogo intellekta yavlyayutsya ekspertnye sistemy. Mnogie uchenye v oblasti programmirovaniya napryazhenno trudyatsya nad primeneniem etoj tehnologii v sredah razrabotki programmnogo obespecheniya.5 V chem sostoit ideya, i kakovy perspektivy? |kspertnaya sistema - eto programma, soderzhashchaya obobshchennyj generator vyvodov i bazu pravil, prednaznachennuyu dlya priema vhodnyh dannyh i dopushchenij i issledovaniya logicheskih sledstvij cherez zaklyucheniya, vyvodimye iz bazy pravil, predostavlyayushchaya zaklyucheniya i rekomendacii i predlagayushchaya pol'zovatelyu ob座asnenie poluchennyh rezul'tatov putem obratnogo proslezhivaniya svoih rassuzhdenij. Pomimo chisto determinirovannoj logiki, generator vyvodov obychno mozhet rabotat' s nechetkimi ili veroyatnostnymi dannymi. Takie sistemy predostavlyayut nekotorye yavnye preimushchestva pered zaprogrammirovannymi algoritmami resheniya teh zhe zadach: - Tehnologiya generatora vyvodov razrabatyvaetsya nezavisimo ot primeneniya i ispol'zuetsya zatem vo mnogih prilozheniyah. - Izmenyaemye chasti specificheskih dlya prilozheniya dannyh edinoobrazno kodiruyutsya v baze pravil. Obespechivaetsya instrumentarij dlya razrabotki, izmeneniya, proverki i dokumentirovaniya bazy pravil. |tim uporyadochivaetsya znachitel'naya chast' slozhnosti samogo prilozheniya. |dvard Fejgenbaum (Edward Feigenbaum) schitaet, chto moshch' takih sistem rastet ne blagodarya sovershenstvovaniyu mehanizmov vyvoda, a skoree, blagodarya popolneniyu bazy znanij, vse bolee tochno otrazhayushchej real'nyj mir. YA schitayu, chto samoe vazhnoe dostizhenie etoj tehnologii sostoit v razdelenii slozhnosti prilozheniya i samoj programmy. Kak mozhno ispol'zovat' ekspertnye sistemy pri sozdanii programmnogo obespecheniya? Razlichnymi sposobami: predlozhenie pravil interfejsov, rekomendacii po strategii otladki, zapominanie chastoty oshibok kazhdogo tipa, podskazki po optimizacii i t.p. Predstavim sebe, k primeru, nekoego sovetchika po otladke. V samoj zachatochnoj forme diagnosticheskaya ekspertnaya sistema ves'ma napominaet pamyatku pilota, po suti, delaya predpolozheniya otnositel'no vozmozhnyh prichin zatrudnenij. Po mere razvitiya bazy pravil predpolozheniya stanovyatsya bolee specifichnymi, bolee izoshchrenno uchityvaya simptomy problemy. Mozhno predstavit' takogo pomoshchnika predlagayushchim snachala samye obshchie resheniya, no, po mere voploshcheniya v baze pravil vse bol'shej chasti struktury sistemy, stanovyashchegosya vse bolee razborchivym v generiruemyh gipotezah i predlagaemyh testah. Takaya ekspertnaya sistema mozhet reshitel'no otlichat'sya ot obychnyh tem, chto ee baza pravil, veroyatno, dolzhna byt' ierarhicheski razbita na moduli takim zhe obrazom, kak sootvetstvuyushchij programmnyj produkt. Poetomu pri izmenenii modul'noj struktury produkta izmenyaetsya takzhe modul'naya struktura bazy diagnosticheskih pravil. Rabota, kotoruyu neobhodimo prodelat' dlya sozdaniya diagnosticheskih pravil, v lyubom sluchae dolzhna byt' provedena pri sozdanii nabora kontrol'nyh primerov dlya modulej i dlya sistemy. Esli eto delat' dostatochno obshchim obrazom, s edinoobraznoj strukturoj pravil i pri nalichii horoshego generatora vyvodov, to mozhno dejstvitel'no sokratit' ob容m rabot pri generacii kontrol'nyh primerov, a takzhe pozhiznennom soprovozhdenii i testirovanii modifikacij. Takie zhe usloviya my mozhem postavit' i dlya drugih sovetchikov, ispol'zuemyh dlya drugih uchastnikov zadachi sozdaniya programmy. Vozmozhno, oni budut mnogochislenny i inogda prosty. Na puti rannej realizacii poleznyh ekspertnyh sovetnikov dlya razrabotchika programmy stoit mnogo prepyatstvij. Reshayushchej chast'yu nashego voobrazhaemogo scenariya yavlyaetsya razrabotka prostyh sposobov perehoda ot zadaniya struktury programmy k avtomaticheskomu ili poluavtomaticheskomu sozdaniyu diagnosticheskih pravil. Eshche bolee slozhnoj i vazhnoj yavlyaetsya dvojnaya zadacha priobreteniya znanij: najti chlenorazdel'no vyrazhayushchihsya i sposobnyh k samoanalizu ekspertov, ponimayushchih, pochemu oni delayut to ili drugoe dejstvie, i razrabotat' effektivnye metody izvlecheniya ih znanij i prevrashcheniya v bazy pravil. CHtoby postroit' ekspertnuyu sistemu, neobhodimo imet' eksperta. Naibol'shim vkladom ekspertnyh sistem, nesomnenno, budet predostavlenie neopytnomu programmistu opyta i vseh znanij, nakoplennyh luchshimi programmistami. I eto ne malo. Razryv mezhdu luchshimi i srednimi priemami programmirovaniya ochen' velik, vozmozhno, on bol'she, chem v lyuboj drugoj inzhenernoj discipline. Poetomu sredstvo rasprostraneniya horoshih priemov bylo by ochen' vazhnym. "Avtomaticheskoe" programmirovanie. Pochti 40 let lyudi zhdut i pishut ob "avtomaticheskom programmirovanii" - generacii reshayushchej zadachu programmy, ishodya iz formulirovki specifikacii etoj zadachi. Nekotorye vyskazyvayutsya segodnya tak, budto ozhidayut ot etoj tehnologii gryadushchego perevorota.7 Parnas predpolagaet, chto termin ispol'zuetsya iz-za effektnosti, a ne semanticheskogo soderzhaniya, utverzhdaya: Koroche, avtomaticheskoe programmirovanie vsegda bylo evfemizmom dlya programmirovaniya na yazyke bolee vysokogo urovnya, chem dostupnyj programmistu v dannyj moment.8 On utverzhdaet, v sushchnosti, chto v bol'shinstve sluchaev nuzhno zadat' specifikaciyu ne zadachi, a metoda resheniya. Mozhno otyskat' isklyucheniya. Metod sozdaniya generatorov yavlyaetsya ochen' moshchnym i povsednevno s pol'zoj primenyaetsya v programmah sortirovki. Nekotorye sistemy integrirovaniya differencial'nyh uravnenij takzhe pozvolyali pryamuyu formulirovku zadachi. Sistema proizvodila ocenku parametrov, vybirala iz biblioteki metody resheniya i generirovala programmy. U etih primenenij est' svojstva, blagopriyatstvuyushchie avtomatizacii: - Problemy legko opisyvayutsya sravnitel'no nebol'shim chislom parametrov. - Izvestno mnogo metodov resheniya, chto obespechivaet nalichie biblioteki al'ternativ. - Tshchatel'nyj analiz privel k vyrabotke yavnyh pravil vybora metodov resheniya v zavisimosti ot parametrov. Edva li vozmozhno obobshchenie takih metodov na ves' mir obychnyh programmnyh sistem, v kotorom situaciya s takimi priyatnymi svojstvami yavlyayutsya isklyucheniyami. Trudno dazhe predstavit' sebe, kak takoj proryv v obobshchenii mog by proizojti razumnym obrazom. Graficheskoe programmirovanie. Izlyublennoj temoj doktorskih dissertacij v programmnoj inzhenerii yavlyaetsya graficheskoe, ili vizual'noe, programmirovanie - primenenie komp'yuternoj grafiki v razrabotke programmnogo obespecheniya.9 Inogda perspektivy takogo podhoda osnovyvayutsya na analogii s proektirovaniem SBIS, v kotorom komp'yutery igrayut takuyu bol'shuyu rol'. Inogda takoj podhod obosnovyvaetsya, ishodya iz togo, chto blok-shemy yavlyayutsya ideal'nym materialom pri proektirovanii programm. Imeyutsya moshchnye sredstva dlya sozdaniya takih blok- shem. Nichego ubeditel'nogo i udivitel'nogo iz etih popytok poka ne vyshlo, - i ya uveren, ne vyjdet. Vo-pervyh, kak ya vsyudu dokazyvayu, blok-shema yavlyaetsya ves'ma slaboj abstrakciej struktury programmy.10 Luchshe vsego eto vidno iz popytok Berksa, fon Nejmana i Gol'dstajna snabdit' svoj predpolagaemyj komp'yuter krajne neobhodimym upravlyayushchim yazykom vysokogo urovnya. V tom zhalkom vide - mnogie stranicy soedinennyh liniyami pryamougol'nikov, - v kotorom segodnya razrabatyvayutsya blok-shemy, oni dokazali, v sushchnosti, svoyu bespoleznost': programmisty risuyut ih posle, a ne do sozdaniya opisyvaemyh imi programm. Vo-vtoryh, segodnyashnie ekrany imeyut slishkom malo pikselov, chtoby pokazat' celikom i s dostatochnym razresheniem skol'ko-nibud' podrobnuyu shemu programmy. Tak nazyvaemaya "metafora rabochego stola" stanovitsya metaforoj "siden'ya samoleta". Vsyakij, komu prihodilos' listat' pachku bumag, buduchi stisnutym dvumya korpulentnymi sosedyami, pochuvstvuet raznicu: odnovremenno mozhno uvidet' ochen' nemnogo. Nastoyashchij rabochij stol pozvolyaet obozrevat' i proizvol'no vybirat' mnozhestvo bumag. Bolee togo, v poryve tvorchestva ne odin programmist ili pisatel' predpochital rabochemu stolu bolee vmestitel'nyj pol. Apparatnym tehnologiyam nuzhno sdelat' ochen' bol'shoj nag, chtoby predostavlyaemyj ekranami obzor byl dostatochnym dlya zadach proektirovaniya programm. Esli obratit'sya k osnovam, programmnoe obespechenie ochen' trudno vizualizirovat', kak ya dokazyval eto vyshe. Sostavlyaem li my shemy upravlyayushchej logiki, vlozhennyh oblastej, vidimosti peremennyh, perekrestnyh ssylok peremennyh, potokov dannyh, ierarhicheskih struktur dannyh ili chego-to eshche, oni otrazhayut lish' odno izmenenie vzaimodejstvuyushchih zaputannym obrazom chastej programmnoj sistemy. Esli nalozhit' odna na druguyu eti shemy, otrazhayushchie vzglyad s razlichnyh tochek zreniya, trudno izvlech' iz etogo kakuyu-libo obshchuyu tochku zreniya. Analogiya s integral'nymi shemami vvodit, v sushchnosti, v zabluzhdenie: konstrukciya mikroshemy predstavlyaet soboj mnogoslojnyj dvumernyj ob容kt, geometriya kotorogo otrazhaet sushchnost'. Programmnaya sistema ne yavlyaetsya takim ob容ktom. Verifikaciya programm. Mnogo truda v sovremennom programmirovanii tratitsya na otladku i ispravlenie oshibok. Mozhet byt', my najdem serebryanuyu pulyu, ustraniv vse oshibki v samom nachale, na etape sistemnogo proektirovaniya? Mozhno li radikal'no povysit' proizvoditel'nost' i nadezhnost' produkta, esli sledovat' sovershenno inoj strategii - obespechit' korrektnost' proekta, prezhde chem tratit' ogromnye usiliya na ego realizaciyu i testirovanie? Ne dumayu, chto my obnaruzhim zdes' chudesa. Verifikaciya programm yavlyaetsya ochen' moshchnoj koncepciej, i ona ochen' vazhna dlya takih veshchej, kak sozdanie nadezhnogo yadra operacionnoj sistemy. |ta tehnologiya ne obeshchaet, odnako, ekonomii truda. Verifikaciya trebuet stol'ko raboty, chto ves'ma nemnogie znachitel'nye programmy voobshche byli verificirovany. Verifikaciya programm ne oznachaet sozdaniya programm, lishennyh oshibok. I zdes' net chudes. Matematicheskie dokazatel'stva tozhe mogut byt' oshibochnymi. Poetomu hotya verifikaciya mozhet oblegchit' testirovanie, ona ne mozhet otmenit' ego. Bolee sushchestvenno, chto dazhe samaya sovershennaya verifikaciya programmy mozhet lish' opredelit', chto programma otvechaet svoim specifikaciyam. Samaya slozhnaya zadacha programmirovaniya - poluchit' polnuyu i neprotivorechivuyu specifikaciyu, i sushchnost' sozdaniya programmy na praktike vo mnogom sostoit v otladke specifikacii. Sredy programmirovaniya i instrumenty. Kakogo eshche vyigrysha mozhno ozhidat' ot stremitel'no rasshiryayushchihsya issledovanij po usovershenstvovaniyu sred programmirovaniya? Instinktivno kazhetsya, chto zadachi, kotorye sulili naibol'shuyu otdachu, byli v chisle pervyh, za kotorye vzyalis', i ih uzhe reshili: ierarhicheskie fajlovye sistemy, edinoobraznye formaty fajlov dlya polucheniya edinoobraznyh programmnyh interfejsov i obobshchennyh instrumentov. Orientirovannye na konkretnye yazyki intellektual'nye redaktory poka ne ochen' rasprostraneny, no bol'shee, na chto oni sposobny, eto ustranenie sintaksicheskih oshibok i melkih semanticheskih. Vozmozhno, naibol'shij vyigrysh sreda programmirovaniya smozhet dat' pri ispol'zovanii stroennyh sistem baz dannyh dlya otslezhivaniya miriadov detalej, kotorye kazhdyj programmist dolzhen tochno vspominat', i kotorye dolzhny hranit'sya v tekushchem sostoyanii v gruppe rabotayushchih nad odnoj sistemoj. Nesomnenno, chto eto rabota zasluzhivaet vnimaniya i prineset nekotorye plody kak dlya proizvoditel'nosti, tak i dlya nadezhnosti. No vvidu samoj ee suti otdacha dolzhna byt' neznachitel'noj. Rabochie stancii. Kakoj vyigrysh mozhet poluchit' iskusstvo programmirovaniya ot nesomnennogo i bystrogo rosta moshchnosti i ob容ma pamyati otdel'noj rabochej stancii? Skol'ko millionov operacij v sekundu mozhno plodotvorno ispol'zovat'? Sostavlenie i redaktirovanie programm vpolne obespechivayutsya segodnyashnimi skorostyami. Kompilyaciya mozhet byt' uskorena, no desyatikratnoe uvelichenie skorosti mashiny, vne somneniya, sdelaet obdumyvanie osnovnym zanyatiem programmista v techenie rabochego dnya. Pozhaluj, eto tak uzhe sejchas. Konechno, my privetstvuem uvelichenie moshchnosti rabochih stancij. No rasschityvat' na svyazannye s etim chudesa my ne mozhem. Perspektivnye podhody k konceptual'noj sushchnosti Hotya nikakoj proryv v tehnologii ne obeshchaet takih volshebnyh rezul'tatov, kakie my vidim v apparatnoj chasti komp'yuterov, v nastoyashchee vremya delaetsya mnogo poleznogo, i est' nadezhdy na neuklonnyj, hotya i nebroskij progress. Vse tehnologicheskie podhody k akcidenciyam processa programmirovaniya principial'no ogranicheny uravneniem produktivnosti: Esli, kak ya polagayu, konceptual'nye sostavlyayushchie zadachi sejchas otnimayut bol'shuyu chast' vremeni, to nikakaya rabota nad sostavnymi chastyami zadachi, yavlyayushchimisya prosto vyrazheniem koncepcij, ne dast bol'shogo vyigrysha. Poetomu my dolzhny rassmotret' te napravleniya, kotorye zatragivayut samu sushchnost' problemy programmirovaniya - formulirovku etih slozhnyh konceptual'nyh struktur. K schast'yu, nekotorye iz etih napravlenij ves'ma mnogoobeshchayushchi. Pokupat', a ne sozdavat'. Naibolee radikal'noe vozmozhnoe reshenie pri sozdanii programm - voobshche ne sozdavat' ih. S kazhdym dnem eto stanovitsya vse legche, poskol'ku vse bol'shee chislo postavshchikov predlagaet vse bolee mnogochislennye i luchshie programmnye produkty dlya nemyslimogo raznoobraziya prilozhenij. Poka my, inzhenery-programmisty, trudilis' nad sovershenstvovaniem metodologii proizvodstva, revolyuciya, proizvedennaya personal'nymi komp'yuterami, sozdala ne odin, a mnogo massovyh rynkov programmnogo obespecheniya. V kazhdom gazetnom kioske vystavleny ezhemesyachnye zhurnaly, v kotoryh, otsortirovannye po tipam mashin, reklamiruyutsya i recenziruyutsya desyatki produktov po cenam ot neskol'kih dollarov do neskol'kih soten dollarov. Bolee specializirovannye izdaniya predlagayut ochen' moshchnye produkty dlya rabochih stancij i drugih rynkov Unix. Dazhe instrumenty i sredy programmirovaniya mogut byt' kupleny v korobochnom vide. YA gd