(Бу мәкалә 2001 елгы Franz Developer симпозиумында сөйләнгән чыгышка нигезләнгән.)
1995 елның җәендә дустым Роберт Моррис белән без Viaweb дип аталган стартап башлап җибәрдек. Безнең планыбыз гади кулланучыларга онлайн-кибетләр ясарга мөмкинлек бирә торган программа тәэминаты язу иде. Ул чорда бу программаның яңалыгы шунда иде: ул безнең серверда эшли һәм интерфейс сыйфатында гади веб-битләрне куллана иде.
Әлбәттә, бер үк вакытта бу идея күп кенә кешеләрнең башына килергә мөмкин иде, әмма, минем белүемчә, Viaweb веб нигезендәге беренче кушымта булды. Бу идея безгә шулкадәр яңа булып күренде ки, без компанияне аның хөрмәтенә атадык: Viaweb, чөнки безнең программа өстәл өсте компьютерында эшләү урынына, веб аша (via Web) эшли иде.
Бу программа тәэминатының тагын бер гадәти булмаган ягы шунда: ул, нигездә, Lisp дип аталган программалаштыру телендә язылган иде. Бу шул вакытка кадәр башлыча университетларда һәм фәнни лабораторияләрдә генә кулланылып килгән Lisp телендә язылган беренче зур кулланучы кушымталарының берсе булды. [1]
Яшерен корал
Эрик Реймонд «Ничек хакер булырга» дигән эссе язган иде, һәм анда, башка нәрсәләр белән беррәттән, ул булачак хакерларга кайсы телләрне өйрәнергә кирәклеген сөйли. Ул өйрәнү җиңел булганга күрә Python һәм Java теленнән башларга тәкъдим итә. Җитди хакер, Unix системасын вату өчен, C телен, ә система белән идарә итү һәм cgi-скриптлар өчен Perl телен өйрәнергә теләр. Ниһаять, чын-чынлап җитди хакер Lisp телен өйрәнү турында уйланырга тиеш:
Lisp телен аны ахыр чиктә аңлагач алачак тирән яктырыну тәҗрибәсе өчен өйрәнергә кыйммәт; бу тәҗрибә, хәтта сез беркайчан да Lisp теленең үзен күп кулланмасагыз да, гомерегезнең калган өлешендә сезне яхшырак программист итәчәк.
Бу — латин телен өйрәнү файдасына еш кына ишетелә торган шул ук дәлил. Латин теле сезгә классик филология профессорыннан тыш эш табуга ярдәм итмәс, ләкин ул сезнең зиһенегезне үстерәчәк һәм сез чыннан да кулланырга теләгән телләрдә, мәсәлән, инглиз телендә яхшырак язучы итәчәк.
Ләкин бераз көтегез. Бу чагыштыру ул кадәр ерак китә алмый. Латин теленең сезгә эш таба алмавының сәбәбе — беркемнең дә бу телдә сөйләшмәвендә. Әгәр сез латинча язсагыз, сезне беркем дә аңламаячак. Әмма Lisp — ул компьютер теле, ә компьютерлар сез, программист, аларга кушкан теләсә кайсы телдә сөйләшә.
Шуңа күрә, әгәр Lisp сезне, ул әйткәнчә, яхшырак программист итә икән, нигә аны кулланырга теләмәскә? Әгәр рәссамга аны яхшырак рәссам итә торган пумала тәкъдим итсәләр, миңа калса, ул аны барлык картиналарында да кулланырга теләр иде, шулай түгелме? Мин монда Эрик Реймондтан көләргә теләмим. Гомумән алганда, аның киңәше яхшы. Аның Lisp турында әйткәннәре — гадәти кабул ителгән фикер. Ләкин бу гадәти фикердә каршылык бар: Lisp сезне яхшырак программист итәчәк, әмма сез аны барыбер кулланмаячаксыз.
Ни өчен кулланмаска? Программалаштыру телләре — бары тик кораллар гына бит. Әгәр Lisp чыннан да яхшырак программалар тудыра икән, сез аны кулланырга тиешсез. Әгәр алай булмаса, ул кемгә кирәк?
Бу бары тик теоретик кына сорау түгел. Программа тәэминаты — бик көндәшлекле һәм табигый монополияләргә омтылучы өлкә. Программаны тизрәк һәм яхшырак язган компания, башка шартлар тигез булганда, көндәшләрен базардан кысрыклап чыгарачак. Һәм сез яңа стартап башлаганда, моны бик кискен сизәсез. Стартаплар, гадәттә, «я барысы да, я бернәрсә дә» дигән кагыйдәгә буйсына. Сез я байыйсыз, я бернәрсәсез каласыз. Стартапта, әгәр сез ялгыш технологиягә ставка ясасагыз, көндәшләрегез сезне тар-мар итәчәк.
Роберт та, мин дә Lisp телен яхшы белә идек, һәм без үз инстинктларыбызга ышанмаска һәм Lisp сайламаска бернинди сәбәп тә күрмәдек. Без калганнарның барысы да үз программаларын C++ яки Perl телендә язганын белә идек. Ләкин без аның бернәрсәне дә аңлатмавын да яхшы белә идек. Әгәр технологияләрне шулай сайласагыз, сез Windows кулланырга тиеш булыр идегез. Технология сайлаганда, сез башкаларның нәрсә эшләвенә игътибар итмәскә, һәм иң яхшы нәтиҗә бирә торганны гына карарга тиешсез.
Бу бигрәк тә стартапларга кагыла. Зур компаниядә сез башка барлык зур компанияләр эшләгәнне эшли аласыз. Ләкин стартап башка стартаплар эшләгәнне эшли алмый. Минемчә, хәтта стартапларда эшләүчеләрнең күбесе дә моны аңлап бетерми.
Уртача зур компания елына якынча ун процентка үсә. Шуңа күрә, әгәр сез зур компания белән идарә итсәгез һәм барысын да уртача зур компания эшләгәнчә эшләсәгез, сез уртача зур компания кебек үк уңышка ирешергә — ягъни елына якынча ун процентка үсәргә өметләнә аласыз.
Әгәр сез стартап белән идарә итсәгез, әлбәттә, шул ук хәл булачак. Әгәр сез барысын да уртача стартап эшләгәнчә эшләсәгез, сез уртача нәтиҗәләргә генә өметләнә аласыз. Мондагы проблема шунда: уртача нәтиҗә сезнең бөлүегезне аңлата. Стартапларның яшәп калу дәрәҗәсе илле проценттан күпкә түбәнрәк. Шуңа күрә, әгәр сез стартап белән идарә итәсез икән, сезгә гадәти булмаган нәрсәдер эшләү яхшырак. Алай булмаса, эшегез харап.
1995 елда без көндәшләребез аңламаган, һәм хәзер дә бик азы гына төшенгән бер нәрсәне белә идек: бары тик үзегезнең серверларыгызда гына эшләргә тиешле программа тәэминатын язганда, сез үзегез теләгән теләсә кайсы телне куллана аласыз. Өстәл өсте программаларын язганда, кушымталарны операцион система белән бер үк телдә язуга көчле омтылыш була. Ун ел элек кушымталар язу дигәндә C телендә язу күздә тотыла иде. Әмма веб нигезендәге программалар белән, бигрәк тә сездә телнең дә, операцион системаның да башлангыч коды булганда, сез үзегез теләгән теләсә нинди телне куллана аласыз.
Ләкин бу яңа ирек — ике ягы да үткен кылыч. Хәзер, теләсә нинди телне куллана алгач, сез кайсысын кулланырга кирәклеге турында уйларга тиешсез. Бернәрсә дә үзгәрмәде дип кыланырга тырышкан компанияләр көндәшләренең алай эшләмәвен күреп куркыныч астында кала.
Әгәр сез теләсә нинди телне куллана аласыз икән, кайсысын сайларсыз? Без Lisp телен сайладык. Беренчедән, бу базарда тиз эшкәртү бик мөһим булачагы ачык иде. Без барыбыз да нульдән башладык, шуңа күрә яңа мөмкинлекләрне көндәшләреннән алдарак кертә алган компания зур өстенлеккә ия булачак иде. Без Lisp теленең программаларны тиз язу өчен чыннан да яхшы тел икәнен белә идек, ә сервер нигезендәге кушымталар тиз эшкәртү нәтиҗәсен тагын да арттыра, чөнки сез программаны әзер булу белән чыгара аласыз.
Башка компанияләр Lisp кулланырга теләмәсә, тагын да яхшырак. Бу безгә технологик өстенлек бирә алыр иде, ә безгә мөмкин булган һәр ярдәм кирәк иде. Viaweb компаниясен башлаганда безнең бизнеста бернинди тәҗрибәбез дә юк иде. Без маркетинг, кешеләрне эшкә алу, акча җәлеп итү яки клиентлар табу турында бернәрсә дә белми идек. Икебезнең берсе дә хәтта «чын эш» дип атап булырлык җирдә эшләп карамаган иде. Без бары тик программа язуны гына яхшы белә идек. Бу безне коткарыр дип өметләндек. Программа ягыннан нинди өстенлек ала алсак, шуны файдаланырга әзер идек.
Шулай итеп, Lisp куллануны бер эксперимент дип әйтергә була. Безнең фараз буенча, әгәр без программабызны Lisp телендә язсак, яңа функцияләрне көндәшләребезгә караганда тизрәк ясый алыр идек, шулай ук программабызда алар булдыра алмаган нәрсәләрне эшли алыр идек. Lisp бик югары дәрәҗәле тел булганга күрә, безгә зур эшкәртүчеләр төркеме кирәк булмас иде, димәк, чыгымнарыбыз да азрак булыр иде. Әгәр бу шулай булса, без азрак акчага яхшырак продукт тәкъдим итә һәм барыбер табыш ала алыр идек. Ахыр чиктә, барлык кулланучылар безгә килер иде, ә көндәшләребез бернәрсәсез калып, вакыт узу белән ябылыр иде. Ничек кенә булмасын, без шулай булыр дип өметләндек.
Бу экспериментның нәтиҗәләре нинди булды? Көтмәгәндә, бу ысул эшләде. Соңрак безнең көндәшләребез бик күп, якынча егерме-утыз тирәсе булды, ләкин аларның берсенең дә программасы безнеке белән ярыша алмады. Безнең серверда эшли торган, әмма өстәл өсте кушымтасы кебек тоелган wysiwyg онлайн-кибет ясау системабыз бар иде. Ә көндәшләребездә бары тик cgi-скриптлар гына иде. Функцияләр ягыннан без һәрвакыт алардан күпкә алда бардык. Кайвакыт, аптыраганнан, көндәшләр бездә булмаган функцияләрне кертергә тырыша иде. Ләкин Lisp ярдәмендә безнең эшкәртү циклыбыз шулкадәр тиз иде ки, кайвакыт көндәш үзенең пресс-релизында яңа функция турында игълан иткәннән соң бер-ике көн эчендә үк без аны кабатлый ала идек. Пресс-релиз турында язучы журналистлар безгә шалтыратуга, бу яңа функция бездә дә бар иде инде.
Көндәшләребезгә бездә ниндидер яшерен корал бар кебек тоелгандыр — имештер, без аларның Enigma шифрларын укыйбыз яки шуңа охшаш нәрсәдер. Чынлыкта безнең чыннан да яшерен коралыбыз бар иде, ләкин ул алар уйлаганнан күпкә гадирәк иде. Аларның планнарын безгә беркем дә җиткермәде. Без бары тик программа тәэминатын һәркем мөмкин дип уйлаганнан тизрәк ясый алдык.
Миңа якынча тугыз яшьләр тирәсе булганда, кулыма очраклы рәвештә Фредерик Форсайтның «Шакал көне» китабы эләкте. Төп герой — Франция президентын үтерү өчен ялланган үтерүче. Президентның үтү юлына караган фатирга менү өчен, үтерүчегә полиция аша узарга кирәк була. Ул кәкре таякка таянган карт булып киенеп, туп-туры алар яныннан уза, һәм алар берни дә шикләнми.
Безнең яшерен коралыбыз да шуңа охшаш иде. Без программабызны җәяләр белән тулы сәер синтаксислы сәер ЯИ (ясалма интеллект) телендә яздык. Күп еллар дәвамында Lisp теленең шулай сурәтләнүен ишетү мине ачуландыра иде. Әмма хәзер бу безнең файдага эшләде. Бизнеста көндәшләрегез төшенмәгән технологик өстенлектән дә кыйммәтлерәк бернәрсә дә юк. Бизнеста, сугыштагы кебек үк, көтелмәгәнлек көч кебек үк кадерле.
Шуңа күрә, бераз оят булса да әйтим: без Viaweb өстендә эшләгәндә мин беркайчан да ачыктан-ачык Lisp турында сөйләмәдем. Без матбугатта беркайчан да бу турыда телгә алмадык, һәм сез безнең сайтта Lisp сүзен эзләсәгез, табарлык бердәнбер нәрсә — минем биографиямдәге ике китап исеме генә иде. Бу очраклы түгел иде. Стартап үз көндәшләренә мөмкин кадәр азрак мәгълүмат бирергә тиеш. Әгәр алар безнең программаның кайсы телдә язылганын белмәсәләр яки кызыксынмасалар, мин моның шулай калуын теләдем.[2]
Безнең технологияне иң яхшы аңлаган кешеләр — клиентлар иде. Алар шулай ук Viaweb нинди телдә язылуы белән кызыксынмады, ләкин аның бик яхшы эшләвен тойдылар. Ул аларга сүзенең туры мәгънәсендә берничә минут эчендә менә дигән онлайн-кибетләр ясарга мөмкинлек бирде. Шулай итеп, күбесенчә сүз аркылы таралып, безнең кулланучылар саны көннән-көн артты. 1996 ел ахырына бездә 70кә якын онлайн-кибет бар иде. 1997 ел ахырында — 500. Алты айдан соң, Yahoo безне сатып алганда, безнең 1070 кулланучыбыз бар иде. Бүген, Yahoo Store сыйфатында, бу программа үз базарында өстенлек итүен дәвам итә. Бу — Yahoo-ның иң керемле өлешләренең берсе, һәм аның ярдәмендә ясалган кибетләр Yahoo Shopping нигезен тәшкил итә. Мин Yahoo-дан 1999 елда киттем, шуңа күрә хәзер аларда күпме кулланучы икәнен төгәл белмим, ләкин соңгы ишеткән хәбәрләрем буенча якынча 20 000 тирәсе иде.
Блаб парадоксы
Lisp теленең нәрсәсе шулкадәр шәп? Һәм Lisp шулкадәр шәп икән, нигә барысы да аны кулланмый? Бу риторик сораулар кебек тоела, ләкин чынлыкта аларга гади җаваплар бар. Lisp бары тик үз фидакарьләренә генә күренә торган ниндидер тылсымлы сыйфатка ия булганга түгел, ә бары тик иң көчле тел булганга күрә шундый бөек. Ә аны һәркемнең кулланмавының сәбәбе шунда: программалаштыру телләре технология генә түгел, фикерләү гадәтләре дә булып тора, ә гадәтләр бик акрын үзгәрә. Әлбәттә, бу ике җавап та аңлатуны таләп итә.
Мин гаять бәхәсле бер белдерүдән башлыйм: программалаштыру телләренең көче төрлечә.
Кимендә, югары дәрәҗәле телләрнең машина теленә караганда көчлерәк булуы белән бәхәсләшүчеләр аз булыр. Бүгенге көндә күпчелек программистлар гадәттә машина телендә программа язарга кирәк түгеллеге белән килешерләр. Киресенчә, сез югары дәрәҗәле телдә язарга, ә компилятор аны сезнең өчен машина теленә тәрҗемә итәргә тиеш. Бу идея хәзер хәтта җиһазга (hardware) да салынган: 1980 нче еллардан башлап инструкцияләр җыелмасы кеше-программистлар өчен түгел, ә компиляторлар өчен эшләнә.
Бөтен программаны кулдан машина телендә язуның хата булуын һәркем белә. Ләкин монда тагын да гомумирәк бер кагыйдә барлыгын сирәк аңлыйлар: берничә тел арасында сайлау мөмкинлегегез булса, башка шартлар тигез булганда, иң көчлесеннән башка теләсә кайсы телдә программалаштыру — хата. [3]
Бу кагыйдәдән чыгымнар күп. Әгәр сез билгеле бер телдә язылган программа белән бик тыгыз эшләргә тиешле программа язсагыз, яңа программаны шул ук телдә язу яхшы фикер булырга мөмкин. Әгәр сез саннарны эшкәртү яки битләр белән манипуляция кебек бик гади нәрсә эшләргә тиешле программа язсагыз, сез азрак абстракт телне куллана аласыз, бигрәк тә ул бераз тизрәк эшләргә мөмкин булганда. Әгәр сез кыска, бер тапкыр кулланыла торган программа язсагыз, бу бурыч өчен иң яхшы китапханә функцияләренә ия булган телне сайлау отышлырак булырга мөмкин. Ләкин гомумән алганда, гамәли программа тәэминаты өчен сез үзегез таба алган иң көчле (һәм җитәрлек дәрәҗәдә нәтиҗәле) телне кулланырга тиешсез, ә башкасын куллану — машина телендә программа язу кебек үк хата, бәлки азрак дәрәҗәдә генәдер.
Машина теленең бик түбән дәрәҗәдә икәнен сез күрәсез. Ләкин, кимендә ниндидер социаль килешү буларак, югары дәрәҗәле телләрнең барысына да тигез итеп карыйлар. Алар тигез түгел. Техник яктан «югары дәрәҗәле тел» термины бик үк төгәл бернәрсәне дә аңлатмый. Бер ягында машина телләре, ә икенче ягында барлык югары дәрәҗәле телләр торган аерым чик юк. Телләр иң көчлесеннән башлап машина телләренә кадәр абстрактлык континуумында [4] урнашкан, ә машина телләренең үзләре дә көч буенча аерыла.
Cobol телен карагыз. Cobol — машина теленә компиляцияләнү мәгънәсендә югары дәрәҗәле тел. Cobol көче буенча, әйтик, Python белән тигез дип кемдер җитди раслар идеме? Ул, мөгаен, Python-га караганда машина теленә якынрактыр.
Яисә Perl 4 турында нәрсә әйтеп була? Perl 4 һәм Perl 5 арасында телгә лексик замыканиеләр (lexical closures) өстәлде. Күпчелек Perl хакерлары Perl 5-нең Perl 4-кә караганда көчлерәк булуы белән килешерләр. Ләкин моны таныгач, сез бер югары дәрәҗәле телнең икенчесеннән көчлерәк була алуын таныйсыз. Һәм моннан котылгысыз рәвештә шул чыга: аерым очраклардан тыш, сез үзегез ала алган иң көчле телне кулланырга тиешсез.
Ләкин бу фикерне ахырына кадәр сирәк җиткерәләр. Билгеле бер яшьтән соң программистлар телләрне үз теләкләре белән сирәк алыштыралар. Кешеләр кайсы телгә күнеккән булса, гадәттә шуны җитәрлек дәрәҗәдә яхшы дип саныйлар.
Программистлар үзләренең яраткан телләренә бик нык бәйләнәләр, һәм мин беркемнең дә хисләрен рәнҗетергә теләмим, шуңа күрә бу фикерне аңлату өчен мин шартлы рәвештә Blub дип аталган телне кулланачакмын. Blub абстрактлык континуумының нәкъ уртасында урнашкан. Бу иң көчле тел түгел, ләкин ул Cobol яки машина теленә караганда көчлерәк.
Һәм чынлыкта, безнең шартлы Blub-программистыбыз бу ике телнең берсен дә кулланмас иде. Әлбәттә, ул машина телендә программа язмас иде. Компиляторлар нәкъ менә шуның өчен бар бит. Ә Cobol турында әйткәндә, ул кешеләрнең аның белән ничек нәрсәдер эшли алуын күз алдына да китерә алмый. Анда хәтта x та (сез сайлаган теләсә кайсы Blub үзенчәлеге) юк.
Безнең шартлы Blub-программисты көч континуумы буенча аска караганда, ул үзеннән астагы телләргә караганын белә. Blub-тан көчсезрәк телләр ачыктан-ачык көчсезрәк, чөнки аларда ул күнеккән кайбер мөмкинлекләр юк. Ләкин безнең шартлы Blub-программисты капма-каршы якка, көч континуумы буенча өскә караганда, ул өскә караганын аңламый. Ул бары тик сәер телләрне генә күрә. Ул аларны, мөгаен, Blub белән көч ягыннан якынча тигез, ләкин өстәмә рәвештә төрле кирәкмәгән катлаулылыклар тупланган телләр дип саный. Blub аның өчен җитәрлек, чөнки ул Blub телендә фикерли.
Әмма без көч континуумында югарырак торган теләсә кайсы телне кулланучы программистның карашына күчсәк, ул үз чиратында Blub-ка өстән аска карый. Blub телендә ничек нәрсәдер эшләп булсын инде? Анда бит хәтта y та юк.
Индукция буенча, төрле телләр арасындагы барлык көч аермаларын күрә алырлык бердәнбер программистлар — иң көчле телне аңлаучылар. (Эрик Реймондның Lisp сезне яхшырак программист итә дип әйтүенең мәгънәсе дә шунда булгандыр.) Сез башкаларның фикерләренә ышана алмыйсыз, чөнки Blub парадоксы эшли: алар үзләре кулланган теләсә кайсы тел белән канәгать, чөнки ул тел аларның программалар турында фикер йөртү рәвешен билгели.
Мин моны үз тәҗрибәмнән беләм, мин югары сыйныф укучысы чагында Basic телендә программалар яза идем. Бу тел хәтта рекурсияне дә тотмый иде. Хәзер рекурсия кулланмыйча программа язуны күз алдына китерү кыен, ләкин ул вакытта миңа аның җитмәве сизелми дә иде. Мин Basic телендә фикерли идем. Һәм мин анда чын оста идем. Үзем күргән бөтен нәрсәнең хуҗасы идем.
Эрик Реймонд хакерларга тәкъдим иткән биш тел көч континуумының төрле нокталарында урнашкан. Аларның бер-берсенә карата кайда урнашуы — четерекле тема. Мин бары тик Lisp иң өстә тора дип саныйм дип әйтә алам. Һәм бу дәлилне раслау өчен, калган дүрт телгә караганда миңа нәрсә җитмәвен әйтермен. Аларда макросларсыз ничек нәрсәдер эшләп була, дип уйлыйм мин. [5]
Күп телләрдә макрос дип аталган нәрсә бар. Ләкин Lisp макрослары уникаль. Ышанасызмы-юкмы, аларның эшләү принцибы шул җәяләр белән бәйле. Lisp ясаучылары телгә бу бөтен җәяләрне башкалардан аерылып тору өчен генә кертмәгәннәр. Blub-программисты өчен Lisp коды сәер күренә. Ләкин ул җәяләр анда бер сәбәпсезгә генә түгел. Алар — Lisp белән башка телләр арасындагы төп аерманың тышкы билгесе.
Lisp коды Lisp мәгълүмат объектларыннан төзелгән. Һәм бу башлангыч файлларның символлардан торуы һәм юлларның тел тарафыннан якланган мәгълүмат типларының берсе булуы кебек гади мәгънәдә түгел. Lisp коды, парсер тарафыннан укылганнан соң, сез эчендә йөри ала торган мәгълүмат структураларыннан тора.
Әгәр компиляторларның ничек эшләвен аңласагыз, чынлыкта монда төп нәрсә Lisp-ның сәер синтаксиска ия булуында түгел, ә Lisp-та бөтенләй бернинди синтаксисның булмавында. Сез программаларны башка телләрне анализлаганда компилятор эчендә барлыкка килә торган синтаксик агачларда (parse trees) язасыз. Ләкин бу синтаксик агачлар сезнең программаларыгыз өчен тулысынча ачык. Сез аларны үзгәртә торган программалар яза аласыз. Lisp телендә бу программалар макрослар дип атала. Алар — программалар яза торган программалар.
Программалар яза торган программалар? Сезгә бу кайчан кирәк булырга мөмкин? Әгәр сез Cobol телендә фикерләсәгез — бик сирәк. Әгәр Lisp телендә фикерләсәгез — һәрвакыт. Монда көчле макрос мисалын китереп, «менә! ничек сезгә бу?» дип әйтү бик уңайлы булыр иде. Ләкин алай эшләсәм, Lisp белмәгән кешегә бу мәгънәсез нәрсә булып кына күренер иде; монда аның нәрсә аңлатканын төшенү өчен кирәк булган бар нәрсәне аңлатып бетерерлек урын юк. Ansi Common Lisp китабында мин барысын да мөмкин кадәр тизрәк аңлатырга тырыштым, ләкин шулай да макросларга 160 нчы биткә кадәр җитә алмадым.
Ләкин, минемчә, мин үтемле булырдай бер дәлил китерә алам. Viaweb редакторының башлангыч кодының якынча 20-25 процентын макрослар тәшкил итә иде. Макросларны язу гади Lisp функцияләренә караганда кыенрак, һәм аларны кирәк булмаганда куллану начар стиль санала. Димәк, бу кодтагы һәр макрос анда бары тик кирәк булганга гына бар. Бу шуны аңлата: бу программадагы кодның кимендә 20-25 проценты башка теләсә кайсы телдә җиңел генә эшләп булмый торган нәрсәләрне эшли. Blub-программисты минем Lisp-ның серле көче турындагы сүзләремә никадәр генә шикләнеп карамасын, бу аны кызыксындырырга тиеш. Без бу кодны күңел ачу өчен язмадык. Без кечкенә стартап идек һәм үзебез белән көндәшләребез арасында технологик киртәләр куяр өчен бөтен көчебезгә программа яздык.
Шикчел кеше монда ниндидер бәйләнеш юкмы дип уйлана башлар иде. Безнең кодның зур бер өлеше башка телләрдә эшләү бик кыен булган нәрсәләрне эшли иде. Нәтиҗәдә алынган программа тәэминаты көндәшләребезнең программалары булдыра алмаган нәрсәләрне эшләде. Бәлки, монда ниндидер бәйләнеш бардыр. Мин сезгә бу җеп буйлап барырга киңәш итәм. Кәкре таякка таянып аксап баручы шул карт күренгәнгә караганда күпкә серлерәк булырга мөмкин.
Стартаплар өчен айкидо
Ләкин мин беркемне дә (25 яшьтән узганнарны) Lisp өйрәнергә күндәм дип көтмим. Бу мәкаләнең максаты — кемнеңдер фикерен үзгәртү түгел, ә Lisp куллану белән кызыксынган кешеләрне — Lisp-ның көчле тел икәнен белгән, ләкин аның киң таралмавыннан борчылган кешеләрне тынычландыру. Көндәшлек шартларында бу — өстенлек. Lisp көче сезнең көндәшләрегезнең аны аңламавы белән тагын да арта.
Әгәр сез стартапта Lisp куллану турында уйлыйсыз икән, аның киң таралмавы турында борчылырга тиеш түгелсез. Сез аның шулай булып калуына өметләнергә тиешсез. Һәм ул, мөгаен, шулай калыр да. Күпчелек кешенең хәзерге вакытта кулланган нәрсәләре белән канәгать булуы — программалаштыру телләренең табигате. Компьютер җиһазлары шәхси гадәтләргә караганда шулкадәр тизрәк үзгәрә ки, программалаштыру практикасы, гадәттә, процессордан ун-егерме елга артта кала. MIT кебек урыннарда алар 1960 еллар башында ук югары дәрәҗәле телләрдә программалар яза иде, ләкин күп кенә компанияләр 1980 елларга кадәр машина телендә код язуны дәвам итте. Күп кешеләр, мөгаен, процессор, ябылып өйгә кайтырга ашыккан бармен кебек, risc инструкцияләр системасына күчеп аларны куып чыгарганчыга кадәр машина телендә язуны дәвам иткәндер.
Гадәттә технология тиз үзгәрә. Ләкин программалаштыру телләре башкача: программалаштыру телләре технология генә түгел, алар — программистлар фикерли торган нәрсә. Алар — яртылаш технология һәм яртылаш дин.[6] Шуңа күрә уртача тел, ягъни уртача программист кулланган теләсә кайсы тел, айсберг кебек акрын кузгала. 1960 еллар тирәсендә Lisp тарафыннан кертелгән чүп җыю (garbage collection) хәзер киң таралган яхшы нәрсә дип санала. Башкару вакытындагы типлаштыру (runtime typing) да шулай ук популярлаша бара. 1970 еллар башында Lisp керткән лексик замыканиеләр хәзер генә радар экраннарында күренә башлады. 1960 еллар уртасында Lisp тарафыннан кертелгән макрослар исә һаман да terra incognita булып кала бирә.
Билгеле, уртача тел гаять зур инерциягә ия. Мин бу куәтле көч белән көрәшергә тәкъдим итмим. Мин моңа капма-каршы нәрсәне тәкъдим итәм: Айкидо остасы кебек, сез аны көндәшләрегезгә каршы куллана аласыз.
Әгәр сез зур компаниядә эшләсәгез, бу җиңел булмаска мөмкин. Селкенүчән чәчле башлыкка (pointy-haired boss), ул гәҗиттән башка берәр телнең, егерме ел элек Ada кебек, бөтен дөньяны яулап алырга торуын яңа гына укып чыккач, проектларны Lisp телендә төзергә рөхсәт бирүенә ирешүе бик кыен булачак. Ләкин әгәр сез әлегә мондый башлыклары булмаган стартапта эшләсәгез, сез, без эшләгән кебек, Blub парадоксын үз файдагызга бора аласыз: сез көндәшләрегез, уртача телгә мәңгелеккә береккән килеш, беркайчан да ирешә алмаячак технологияне куллана аласыз.
Әгәр кайчан да булса үзегезне стартапта эшләүче итеп күрсәгез, көндәшләрне бәяләү өчен менә сезгә файдалы киңәш. Аларның вакансияләрен укыгыз. Аларның сайтындагы калган барлык нәрсә сток фотолары яки шуңа тиң текстлар булырга мөмкин, ләкин вакансияләр аларның нәкъ нәрсә теләвен ачык күрсәтергә тиеш, югыйсә алар кирәксез кандидатларны алачак.
Viaweb өстендә эшләгән елларда мин бик күп эш тасвирламаларын укыдым. Һәр ай саен диярлек почмактан яңа көндәш килеп чыккан кебек иде. Аларның онлайн-демосы бармы-юкмы икәнен тикшергәннән соң, мин эшләгән беренче эш — аларның вакансияләрен карау иде. Берничә елдан соң мин кайсы компанияләрдән куркырга, ә кайсыларыннан курыкмаска кирәклеген аера ала идем. Эш тасвирламаларында IT рухы никадәр күбрәк булса, компания шулкадәр куркынычсызрак иде. Иң куркынычсызы — Oracle тәҗрибәсен таләп иткәннәре иде. Алар турында беркайчан да борчылырга кирәк түгел иде. Шулай ук, әгәр алар C++ яки Java эшкәртүчеләрен эзлибез дисәләр, сез иминлектә идегез. Әгәр алар Perl яки Python программистларын эзләсәләр, бу бераз куркынычрак булыр иде — бу инде техник ягы белән, кимендә, чын хакерлар идарә итә торган компаниягә охшый башлый. Ә инде мин Lisp хакерларын эзләүче белдерүне күрсә идем, мин чыннан да бик нык борчылыр идем.
Искәрмәләр
[1] Башта Viaweb ике өлештән тора иде: кулланучылар үз сайтларын төзү өчен кулланган, Lisp телендә язылган редактор һәм заказларны эшкәртә торган, C телендә язылган заказ системасы. Беренче версия башлыча Lisp теленнән гыйбарәт иде, чөнки заказ системасы кечкенә иде. Соңрак без тагын ике модуль өстәдек: C телендә язылган сурәтләр генераторы һәм күбесенчә Perl телендә язылган back-office идарә итү системасы.
2003 елның гыйнварында Yahoo C++ һәм Perl телләрендә язылган яңа мөхәррир версиясен чыгарды. Әмма программа Lisp телендә язылмый башлады дип әйтү кыен, чөнки аны C++ теленә күчерү өчен аларга сүзгә-сүз Lisp интерпретаторы язарга туры килде: битләрне җитештерүче барлык шаблоннарның башлангыч файллары, минем белүемчә, әле дә Lisp коды булып тора. (Гринспанның унынчы кагыйдәсен карагыз.)
[2] Роберт Моррис миңа сер сакларга кирәк булмаган иде, ди, чөнки көндәшләребез безнең Lisp кулланганыбызны белгән очракта да, ни өчен икәнен барыбер аңламас иде: «Әгәр алар шулкадәр акыллы булса, инде күптән Lisp телендә программалаштырыр иде».
[3] Барлык телләр дә Тьюринг буенча эквивалент булу мәгънәсендә тигез дәрәҗәдә көчле, ләкин программалаштыручылар бу сүзне мондый мәгънәдә күрми. (Беркемнең дә Тьюринг машинасын программалаштырасы килми.) Программалаштыручылар күздә тоткан көчне формаль рәвештә билгеләү кыен булырга мөмкин, әмма аны болай аңлатып була: бу — көчсезрәк телдә бары тик көчлерәк тел өчен интерпретатор язып кына алып була торган мөмкинлекләр. Әгәр A телендә юллардан бушлыкларны бетерү операторы булса, ә B телендә булмаса, бу A телен көчлерәк итми, чөнки моны B телендә ярдәмче программа (subroutine) язып та эшләп була. Ләкин A теле, әйтик, рекурсияне хупласа, ә B хупламаса, моны инде гади китапханә функцияләре язып кына төзәтеп булмый.
[4] Нөрдларга искәрмә: яки, бәлки, өскә таба тарая торган рәшәткә (lattice) булырга мөмкин; монда төзелешнең формасы түгел, ә ким дигәндә өлешчә тәртип барлыгы мөһим.
[5] Макросларга аерым бер мөмкинлек итеп кенә карау бераз ялгыштыра. Гамәлдә аларның файдасы лексик йомылулар (lexical closures) һәм rest-параметрлар кебек Lisp-ның башка үзенчәлекләре ярдәмендә нык арта.
[6] Нәтиҗәдә, программалаштыру телләрен чагыштыру я дини сугышлар төсен ала, яисә антропология хезмәтләрен хәтерләткән, үтә дә нейтраль студентлар дәреслекләре формасында була. Тынычлыгын кадерләгән яки профессор вазифасын (tenure) сакларга теләгән кешеләр бу темадан кача. Ләкин бу сорау яртылаш кына дини сорау булып тора; монда, бигрәк тә яңа телләр проектларга теләсәгез, өйрәнергә лаеклы нәрсәләр бар.