47 posts tagged

разработка

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

Later Ctrl + ↑

Задача на понимание синтаксиса js

Описать в виде программы историю, или процесс из жизни. Главное — сделать максимально понятным что имелось в виду.

Например:

function in_the_morning () {
	var now,
		breakfast;

	now = me.look_at_watch();
	if (now > TOO_LATE || now < TOO_EARLY) {
		try {
			me.continue_sleeping();
		} catch (err) {
			me.do_stuff();
			now = me.look_at_watch();
			if (now < TOO_EARLY) {
				in_the_morning();
			} else {
				return false;
			}
		}
	} else {
		me.take_shower({
			soap : SOAP,
			shampoo : SHAMPOO || SOAP
		});

		breakfast = me.prepare_breakfast('eggs', 'bacon');
		now = me.look_at_watch();
		if (breakfast && now < TOO_LATE) {
			me.eat(breakfast);
		}
		return true;
	}
}

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

UPD

2012   по-русски   разработка

Что почитать. Технические ссылки 18.10

  1. Возможности средств разработки хрома (слайды). Все, фиг поспеешь за выпуском все ништяков. Но хотя бы обзорно надо пробегаться по подобным постам, чтобы быть в теме.
  2. Новые фичи jshint-a. Самое сладкое cyclomatic complexity. Технический способ померять понимаемость исходного кода. Приложу усилия, чтобы попробовать на текущем проекте.
  3. Книги по программированию. Приятная подборка. Сподвигла продолжить читать «Программист прагматик».
  4. Закон дырявых абстракций. Поверх нестабильной технологии можно строить высокую “стабильную” абстракицю, но она будет протекать: в некоторых случаях будет видна вся подноготная. У меня ощущение, что строители библиотек только и делают, что борятся с текущими абстракциями. Например кеширование свойства length при итерировании по массиву для ускорения, или преобразование live collection в массив для ускорения обработки DOM.
  5. Лиспоподобный javascript. Иногда ловлю себя на мысли, что чертовски не хватает макросов. Это пожалуй единственное, чего я бы хотел видеть еще в js-е. Песочница для экспериментов сайте проекта.
2012   по-русски   разработка   ссылки   что почитать

Про оптимизацию javascript кода (часть 2)

Первая часть с выводами.

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

Задача:
случайным образом перемешать ряды в таблице. Генерировать новую таблицу нельзя, необходимо использовать существующие узлы.

Возможные оптимизации

  • Избегать использований liveCollection. А точнее: превращение liveCollection в массив. Гипотеза заключается в том, что так как liveCollection должна обновляться вместе с обновлением DOM, это приведет к дополнительным штрафам скорости. Разумеется, браузеры могут оптимизировать работу с liveCollection, но об этом еще предстоит узнать.
  • Свести к минимуму обращения к DOM-у, как удаление, так и добавление узлов. Применение documentFragment и временное удаление узла из DOM-а.
  • Использование documentFragment, как буфера для временного хранения отсортированных случайным образом рядов.
  • Удаление на время из DOM-а, элемента, который содержит в себе перемешиваемы ряды. Теоретически должно произойти уменьшение количества обращений к DOM при удалении ряда.

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

  • Самое главное: нет подхода, который был бы самым быстрым для каждого браузера. Из этого следует следующее:
    • Оптимизируя код, не зная как он будет в последствии работать, можно сделать оптимальную версию для одного браузера, и неоптимальную для другого.
    • Изменение кода до неузнаваемости может не дать выигрыша в производительности
  • Все браузеры медленно работают с liveCollection. Для выигрыша в производительности надо преобразовывать liveCollection в массив.
  • Хрому и сафари не имеет значения, используется ли documentFragment и удаляется ли нод временно из DOM-а. Это говорит про оптимизированность методов, которые он применяет к обработке дома. Налицо несомненный плюс для пользователей, но с другой стороны есть эффект поощрения излишних DOM манипуляций со стороны непонимающих программистов (особенно, если они разрабатывают в хроме и не проверяют параллельно в других браузерах). Хотя это их проблемы.
  • documentFragment играет важную роль в ускорении работы с DOM в ие.
  • В фаерфоксе не оптимизирована работа с удаляемыми нодами. Временное удаление контейнера, содержащий удаляемыми строки, дает почти двукратное ускорение.

