Об отладке транс-идентификации.

Первоначально опубликовано на alicealexandra.com.

Меня всегда тянуло в лабиринты.

Я слишком очарован архитекторами головоломок.

Мне нравится думать о себе как о своего рода мастере головоломок. Возможно, все программисты такие: мы создаем кодовые базы для решения конкретных, почти невидимых проблем. Отладка, отладка.

Я рисовал много лабиринтов. Я заполнил свой блокнот путями и подделками.

В третьем классе младший брат моего друга сказал, что хочет вырасти мальчиком. В то время это было возможно в моем сознании. Когда я начал цементировать стены?

Полезно установить границы в вашем приложении, разделить код по задачам. Функции, которые взаимодействуют с дизайном здесь. Функции, которые строят здесь инфраструктуру. Аккуратный и аккуратный.

Но когда код выдает ошибку, вам нужно просмотреть всю файловую систему, чтобы найти ее.

Откуда вы знаете, с чего начать?

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

Кроссворды New York Times имеют размер 15 на 15 квадратов. Все аккуратно. Упорядоченный. Вовремя. Я люблю кроссворд за его ага-моменты. То, как каждое решение намекает на следующее.

Действительно умно — разработать систему, в которой один вывод логически ведет вперед.

Я слишком часто хочу, чтобы обучение в реальном мире было больше похоже на кроссворды.

Но я предпочитаю лабиринты.

Когда я собираюсь решить головоломку в коде, я всегда забываю, что у меня есть отправная точка.

Проблема начинает подавлять меня. Я не могу отследить, где в стеках строк это может отдаваться эхом.

В подростковом возрасте, в студенческие годы, в свои двадцать лет я был склонен к суициду.

Мой мозг жаждал побега из лабиринта.

Запутанная ошибка в моем коде.

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

Понятно, как каждое решение способствует целому.

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

Наблюдать за прогрессом при создании приложения намного сложнее. Ошибки могут вызвать регресс. Вы можете удалить сотни строк кода, пытаясь изолировать проблему.

Иногда работа в обратном направлении — единственный выход. Часто в лабиринтах лучше всего начинать с финиша.

Есть инструмент — один из первых, который вы изучаете в JavaScript — под названием console.log().

console.log() отображает для вас все, что вы помещаете между скобками.

console.log("Help me. I can't get out.")

Результат, само собой:

Help me. I can't get out.

Сначала этот разговор с самим собой не кажется полезным.

console.log("Hi, there.")

Hi, there.

Привет, компьютер.

Вы тот, кто разрабатывает программу. Вы должны знать, что он может сказать. Но иногда вы запускаете свое приложение и:

Error. Gibberish.

Помните — вы не программируете в вакууме. Браузер тоже игрок. Вы должны удовлетворить что-то помимо себя.

Итак, вы гуглите тарабарщину. Каждый на Stack Overflow особенно бесполезен сегодня. Никто не отвечает на вашу тему в Discord. Вы даже Бинг! это потому, что вы слышали ChatGPT и Bing! поженились, но сначала вы должны присоединиться к их программе раннего доступа и —

Ты просто хочешь, чтобы чертова штука работала.

Твой мозг болит.

Может быть, и твое тело.

Итак, вы выясняете, что ошибка возникает в одной из трех функций (если повезет). Вы добавляете console.log() к каждой функции:

function one() {
	// do stuff
	console.log("Function 1.")
}
function two() {
	// do stuff
	console.log("Function 2.")
}
function three() {
	// do stuff
	console.log("Function 3.")
}

Вы снова запускаете код:

Function 1.

Function 2.

Error. Gibberish.

Теперь вы узнали что-то ценное. Ошибка происходит в функции three(). Иногда одного этого может быть достаточно, чтобы понять это. В других случаях three() падает в кроличью нору. И лабиринты в еще лабиринты.

Профессиональные решатели могут решить воскресный кроссворд за семь минут. Кроссворд не приводит к очередной головоломке. Это один и сделано. Он становится все меньше.

