Pull to refresh

Что было бы, если бы Хемингуэй писал на JavaScript

Reading time6 min
Views12K
Перевод статьи If Hemingway wrote JavaScript.

Эту статью написал мой хороший друг и коллега, Агнус Кролль. Агнус работает в команде разработки основной функциональности твиттера, участвует во всевозможных конференициях и ведет потрясающий блог про JavaScript. Кроме того, он большой поклонник художественной литературы, и я подумал, что будет круто, если он напишет что-то о программировании с точки зрения литературы.

Я любил художественную литературу задолго до того, как написал свою первую строчку кода. Сейчас я довольно много пишу на JavaScript, и, вдобавок, ещё и книгу пишу об этом.

Так что же такого в JavaScript, что так привлекает многих поклонников литературы? У меня есть несколько дурацких теорий, связанных с выразительным потенциалом ограниченного синтаксиса, но об этом как-нибудь в другой раз. Давайте взглянем на великих писателей: что если бы они писали на JavaScript? Как фанат Хемингуэя со стажем, я бы сказал, что он скорее всего возненавидел бы программирование (и программистов). Но я готов поспорить, что среди всеобщего презрения нашлось бы маленькое теплое местечко для JavaScript, потому что это был бы своего рода его язык. Свободный и обманчиво простой на поверхности, которая скрывает сущность и драму под собой.

Родоначальник всех код ревью




Мне недавно приснился сон, в котором я попросил Хемингуэя и ещё четырех светил мира литературы написать для меня небольшую функцию, которая вернет последовательность Фибоначчи заданной длины. Каждый писатель решил пойти своим путем, но в целом они неплохо справились:

Эрнест Хеминугэй


function fibonacci(size) {

  var first = 0, second = 1, next, count = 2, result = [first, second];

  if(size < 2)
    return "the request was made but it was not good"

  while(count++ < size) {
    next = first + second;
    first = second;
    second = next;
    result.push(next);
  }
  return result;
}


Обошлось без сюрпризов. Только самое необходимое. Ни одного лишнего слова. Ни одной лишней переменной. Нельзя сказать, что код красив. Он немного педантичен — но в этом вся суть Хемингуэя как писателя. Тут не нужна продуманная логика или выразительные имена для переменных. Код чист, прост, делает то, что должен и ничего более.

Хемингуэй на дух не переносил дураков, так что если вы спросите насчет последовательности из менее чем двух чисел, он вас просто проигнорирует. “Я устал и этот вопрос — идиотский”.

Уильям Шекспир


function theSeriesOfFIBONACCI(theSize) {

  //a CALCKULATION in two acts.
  //employ'ng the humourous logick of JAVA-SCRIPTE

  //Dramatis Personae
  var theResult; //an ARRAY to contain THE NUMBERS
  var theCounter; //a NUMBER, serv'nt to the FOR LOOP

  //ACT I: in which a ZERO is added for INITIATION

  //[ENTER: theResult]

  //Upon the noble list bestow a zero
  var theResult = [0];

  //ACT II: a LOOP in which the final TWO NUMBERS are QUEREED and SUMM'D

  //[ENTER: theCounter]

  //Commence at one and venture o'er the numbers
  for (theCounter = 1; theCounter < theSize; theCounter++) {
    //By divination set adjoining members
    theResult[theCounter] = (theResult[theCounter-1]||1) + theResult[Math.max(0, theCounter-2)];
  }

  //'Tis done, and here's the answer.
  return theResult;

  //[Exuent]
}

Бард не на шутку разошелся, но по-другому быть и не могло. Заметьте, что комментарии (именно комментарии, а не ремарки и названия актов) сложены пятистопным ямбом — двудольным стихотворным размером, в котором ударение падает на каждый второй слог в стопе. В своих пьесах Шекспир часто добавляет драматический акцент, немного отклоняясь от пятистопного ямба, — добавляя лишний слог или перенося ударение в слове. И похоже, что он использует ту же уловку здесь. Так держать, Уилл.

Андре Бретон


function Colette(umbrella) {
  var staircase = 0, galleons = 0, brigantines = 1, armada = [galleons, brigantines], bassoon;
  Array.prototype.embrace = [].push;

  while(2 + staircase++ < umbrella) {
    bassoon = galleons + brigantines;
    armada.embrace(brigantines = (galleons = brigantines, bassoon));
  }

  return armada;
}

Как основоположник сюрреализма, Бретон считает, что сны гораздо интереснее реальности, и они формируют основу наших творческих начинаний. Существительные выбраны соответствующие. Несмотря на то, что работы Бретона легко подвергнуть критике, они вечны, неизменно сердечны и красивы — бессознательный подъем глубин воображения.