Итого
При работе с DOM-ом имеет смысл поменьше использовать liveCollection и побольше documentFragment. Остальные оптимизации будут давать неоднозначные результаты.

2012   по-русски   разработка

Как преобразовать массивоподобный объект в массив

В продолжение недели оптимизации.
Я знаю 2 способа превращения массивоподобных объектов (МПО) в массив. В МПО входят: объект arguments, live collection, dead collection. Первый подход — итерация и создание нового массива из элементов МПО поштучно. Второй — применение splice в контексте МПО. При иплементации функции to_array стал вопрос: какой из способов быстрее. Чтобы не гадать, написал тесты. Тесты можно посмотреть и погонять на jsperf.

Из интересного:

  • сафари6, как и опера 12.02 в 2 раза быстреe преобразует querySelectorAll() коллекцию в массив с помощью slice.
  • в хроме, сафари о опере доступ к querySelectorAll коллекциям быстрее, чем к getElementsBy и document.links.

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

function to_array (obj) {
	var i,
		length,
		res;

	if (Object.prototype.toString.call(obj) === '[object Array]') {
		return obj;
	}
	length = obj.length;
	res = [];
	for (i = 0; i < length; i += 1) {
		res.push(obj[i]);
	}
	return res;
}

2012   по-русски   разработка

Про оптимизацию javascript кода (часть 1)

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

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

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

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

Но ситуация с оптимизацией — палка о трех концах. Второй конец: браузерная оптимизация. Например пример двух циклов:

 // 1
for (var i = 0; i < arr.length; i += 1) {}
// 2 
for (var i = 0, length = arr.length, i < length; i += 1){}
// 3
var length = arr.length;
while (length--){}

Вторая версия чуть более многословна, но быстрее первой. Третья менее многословна, но не совсем понятна слету (проход по массиву в обратном порядке не естественен для понимания).

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

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

А вот третий конец — это DOM. Обновление одного узла в DOM-e ведет за собой каскад телодвижений со стороны браузера: обновление свойств children, parentNode, nextSibling у нод, которые «цепляются» этим изменением, обновление liveCollections, триггер repaint и reflow, очистка памяти, если использован innerHTML, то еще дополнительный парсинг текста в DOM модель. На фоне такого количества действий низкоуровневые оптимизации меркнут. Слишком просто одним лишним обращением к DOM-у свести все оптимизации на нет.

Узких мест в DOM-е множество. Самые тяжелые — обновление: добавление и удаление узлов. При том время отработки одного и того же кода зависит от общей сложности DOM дерева, максимальной вложенности, количества таблиц стилей и количества правил. Это означает, что один и тот же способ оптимизации даст различный прирост, в зависимости от сложности страницы.

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

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

Я к чему веду: смысла в особой оптимизации кода нет. Самый разумный подход — написать код как есть, структурировать и сделать его читаемым и понятным. И только если профилирование покажет необходимость оптимизаций, начать именно с оптимизации работы с DOM.

2012   по-русски   разработка

Неявный клик при работе с label и элементом формы

Бывает и такое, что откуда-то берется лишний клик. Низлежащее — вольная интерпретация происходящего.

По ссылке при клике по тесту генерируется 2 события click, при клике по самому инпуту — одно событие. Нифига не логично с точки зрения нормального человека, и понятный костыль с точки зрения разработчика. При клике на лейбле генерируется событие клик на инпуте, которое всплывает до лейбла, и обработчик клика срабатывает во второй раз. Событие, что было сгенерировано на инпуте не тригерит второй раз клик на инпуте, когда срабатывает на лейбле. Вероятно, в недрах браузера происходит проверка на event.target. Сие безобразие наблюдал в хроме, фаерфоксе, опере, сафари.

Разработчик, бди!

2012   по-русски   разработка

«Спасибо, Кэп». Сухой остаток

