Дизайн Anastasia Chechkova
2 145

Любое изменение в разработке имеет значение

Перевод материала из блога компании Intercom.

В закладки
Пример отзыва

«Мы хотим уменьшить размер отзывов на продукт до 140 знаков, потому что когда-нибудь, возможно, захотим использовать SMS. Это незначительное изменение, ведь так?»

Нет, не так.

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

Опыт работы в консалтинге, где платят за время, научил меня задавать некоторые вопросы, прежде чем приниматься за «незначительные изменения». Давайте начнём с нескольких простых.

Что делать, если отзыв больше 140 знаков? Убрать лишние строки или просто вывести на экран ошибку? Если выводить ошибку, где её показывать? Что писать? Кто будет писать текст ошибки? Как объяснить пользователю, почему установлен лимит в 140 знаков? Как будет выглядеть ошибка? Стиль уже выбран? Если нет, то кто будет его разрабатывать?

Но подождите, есть ещё вопросы

Даже если вдруг у нас и есть ответы на все выше поставленные вопросы, это ещё не конец. Выдавать ошибку на стороне сервера — плохое решение. Это должно быть на стороне клиента. Но если мы решаемся на валидацию со стороны клиента, следует ещё ряд вопросов…

Кто будет писать JavaScript? JavaScript будет отображать тот же тип ошибок, что и код сервера? Если нет, то какой новый стиль использовать? Как он работает без JavaScript? Как убедиться, что лимит в 140 символов работает с валидацией на стороне сервера и на стороне клиента?

И это тоже ещё не конец. Посмотрите на эту ситуацию глазами пользователей. Они уже недовольны тем, что их отзыв ограничен 140 знаками по какой-то странной причине, непонятной им, а теперь мы предлагаем им угадать, насколько длинное у них сообщение? Должен быть иной путь. Давайте добавим счётчик знаков. Ах да, ведь тогда появляется ещё больше вопросов…

Почти закончили

Кто будет писать счётчик знаков? Если мы собираемся использовать тот, который нашли в сети, то кто будет тестировать его на целевых браузерах (не только на Google Chrome).

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

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

Всё вышеописанное не учитывает замешательство пользователя, который не понимает, почему кто-то до него смог написать отзыв на 80 слов, а ему теперь даётся только 140 символов. Очевидно, служба поддержки должна быть готова к вопросам от пользователей, а мы должны обновить документацию, API, приложения на iPhone и Android. Кстати, что делать с прошлыми отзывами? Убрать лишние символы или оставить без изменений?

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

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

Да вы шутите…

Да, это были пустые слова. Опытные разработчики могут быстро решить большинство перечисленных проблем. Но не все проблемы. Да, можно использовать "maxlength", но это снимает только один из вопросов (и только при кодировании в HTML5).

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

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

#дизайн

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Anastasia Chechkova", "author_type": "self", "tags": ["\u0434\u0438\u0437\u0430\u0439\u043d"], "comments": 3, "likes": 26, "favorites": 1, "is_advertisement": false, "subsite_label": "design", "id": 40739, "is_wide": false }
00
дни
00
часы
00
мин
00
сек
(function(){ var banner = document.querySelector('.teaserSberbank'); var isAdsDisabled = document.querySelector('noad'); if (!isAdsDisabled){ var countdownTimer = null; var timerItem = document.querySelectorAll('[data-sber-timer]'); var seconds = parseInt('15388' + '59599') - now(); function now(){ return Math.round(new Date().getTime()/1000.0); } function timer() { var days = Math.floor(seconds / 24 / 60 / 60); var hoursLeft = Math.floor((seconds) - (days * 86400)); var hours = Math.floor(hoursLeft / 3600); var minutesLeft = Math.floor((hoursLeft) - (hours * 3600)); var minutes = Math.floor(minutesLeft / 60); var remainingSeconds = seconds % 60; if (days < 10) days = '0' + days; if (hours < 10) hours = '0' + hours; if (minutes < 10) minutes = '0' + minutes; if (remainingSeconds < 10) remainingSeconds = '0' + remainingSeconds; if (seconds <= 0) { clearInterval(countdownTimer); } else { timerItem[0].textContent = days; timerItem[1].textContent = hours; timerItem[2].textContent = minutes; timerItem[3].textContent = remainingSeconds; seconds -= 1; } } timer(); countdownTimer = setInterval(timer, 1000); } else { banner.style.display = 'none'; } })();
{ "id": 40739, "author_id": 108266, "diff_limit": 1000, "urls": {"diff":"\/comments\/40739\/get","add":"\/comments\/40739\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/40739"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199114 }

3 комментария 3 комм.

Популярные

По порядку

8

Просто за душу....

Ответить
0

а еще "протестируйте узко"

Ответить
0

Мысль в статье правильная, но остальное ужасно. А что изначально форма не имела никакого ограничения на длину сообщения и соответствующего сообщения об ошибке? То есть пользователи могли постить мегабайты текста? В таком случае тут проблемы посерьезней, чем описанные с статье.

Ответить

Комментарий удален

0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Приложение-плацебо скачали
больше миллиона раз
Подписаться на push-уведомления