Коротко про программирование и бесконечный поток проблем
Ты берешь новый инструмент — молоток, чтобы забить гвоздь. При попытке ударить по гвоздю, молоток взрывается. Потому что ты дурак забыл сдвинуть переключатель "не взрываться при забивании гвоздей". Ок, пробуешь снова. Оказывается, что забивать гвозди можно только под строгим углом в 90 градусов, так как разработчик молотка не добавил подобную возможность в библиотеку.
Ходишь по комнате, разрабатывая план действий. Решаешь переделать оригинальную библиотеку, реализующую молоток. Разбираешься в чужом дерьмокоде и убираешь начисто этот странный переключатель, а также добавляешь фичу на произвольный угол.
При попытке удара по гвоздю, молоток ломается надвое, так как гвозди несовместимы с версией молотка, у них появились новые зависимости. Ты обновляешь молоток, чтобы поддерживал гвозди из палладия последней версии.
При ударе молотком о гвоздь, оказывается, что у деревяшки, в которую ты забиваешь гвозди, превышены API rate limits, провайдер деревяшки не разрешает забивать так много гвоздей как тебе надо, так как его сервера этого не выдержат.
Ты ставишь ограничения на частоту забивания гвоздей. Чтобы молоток ударял по гвоздю не чаще 1 раза в 1 секунду. Но из-за необходимости все же выполнять работу быстро, ты масштабируешь систему и ставишь 100 таких установок, где каждый молоток забивается 1 гвоздем... да, именно так. Оно работает, просто не трогайте!
В результате стена, к которой всё это крепилось, падает. Потому что у нее произошел таймаут общения с полом, а переподключаться она не умеет....
Ах, да, документация...
Документация: "function X(). Does X."
Реальность: "Функция X делает X, если повезёт с погодой на Венере. Правда, неплохо бы сначала вызвать ещё Y и Z, о чёи в доках нет ни слова, а примеры - от API предыдущей версии, в которой вообще всё было не так. В случае неудачи не возвращает ничего (как и в случае успеха), иногда может просто зависнуть. Сорцов от неё нет, но вы можете попробовать её декомпилировать, чтобы понять, что её писал в доску пьяный индус-практикант."
Ходишь по комнате, разрабатывая план действий. Решаешь переделать оригинальную библиотеку, реализующую молоток. Разбираешься в чужом дерьмокоде и убираешь начисто этот странный переключатель, а также добавляешь фичу на произвольный угол.
При попытке удара по гвоздю, молоток ломается надвое, так как гвозди несовместимы с версией молотка, у них появились новые зависимости. Ты обновляешь молоток, чтобы поддерживал гвозди из палладия последней версии.
При ударе молотком о гвоздь, оказывается, что у деревяшки, в которую ты забиваешь гвозди, превышены API rate limits, провайдер деревяшки не разрешает забивать так много гвоздей как тебе надо, так как его сервера этого не выдержат.
Ты ставишь ограничения на частоту забивания гвоздей. Чтобы молоток ударял по гвоздю не чаще 1 раза в 1 секунду. Но из-за необходимости все же выполнять работу быстро, ты масштабируешь систему и ставишь 100 таких установок, где каждый молоток забивается 1 гвоздем... да, именно так. Оно работает, просто не трогайте!
В результате стена, к которой всё это крепилось, падает. Потому что у нее произошел таймаут общения с полом, а переподключаться она не умеет....
Ах, да, документация...
Документация: "function X(). Does X."
Реальность: "Функция X делает X, если повезёт с погодой на Венере. Правда, неплохо бы сначала вызвать ещё Y и Z, о чёи в доках нет ни слова, а примеры - от API предыдущей версии, в которой вообще всё было не так. В случае неудачи не возвращает ничего (как и в случае успеха), иногда может просто зависнуть. Сорцов от неё нет, но вы можете попробовать её декомпилировать, чтобы понять, что её писал в доску пьяный индус-практикант."