Даже в лабиринте не так много путей, чтобы проследить. Место финиша известно. Это просто о том, чтобы добраться до него.

В программировании сложность растет с увеличением размера приложения. Например, есть переменные. Если вы скажете:

let age = 22
console.log(age)

Вы получаете:

22

age становится сокращением для присвоенного ему номера.

Вы даже можете вернуться к коду через год и добавить:

age = 23
console.log(age)

И на этот раз вы получите:

22

23

age, см., переменная. Он меняется с течением времени или, в данном случае, с кодом. JavaScript всегда выполняется сверху вниз. От начала его жизни до конца.

Есть исключения, но мы к этому вернемся.

Многое переменно в коде. Это может запутать. Чему, например, после этого равно home?

function moveOut() {
	let home = "a place"
	if (age < 18) {
		home = "Ohio";
	} else if (age <= 26) {
		home = "Indiana";
	} else if (age < 28) {
		home = "Egypt";
	} else if (age <= 29) {
		home = "England";
	}
	return home;
}
console.log(moveOut)

«Ну, — скажете вы, если сообразительны, — home зависит от age, но age никогда не упоминается в этом коде, так что мы получим ошибку».

За что вы были бы технически правильны и тем самым заработали бы себе золотую звезду.

Но в этом примере вы можете представить, что значение age получается из каких-то вычислений в другом месте. Теперь стоимость дома зависит не только от age, но и от расчета age.

Что, если расчет зависит от двух других переменных? Или если happiness зависит от home? Или gender зависит от age в отдельном файле? Внезапно мы оказываемся в кроличьей норе, если возникает ошибка. Слишком много движущихся частей.

Слишком много лет прошло в замешательстве.

Энигматологам требуется гораздо больше времени, чтобы создать головоломку, чем решить ее. Здесь мир бесконечен. Ящики еще не существуют, чтобы их заполнять. С чего начать?

Уилл Шортц, основатель кроссворда New York Times, говорит, что это просто: Большинство ежедневных газетных кроссвордов имеют размер 15 на 15 квадратов. Итак, [например], у меня было три ответа из 15 букв. Планета обезьян, обезьяны и сэр Эдвард Гиббон.

Темы. Составьте полезный рассказ.

Одним из полезных инструментов для программистов является уклонение от резины. Звучит более сексуально, чем есть на самом деле. По сути, когда вы натыкаетесь на последнее остроумие, вы берете желтую резиновую утку, которую поставили на стол специально для этого момента. Убаюкайте его в своих руках. Вы пытаетесь объяснить ему суть жука словами, понятными только резиновым уточкам.

Этот акт перевода часто заставляет нас рассматривать ошибку как часть истории. Тема.

В терапии я часто пытался переосмыслить свой жизненный нарратив. Я надеялся, что принуждение к тому, чтобы все это имело смысл для другого человека, могло бы дать мне представление о чем-то за пределами моих знаний.

Проблема и прелесть резиновых уточек в том, что они могут реагировать только писком.

Кстати, Times платит 750 долларов за головоломку — 2250 долларов, если это выходной день. Я не мог не заметить, что оба числа делятся на 15.

Даже в коде я пытаюсь придать смысл. Произвольная структура.

Вместо того, чтобы писать let перед определением переменной, вы можете написать const для «константы».

Константы не могут быть изменены. const как запор. Как только значение введено, ничего не выходит.

const age = 26

Мы можем приблизить момент времени. Оставайтесь там некоторое время. Остановить летящие годы.

Одна константа, какой бы условной она ни была, часто может привести к созданию другой. Если age всегда равно 26, то вычисления, зависящие от него, также могут быть постоянными.

Если такая константа, как brain, не меняется, возможно, не меняется и heart.

Создание головоломки больше похоже на ее решение, чем вы думаете.

Джонатан Блоу — один из моих любимых энигматологов. Возможно, он наиболее известен как дизайнер видеоигр, но я думаю о нем как о программисте и философе в равной степени.

Он также известен тем, что у него действительно неудачная фамилия.