Сайт мероприятия. Встреча, судя по вопросам докладчиков к залу, планировалась больше для веб-дизайнеров. Дважды спросили про образование, будто но играет большую роль. Организацию нельзя называть блестящей, технические проблемы с открытием файлов, общее запаздывание по плану. Но это не главное. Главное — деление знаниями. Про все доклады не напишу. Некоторые ничего не оставили ни в голове, ни в блокноте.

«Вспомнить все или правдивая ложь о вэбдизайне» Максим Павлов
Суть доклада: «технология !== идея». Общему настроению конференции соотвествует. «Спасибо, Кэп».

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

«Инди-проект: один против всех»Вадим Паясу
«Хватит сидеть на жопе и думать, реализуй идею в виде прототипа за неделю». Парень создал впечатление человека поверхностного, вызвал скептические вопросы со стороны взрослой аудитории. От себя бы добавил, что если идею можно уложить в одно предложение, значит все ок.

«Итерационный дизайн» Максим Ткачук
Ввел в краткую историю дизайна, рассказал про итерационный дизайн:
  1. исследование пробемы
  2. идея
  3. прототипирование
  4. исследование (если надо, возврат на шаг 1.
Очень похоже на то, что описывается в в процессе у Лебедева. Видно, что у чувака по полочкам лежит все в голове. После доклада остались приятные впечатления и страничка тегов в блокноте.

Сергей Кудряшов
Заменял другого докладчика, и как я понял, замены была выполнена стихийно. Рассказал про организацию работы в комманде (раньше работал в parallels (где 1000 человек), сейчас в macpaw (около 30 человек)). Поделился историями из жизни. Наехал на студию Лебедева, которая создала дизайн программы для parallelsопиской, между прочим). Аргументацию не запомнил. Может ее и не было. Так-же раскритиковал методику создания интерфейса, описанную в книге Раскина. Аргументация: методика результата не даст. Этот аргумент работает, если методики придерживаться шаг-в-шаг. Хотя иначе, она перестает быть методикой. А также советы относительно комманды: как можно плоские отношения внутри, объединение по проектам, а не процессам, горизонтальная ротация (из проекта в проект).

«Downshift design» Ольга Горенко
Downshifting — делание того, чего хочется, и чтобы без самообмана. Очень честно, что мне импонирует, подошла к вопросу чего пользователь ожидает от сайта. Рекоммендации, фильтрация контента согласно предыдущим выборам. Яркий пример — организацию людей в чате фейсбука. С подачей были проблемы, может потому и вызвала недовольство некоторых слушателей. Но видно, что котелок варит. В двух словах: data mining.

«Цифровое средневековье» Ярослав Трофимов
Безапелляционный вброс. Формат подачи с предыханиями, изменением тона, и ерничанием может означать или пренебрежительное отношение к аудитории и нежелание разбираться в вопросе в поиске истины или цель пропиарить себя и книгу. 
Если противник – человек “необстрелянный”, доверчивый, мыслящий медленно, хотя может быть и точно, то некоторые наглые “фокусники мысли” стараются “ошарашить” его в устном споре, особенно при слушателях. Говорят очень быстро, выражают мысли часто в трудно понимаемой форме, быстро сменяют одну другою. Затем, “не дав опомниться”, победоносно делают вывод, который им желателен и бросают спор: они – победители. Наиболее наглые иногда не стесняются приводить мысли без всякой связи, иногда нелепые, и пока медленно мыслящий и честный противник старается уловить связь между мыслями, никак не предполагая, что возможно такое нахальство, они уже с торжествующим видом покидают поле битвы.
Проф. С. И. Поварнин «Искусство спора. О теории и практике спора»

«Блат в прошлом? Нет, в будущем!» Денис Довгополый
80% сделок — в руках у 200 человек из Силиконовой долины. PayPal мафия: люди, поднявшиеся вместе на стартапе, держатся одной тусовки, вкладывают деньги в другие стартапы, и тихонько быстро богатеют. Прошелся по нескольким акулам IT инвестирования. В его жизни 90% результата достигнуты за счет связей. В общем думайте, где тусоваться, чтобы тебя заметили нужные люди с деньгами.
2012   по-русски   разработка
Earlier Ctrl + ↓