Скорее всего Бретон назвал функцию в честь своей бывшей, а результат получился с помощью флота, состоящего из древних судов. Сам код выделяется характерной элегантной логикой — Бретон использует оператор запятая, чтобы одновременно сдвинуть значения элементов массива. Снимаю шляпу, Андре.

Роберто Боланьо


function LeonardoPisanoBigollo(l) {

  if(l < 0) {
    return "I'd prefer not to respond. (Although several replies occur to me)"
  }

  /**/

  //Everything is getting complicated.
  for (var i=2,r=[0,1].slice(0,l);i<l;r.push(r[i-1]+r[i-2]),i++)

  /**/

  //Here are some other mathematicians. Mostly it's just nonsense.

  rationalTheorists = ["Archimedes of Syracuse", "Pierre de Fermat (such margins, boys!)", "Srinivasa Ramanujan", "Rene Descartes", "Leonhard Euler", "Carl Gauss", "Johann Bernoulli", "Jacob Bernoulli", "Aryabhata", "Brahmagupta", "Bhaskara II", "Nilakantha Somayaji", "Omar Khayyám", "Muhammad ibn Mūsā al-Khwārizmī", "Bernhard Riemann", "Gottfried Leibniz", "Andrey Kolmogorov", "Euclid of Alexandria", "Jules Henri Poincaré", "Srinivasa Ramanujan", "Alexander Grothendieck (who could forget?)", "David Hilbert", "Alan Turing", "von Neumann", "Kurt Gödel", "Joseph-Louis Lagrange", "Georg Cantor", "William Rowan Hamilton", "Carl Jacobi", "Évariste Galois", "Nikolay Lobachevsky", "Rene Descartes", "Joseph Fourier", "Pierre-Simon Laplace", "Alonzo Church", "Nikolay Bogolyubov"]

  /**/

  //I didn't understand any of this, but here it is anyway.
  return r

  /**/

  //Nothing happens here and if it does I'd rather not talk about it.
}

Если за свою жизнь вы не прочитали хотя бы одну книгу Боланьо, вы прожили её зря. Его книги замечательны: одновременно беззаботно сложные и очаровывающе наивны, а стиль повествования можно охарактеризовать обезоруживающе-обаятельной честностью.

Оставаясь верным самому себе, Боланьо приправил свой код признаниями в неуверенности, смущении и невежестве. Решение собственно задачи, причем решение блестящее, подается как бы в раздумьях. Всегда навязчивый, всегда сомневающийся, Боланьо с большей радостью предлагает нам не очень-то интересный и совершенно бесполезный список гениев-математиков.

Но в коде есть ещё несколько характерных черт творчества Боланьо: симбиоз коротких и длинных абзацев, отсутствие точек с запятой (отражающее отсутствие кавычек в его произведениях), а также явное использование глобальных переменных, предполагающее, что каждая переменная будет ещё не раз использована в последующих частях.

Чарльз Дикенс


function mrFibbowicksNumbers(enormity) {
  var assortment = [0,1,1], tally = 3, artfulRatio = 1.61803;

  while(tally++ < enormity) {
    //here is an exceedingly clever device
    assortment.push(Math.round(assortment[tally-2] * artfulRatio));
  }

  //should there be an overabundance of elements, a remedy need be applied
  return assortment.slice(0, enormity);
}

Я не большой поклонник Дикенса и по большей части согласен с чертовски точной оценкой Генри Джеймса:

“Если мы рискнем дать определение его литературной личности, то нам придется назвать его величайшим поверхностным романистом. Мы понимаем, что такое определение ставит его на низшую ступень писательского цеха, которую он украшает, но мы осознаем последствия нашего предположения. По нашему мнению, это было бы преступлением против человечества — поставить Дикенса в один ряд с величайшими романистами. Потому что он не создал ничего, кроме образа. Не добавил ничего к нашему пониманию человеческой натуры” — Генри Джеймс о Чарльзе Дикенсе, обзор романа “Наш общий друг”, журнал “The Nation”, 21 декабря 1865 года.

Вместо заключения


Будь то защитные механизмы Дугласа Крокфорда или сухие и узколобые ограничения из учебников по информатике, доктрина и догма всегда будут врагами хорошего кода на JavaScript. Некоторым программистам нравятся своды правил и шаблоны, и именно поэтому у нас есть Java. Радость JavaScript кроется в гибкости и огромном количестве возможностей, которые он предоставляет. Естественные языки обладают теми же свойствами. Лучшими писателями и разработчиками на JavaScript являются те, кого захватывает язык, кто изучает и экспериментирует каждый день, чтобы создать свой собственный стиль, свои идиомы и выражения.

На этом всё. Надеюсь вам понравилось эта чепуха.
Tags:
Hubs:
Total votes 80: ↑61 and ↓19+42
Comments43

Articles