Skip to content

Instantly share code, notes, and snippets.

@avesus
Created September 21, 2015 21:12
Show Gist options
  • Save avesus/48bd15a7eebea5901b30 to your computer and use it in GitHub Desktop.
Save avesus/48bd15a7eebea5901b30 to your computer and use it in GitHub Desktop.
Задание на собеседовании

Загрузка файла на сервер. Требования.

Представь, что тебе надо срочно передать скриншот экрана твоего смартфона. Веб-интерфейс поддерживает поле выбора файла, при нажатии на кнопку открывается как раз обзор твоих последних фото, и там же есть только что сделанный тобой скриншот. Представь, что тебе досталась глючная версия Сафари, которая падает через несколько секунд, после того, как сама внутри свяжется с серверами Apple и проверит какие-то обновления. Повлиять на это никак нельзя, на сервера лезет именно сам браузер, настроек для отключения причин падения нет. Ты написал здоровский сервис техподдержки, помогающим людям избавиться от истерики, связанной с совпадением ста неприятностей в один момент времени, путём решения всех его проблем. Для решения очередной проблемы вам позарез необходим скриншот телефона вашего клиента. Место на его телефоне почти закончилось, благо, на скриншот хватит. Удалять больше нечего - он только что забил весь телефон видео-свидетельствами очевидца наблюдения пришельцев. Ничего удалять нельзя! После скриншота, максимум, что осталось - 50 килобайт свободного места (доступного, кстати, в Local Storage!). Сафари при запуске открывает свою левую страницу (выполнение которой неизбежно приводит к падению браузера), а закрыть он её не позволяет, только открыть новую вкладку или переключиться на имеющуюся. Загружаемый "мусор вычищает и без того забитый кэш браузера, и страничка твоего сервиса вынуждена каждый раз загружаться заново. Клиент находится в глухой деревенской степи, и от твоей поддержки может зависеть его жизнь. Он всё время движется, но покрытие в этой области очень слабое. Интернет периодически пропадает, максимум, что у него есть - это edge. Также клиенту постоянно названивает его друг, из-за чего и без того тормозной интернет постоянно вырубается. У клиента заканчивается последний оплаченный мегабайт. Баланса на телефоне хватает только для приёма входящих звонков и чуточки интернета. Да, и у него садится батарейка. Он её периодически подзаряжает своим чудо-солнечным аккумулятором, но погода пасмурная, и уже вечереет. Всё, что нужно - отправить по edge на твой грёбаный сервер один грёбаный трёх-мегабайтный скриншот. Связь может быть только по HTTPS, т.к. за твоим клиентом следят бандиты с GSM-прослушкой. Бушуют грозы, и периодически вышка связи отрубается, твой клиент вынужден искать новую. Его телефон в роуминге, и операторы каждый раз разные. Некоторые даже режут соединения по WebSocket'ам. Напоминаю: просто разработай дизайн страницы загрузки скриншота, опиши все технологии и решения, которые ты будешь использовать, а главное - опиши все детали протокола. В каком порядке какой код будет выполняться. Что будет происходить при открытии страницы? Как будет происходить отправка скриншота на сервер? Что будет после загрузки? Необходимо полностью спроектировать законченное веб-приложение, учитывающее все перечисленные нюансы. Бюджет - $1000. Сроки - один месяц. Исполнитель - один. Спроектировать необходимо за один час. Клиент, если выживет, принесёт $10,000. Вопросы?

@avesus
Copy link
Author

avesus commented Sep 21, 2015

З.Ы.: после перезапуска браузера, представь, что в мире есть два разных API. Один из них позволяет открыть запомненный файл и читать его с любого места. Другой же API позволяет загружать только указанный до падения браузера файл - после перезапуска нужно всё заново повторять. Файлы визуально похожи друг на друга (он наделал несколько скриншотов, и батарейка садится ;-)). Лишь на одном видно его селфи с прмшельцем. Имена файлов фото - буквы и цифры. EDGE! GSM-звонки! 50 килобайт в LocalStorage!

@avesus
Copy link
Author

avesus commented Sep 21, 2015

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

@avesus
Copy link
Author

avesus commented Sep 21, 2015

Предполагается, что опытный разработчик, при получении от заказчика любого базового и простого (на первый взгляд!) ТЗ, обязан спроектировать решение таким образом, чтобы в будущем, в процессе допиливания его решения поколениями других программистов, им не пришлось приделывать костыли или переписывать всё заново. Потому что, по моему скромному мнению, человек, считающий себя профессионалом, обязан уметь самостоятельно уточнять ТЗ и думать о конечных пользователей ЗА ЗАКАЗЧИКА, потому что ему самому, в конечном счёте, выгодно заработать ОЧЕНЬ МНОГО ДЕНЕГ для заказчика - он придёт к профессионалу ещё раз и тогда можно торговаться и диктовать свои условия. Надо ли проявлять эмпатию и свою техническую смекалку?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment