IT-инфраструктура для бизнеса и творчества
Разработка
Rapprogtrain

Проблема, которую вы решаете, важнее, чем код, который вы пишете

Программисты, кажется, забыли реальную цель программного обеспечения — решать реальные проблемы. Перевод публикации Фагнера Брэка на Medium.

50 лет назад, в 1968 году, была организована рабочая конференция по программной инженерии, которая была организованна при поддержке Научного комитета НАТО.

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

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

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

Вот пример.

Был стартап, который создавал устройство, позволяющее человеку открывать дверь своего дома по Bluetooth. В качестве визуального интерфейса использовался виджет, который был виден, даже когда телефон заблокирован. У него была единственная кнопка под названием «Открыть дверь».

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

Кто-то посмотрел на это и спросил:

Если мы используем Bluetooth и наша бизнес-модель пускает в дом любого, кто имеет телефон, почему мы должны заставлять кого-то брать телефон и нажимать на кнопку? Пусть дверь будет открываться при приближении устройства на один метр. Таким образом, нам не нужно платить за разработку и программирование визуального интерфейса!

Эта история с Bluetooth — отличный пример узкой направленности: цель состояла в том, чтобы открыть дверь с минимальными усилиями. Нет смысла разрабатывать визуальный интерфейс, если датчики беспроводные.

Если вы знаете, каких целей хочет достичь бизнес и что имеет ценность для пользователя, то вы можете объединить эти знания с вашими знаниями о технологиях. Только тогда вы будете располагать достаточной информацией, чтобы придумать лучшие ответы и сделать вывод, что для продукта интерфейс не нужен.

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

Не каждый код стоит писать

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

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

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

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

Не каждый баг стоит исправлять

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

Существует разница между инкапсуляцией сложной логики и абстракцией полезных знаний. Иногда информация должна быть сделана понятной. Если вы абстрагируете их, они могут иметь противоположный эффект и их будет труднее понять.

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

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

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

И вот почему: проверка была обязательной!

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

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

Не каждую функцию стоит программировать

Если вы разработчик и понимаете проблему, которую пытаетесь решить, вы сможете придумать более качественный код, а иногда и сможете справиться вовсе без кода. Вы не Code Monkey, которой платят за написание символов на экране. Вы профессионал, которому платят за решение проблем.

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

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

Есть такая поговорка: «Если у вас есть только молоток, всё выглядит как гвоздь».

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

Спасибо за прочитанную статью!

Если у меня есть ошибки в переводе, пожалуйста, напишите об этом в комментариях! Мой сайт, где появился быстрый доступ к вопросом и ответам по JavaScript. Буду очень вам благодарен и признателен :)

Я в Twitter и во «ВКонтакте».

Спасибо большое за ваше внимание!

(function () { let cdnUrl = `https://specialsf378ef5-a.akamaihd.net/SelectelBranding/images/` let previousArticleNumber = null let currentArticleNumber = 0 let platform = 'Desktop' let articles = [ { name: 'camera', url: `${cdnUrl}CameraCat`, text: 'умную камеру для\u00A0наблюдения за\u00A0котиками', link: 'https://vc.ru/selectel/306690', num: 3 }, { name: 'chill', url: `${cdnUrl}ChillCat`, text: 'трекер, который подскажет, когда пора отдохнуть', link: 'https://vc.ru/promo/288561-eye-tracker', num: 1 }, { name: 'cloud', url: `${cdnUrl}CloudCat`, text: 'котика: даёшь ему «пять», а\u00A0он делает бэкап в облако', link: 'https://vc.ru/dev/294799-maneki-neko', num: 2 } ] let buttonCycle = document.querySelector('.button--cycle') let buttonChoose = document.querySelector('.button--choose') let buttonMobile = document.querySelector('.button--mobile') let textField = document.querySelector('.selectel-footer-subtitle') let imageAgent = document.querySelector('.image--agent') let banner = document.querySelector('.selectel-footer') buttonCycle.addEventListener('click', cycleClick) buttonChoose.addEventListener('click', () => sendEvent(`Promo ${articles[currentArticleNumber].num} Left`, 'Click')) buttonMobile.addEventListener('click', () => sendEvent(`Promo ${articles[currentArticleNumber].num} Left`, 'Click')) let media = window.matchMedia("(max-width: 570px)") media.addEventListener('change', matchMedia) function matchMedia() { if (media.matches) { platform = 'Mobile' } else { platform = 'Desktop' } update() } matchMedia() function cycleClick(event) { sendEvent(`Promo ${articles[currentArticleNumber].num} Right`, 'Click') if (event) { event.preventDefault() event.stopPropagation() } window.open('https://vc.ru/tag/selectelDIY', '_blank') //cycle(event) } function cycle(event) { // incrementArticleNumber() textField.innerHTML = generatedText() imageAgent.src = articles[currentArticleNumber].url + platform + '.svg?3' imageAgent.setAttribute("class", "") imageAgent.classList.add('image--agent', articles[currentArticleNumber].name) banner.href = articles[currentArticleNumber].link } function update() { banner.href = articles[currentArticleNumber].link imageAgent.src = articles[currentArticleNumber].url + platform + '.svg' textField.innerHTML = generatedText() } function incrementArticleNumber() { previousArticleNumber = currentArticleNumber if (currentArticleNumber >= articles.length - 1) { currentArticleNumber = 0 } else { currentArticleNumber++ } } const sendEvent = (label, action = 'Click') => { const value = `SelectelDIY — loc: Footer — ${label} — ${action}`; if (window.dataLayer !== undefined) { window.dataLayer.push({ event: 'data_event', data_description: value, }); } }; function generatedText() { let defaultText if (platform === 'Desktop') { defaultText = `Мы тут собрали %text%. Хотите научим?` } else { defaultText = `Мы тут собрали %text%.` } return defaultText.replace('%text%', articles[currentArticleNumber].text) } function getRandom(min, max) { min = Math.ceil(min) max = Math.floor(max) return Math.floor(Math.random() * (max - min + 1)) + min } (function create() { currentArticleNumber = getRandom(0, articles.length - 1) cycle() let page = document.querySelector('.page--entry') if (page) { function insertAfter() { let parents = page.querySelectorAll('[data-id="7"]') let referenceNode = parents[0] referenceNode.parentNode.insertBefore(banner, referenceNode.nextSibling); loaded() } setTimeout(() => insertAfter(), 0) } }()) function loaded() { banner.classList.add('loaded') } loadImages([ `${cdnUrl}CameraCatDesktop.svg`, `${cdnUrl}ChillCatDesktop.svg`, `${cdnUrl}CloudCatDesktop.svg`, `${cdnUrl}CameraCatMobile.svg`, `${cdnUrl}ChillCatMobile.svg`, `${cdnUrl}CloudCatMobile.svg?3`, ]) function loadImages(urls) { return Promise.all(urls.map(function (url) { return new Promise(function (resolve) { var img = document.createElement('img'); img.onload = resolve; img.onerror = resolve; img.src = url; }); })); } }())
0
4 комментария
Популярные
По порядку
Kokoulin Nikolay

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

Ответить
1
Развернуть ветку
Mihail Demeshko

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

Ответить
0
Развернуть ветку
Алексей Струков

Там другой принцип - чем меньше число, тем выше приоритет.

Ответить
0
Развернуть ветку
Mihail Demeshko

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

Ответить
1
Развернуть ветку
Читать все 4 комментария
Фоторамка 2.0 или что подарить бабушке на Новый год

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

Baring Vostok инвестировал $13 млн в российскую платформу автоматизации маркетинга Mindbox Статьи редакции

Деньги направят на развитие продуктов, опционный пул и сделки.

В OTUS стартует первый онлайн-буткемп «Java developer»
Голова не варит: 10+ советов, как предотвратить умственное переутомление

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

Дольше всех на рынке: почему компаниям с большим опытом сложнее работать с клиентами?
Сооснователь Endel Владислав Пинский запустил в Германии сервис распознавания документов ABC Doc и привлёк €500 тысяч Статьи редакции

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

Пример работы ABC Doc
Как автоматизация работы юристов экономит время и деньги

В работе любой компании есть важнейшая рутина, малозаметная со стороны. Например, корпоративные юристы – это почти всегда «бойцы невидимого фронта», но от качества их претензионно-судебной работы зависит благополучие всей корпорации. Особенно если у вас в работе тысячи договоров, претензий и судебных дел. Тут поможет только глубокая автоматизация…

Почему начинающим предпринимателям стоит выходить на маркетплейсы

Торговые онлайн-площадки готовы сотрудничать с бизнесом любого размера.

Как поднять продажи фармы в диджитале? Рассказываем про стратегию продвижения бренда «Ультра-Д» и показываем результаты

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

null