В The Witness, главном произведении Блоу, вам предстоит исследовать ярко окрашенный остров, решая головоломки, которые на первый взгляд кажутся такими же простыми, как перемещение линии с одной стороны экрана на другую.

На протяжении всей игры эти лабиринты усложняются, повторяя их пути в игровом мире. Например, на картинке выше вы можете найти лабиринт, выделенный желтым цветом, который отражает пути шнуров на земле.

Если бы я что-то сказал о реальности, так это то, что вещи влияют, взаимосвязаны и вызывают усложнение ситуации, — говорит Блоу в интервью для Time. «Вы думаете, что у вас есть одна, две или три простые вещи, а затем вы обнаруживаете, что то, как они взаимодействуют, создает новые явления или субявления, а затем эти явления взаимодействуют с исходными вещами, и в конечном итоге вы получаете довольно сложный гобелен. ”

На самом деле в начале The Witness есть головоломка с тенью, отбрасываемой на ближайший выступ. Задача состоит в том, чтобы провести линию от одной стороны головоломки к другой, но есть много способов провести эту линию. Вы можете, как и я, бороться, пока не поймете: если вы нарисуете линию, идеально отделяющую тень от света, проблема решена.

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

console.log() — это, в конце концов, лишь один из многих инструментов, которые нам нужны для наблюдения за кодом.

Мне нравится думать, что вещи, которые мы изучаем в цифровом мире, могут выйти за рамки реальной жизни.

В каждой видеоигре, где мне давали выбор, я выбирал роль главного героя женского пола.

В The Witness вы никогда не сможете вселиться в другое тело, кроме своего собственного. Камера от первого лица никогда не прерывает поток между вами и миром.

Мир головоломок, которые, безусловно, больше, чем просто головоломки. Некоторые загадки приобретают реальную красоту.

На протяжении более 40 часов The Witness вы начинаете общаться с его создателем. Не Блою, мастеру головоломок, а Джонатану-человеку. Вы прекращаете решать головоломки достаточно долго, чтобы начать решать его.

Это неописуемо интимный опыт. Уходить от головоломок только для того, чтобы найти их создателя.

В дополнение к console.log() у программистов также есть уход в качестве инструмента для отладки.

Звучит нелогично, но я не могу передать вам, сколько раз я попадал в неправильные детали. Что-то в мире может пробудить мой разум, может вдохновить меня на решение.

Когда я учился в аспирантуре, я любил школьные задания, но ненавидел преподавание. Что-то в том, чтобы стоять перед студентами, утомляло меня до глубины души. Чувствовал себя как поддельный путь. Я надевал пуговицы и пытался вести дискуссию, все время задаваясь вопросом, что может быть не так.

Я подумал: я интроверт. Я подумал: у меня плохо с публичными выступлениями.

Я был слишком близок к проблеме.

Я уклонился от своего терапевта. Я изменил свой распорядок. Я пробовал все.

Как мы решаем, когда решение невидимо? Когда проблема незаметна?

Проследи, проследи.

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

Я ушла в себя, попыталась найти недостающую часть.

Возможно, самая интересная часть The Witness заключается в следующем: когда вы застреваете во всех головоломках вокруг вас, когда вы решили сдаться, вы оказываетесь в единственном оставшемся месте, которого вы не знали. Вы рвали на себе волосы: самые ранние области игры.

Вы вспоминаете обо всех решенных загадках вокруг вас, о том времени, когда вы знали все ответы.

И в таких условиях Джонатан часто оставлял что-то особенное — что-то, что сейчас выделяется. Что-то, что напрямую помогает с теми головоломками, на которых вы застряли.

Мы спим, мечтаем, путешествуем во времени, просыпаемся, идем, решаем.

Мне кажется интересным, что первая игра Блоу, Braid, требовала от игрока стратегически перематывать время назад, чтобы пройти каждый уровень.

Мы уже говорили о том, как усложняется переменный код, но не касались асинхронного кода.

В JavaScript есть обещания, часто обозначаемые ключевыми словами async и await.

Например:

async function activateCrosswalk() {
	const ready = await signalChange();
	return ready;
}

Код зависает, когда видит это ключевое слово await, позволяя разрешить signalChange(), прежде чем сообщить остальной кодовой базе, что мы готовы перейти улицу.

Дело в том, что за это время ожидания может проехать тысяча машин. Птица может нагадить на фонарный столб. Кто-то другой (конечно, не вы) может броситься через улицу, несмотря на красный свет светофора.

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

Он не мчится по улицам на красный свет.

Когда вы просите код подождать, пока обещание будет разрешено, остальной мир продолжает двигаться, в то время как эта часть остается замороженной во времени.

Когда я был маленьким, я думал: Я буду похож на нее, когда вырасту.

Всю жизнь можно прожить, ожидая выполнения обещаний.

Может появиться миллион точек энтропии, миллион путей в лабиринте.

Код async/await может, конечно, вернуть ошибку. На самом деле, асинхронный код часто используется, чтобы избежать нарушения работы синхронного приложения. Если код всегда выполняется сверху вниз, то любое прерывание означает, что выполнение кода должно прекратиться.

Я буду ждать этого, и если это произойдет, я сделаю это. Но если этого не произойдет, я сделаю это вместо этого.

Обещания нарушаются так же легко, как и решаются.

Функция, которая не возвращает значение, называется void. И их труднее всего отлаживать. Таким образом, асинхронность может объяснить энтропию в упорядоченной системе.

Слишком легко забыть обещания, которые мы сами себе дали. Чтобы забыть, чего мы ждем.

Я упомянул, что в какой-то момент был склонен к суициду. Я никогда не ставил себе ультиматум; Я просто позволил своему мозгу повиснуть. Не было если этого то живи, иначе то пока. Всегда общее ощущение нежелания существовать.

Я принципиально не знал, чего жду ответа из пустоты.

Когда я был ребенком, я рисовал лабиринты для своей сестры. Они начинались, может быть, как каракули в церкви, но вскоре я обнаружил необходимость усложнить их, добавив цветные порталы на другие страницы моего блокнота. Чтобы лабиринт был гигантским, мне не нужно было решение. Я построил лабиринт только для того, чтобы построить его.

Есть способ, которым квир-дети, особенно те из нас, кто вырос в жестокой среде, проявляются из ниоткуда, чтобы скрыть, кто мы есть на самом деле. Слои и слои. Поддельные дорожки в лабиринте.

Джонатана Блоу разочаровала бы такая головоломка — она была задумана не просто как сложная, а на самом деле неразрешимая.

Смысл головоломки, в конце концов, в том, чтобы решить ее. Хорошая головоломка ненадолго ставит вас в тупик, возможно, просит вас уйти и вернуться, но в конце концов она сдается.

Тот лабиринт, в который я запутался, был не тем, который собирался разгадать, а тем, который нужно было проследить.

Мне нужно было уйти и найти создателя.

Лучший способ пройти лабиринт — начать с конца и двигаться к началу.

Просто я сидел посередине с минотавром и чистил его топор.

Или, скорее, я стал бы чем-то вроде минотавра.

Хорошая игра для меня — это фантастика. Способ одеться кем-то, кем я не являюсь.

Возможно, неудивительно, что один из лучших способов отладки асинхронного кода — кода, завязанного вокруг себя — это простой console.log(). Конечно, вам нужно их больше, но правильно размещенный console.log() может дать много информации.

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

Это то, что вы говорите сами с собой, внимательно наблюдая за порядком, в котором происходят события:

wore a suit

unhappy

got called pretty

happy

Моя жизнь и моя фантазия поменялись местами, понимаете.

В моем мире фантазий я одевался как мальчик. Я держал свои волосы короткими. Больше всего на свете я старался быть нежным и больше всего потерпел неудачу.

Был уход.

Но было и обещание возвращено.

Чтобы найти девочку, прокладывающую лабиринт.

Момент решения для переменной, такой как name, так зависящей от всего остального.

Простой вопрос заполнения последней 5-буквенной подсказки:

alice