Закрыть
Вход на сайт
Регистрация
Вы успешно зарегистрировались!

Перейти к обучению
Регистрация
Войти на сайт

Как удалить безвозвратно 100 000 пользователей и остаться живым?

05 October 2017
1157
В этом посте хочу поделиться с вами опытом разработки одного большого проекта. В ходе его создания навсегда удалилось 100 000 пользователей, которых пр...

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

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

История началась в апреле 2015 года. В начале все было стандарту. Заказчик (я умышленно не буду говорить имен и названия компании) написал в вконтакте, спросил че по чем, скинул примерное тз, встретились, поговорили, понравились друг другу, решили делать. 

Идея проекта следующая: 

Есть компании, которые публикуют на сайте скидки от себя. Ну, например, кеды с скидкой в 20%.
Пользователи покупают месячный абонемент и могут пользоваться скидками всех представленных компаний. 
Так же, на сайте есть партнерская система, которая позволяет приглашать людей. Если приглашенный тобою человек оплачивал абонемент, то тебе идет процент. Логика прохода процентов довольно сложная, но заказчик объяснил следующим образом: «Ну там ничего сложного, только небольшие формулы прописать». 

А еще у них уже был сделан аналогичный сайт, просто они его обкатывали и решили сделать красивше, больше, лучше. Так что, надо было еще при запуске нового сайта перенести все данные со старого. 

Стоит уточнить, что я до этого подобных проектов не делал и для меня это было что-то новое и неизведанное. Поэтому я изначально не понимал сколько объективно придется это делать. Учитывая, что дизайн уже был нарисован, надо было только сверстать и поставить на back-end, я запросил 65т.р. и 2 месяца работы. Обе последние цифры оказались фатальными. Мало было и денег и времени) Надо было брать больше. Но… отсутствие опыта есть отсутствие опыта…

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

В итоге, по закону жанра, пока я транжирил предоплату, работа не шла и началась только через месяц) Поэтому был введен ночно-дневной режим работы и за три недели я сделал все, что требуется, кроме логики партнерской сети. Сдавать надо было 1 июня и как раз где-то в 20-х числах я взялся за ее реализацию. 

За неделю было написано все точно по ТЗ. Но не тут то было… при встрече и тестировании оказалось, что они мне многого не рассказали! И есть еще много нюансов в логике, которые надо сделать… Ну, думаю, ладно… сделаем. А дедлайн, тем временем, уже летел в тартарары. 

Короче… так прошел месяц. 

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

В конце месяца я был выжат как лимон. Мне не хотелось жить… мне надо было отдохнуть. Я сказал заказчику, что все… надо паузу. И свалил на две недели загород. 

Когда я приехал снова началась бесконечная череда правок. В общем, я перестал отвечать на сообщения и звонки. Я пропал. Пропал без вести и меня невозможно было найти. Вот так. 

Просто я сдался и ушел в подполье. Да, не по мужски. Сейчас я бы в жизни так не сделал. Но вот тогда я не был готов к такому роду проблемам. Они сломили меня…

Спустя какое-то время они перестали меня искать и звонить) Подумал, что все нормально. Может, нашли другого разработчика, может еще что-то. Но меня больше никто не тревожил. Рай.

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

За время затишья я устроился работать в веб-студию. В начале августа мне начали снова звонить, а я начал снова не отвечать. В итоге заказчик сам лично приехал ко мне на работу) Попросил просто закончить то, что было начато и разойтись. Формат такой: он пишет что надо доделать, я делаю и happy end. 

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

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

Тут нужно сделать уточнение. Проект уже существовал и в нем было зарегистрировано 100 000 человек (на самом деле 110 тысяч, но я округлил). Ежедневно на сайт заходило около тысячи. Несколько сотен человек в день проводили транзакции. И вот эти несколько сотен человек оказались весьма недовольными((( 

Ну бывает. Что делать… Уведомили на сайте, что можно по этой проблеме можно писать мне в вк. Я руками делал переводы и параллельно понимал где ошибки в коде. Ежедневно у меня висело около сотни непрочитанных сообщений. В течение месяца я просыпался в 7 утра, обрабатывал обращения пользователей, шел на работу, вечером опять обрабатывал заявки. 

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

Но, как говорится, беда не приходит одна! 

Как-то вечером в офисе после работы, решил подпилить сайт. Захожу, а он лежит! mysql отвалился. До этого mysql иногда падал, когда сервак не справлялся с нагрузкой и я просто его перезагружал. Но тут был другой случай. Он даже не запускался… весь вечер я просидел на форумах. Тогда я уверовал в Тoster! Какой-то парень просто весь вечер отвечал на мои сообщения и помогал найти ошибку! Я был удивлен, что кто-то безвозмездно может помогать совершенно незнакомому человеку. 
Плюс у меня не было тогда особо опыта работы с серверами, поэтому было сложно. Я только знал, что есть терминал и туда команды можно вводить. Я гуглил, искал какую команду можно ввести, вводил и получал результат. 

В итоге, я пришел к выводу, что база потеряна… нету…
Тогда я узнал, что есть файл ibdata и если он пустой, то значит все данные потеряны. Как вы понимаете, он был пустой. Полностью. 0кб. 

А мы с девушкой в этот вечер пошли на Stand-up, наши знакомые ребята выступали. Я не досидел до конца и попросил поехать домой. Именно там, в зале, до меня дошла мысль, что я каким-то образом потерял 100 000 пользователей. Нет ни одного бэкапа. Нет ни одной надежды на восстановление. Что делать? Звонить и говорить, что жопа пацаны, я посеял труд несколько лет вашей работы. 

После звонка и разъяснения ситуации был собран консилиум. В 12 ночи. Что делать?
Я впаривал историю о том, что на сервере кончилось место (так и было на самом деле) и поэтому mysql тормознулся. На самом деле, я до последнего был уверен в том, что это так. Так, что, типа, моей вины тут нет. 

Думали-думали и решили идти спать и на след. день разбираться, что можно сделать и что на самом деле произошло. 

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

Заказчики попросили помощи у веб-студии, в которой программист посмотрел историю команд в терминале и знаете что нашел? Команду, которая стирает файл ibdata! Видимо на форумах кто-то прикольнулся, что надо вводить эту команду если mysql падает, а я в панике не прочитал между строк и ввел эту команду. 

Ну, думаю, все. Конец мне. Но заказчики осознавали, что проблему решать надо и если «убьют» меня, то доделывать будет некому. К невеликому счастью, нашелся бэкап старого сайта на котором было 80 000 человек. Класс. Теперь остается восстановить 30 000 человек) Начался новый этап сообщений в вк, восстановлений и паник. 

Спасибо моей девушке, которая меня поддержала. Спасибо ей за то, что она вообще меня не бросила) Ибо со мной общаться было тогда не возможно, так как каждый вечер я ныл о том, что мне тяжело и я уже не знаю что мне делать… не люблю ноющих людей. И себя я тогда тоже не любил.

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

Тут должно было что-то еще отвалиться и сломаться, но на этом все кончилось. Сайт работает до сих пор. Программиста они так и не нашли себе нового (на сколько мне известно), видимо все-таки у меня не такие кривые руки и теперь все работает как должно. 

Между прочим, они мне не доплатили 10 тысяч. Но мне как-то стыдно было их потом просить… поэтому проект обошелся в 50 тысяч рублей и 6 месяцев страданий. После того, как все кончилось я подумал про себя: «Зато опыт огромный получил». И правда… этот проект меня научил очень многому. И будет не правильно, если я не поделюсь им: 

1) Внимательно читайте ТЗ и договоры

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

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

2) Оценивайте проект в плане денег.

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

3) Проговаривайте пути отхода

Всегда нужно понимать, что проект может выйти за рамки. Либо заказчик придумал еще много разных идей, которых не было в ТЗ. Либо вы просто не рассчитали и дедлайн ушел вчерашним днем, а проект только на середине. 

Проговаривайте с заказчиками этот момент на берегу. На переправе коней не меняют. 
Сейчас, когда заказчики спрашивают сколько уйдет на проект, говорю минимум и максимум. Например: «Проект реально сделать за 2 недели, но, объективно говоря, мы будем его делать месяц. С учетом правок, дополнений и так далее. ». 

4) Делайте бэкапы

Делайте бэкапы, мать их! Делайте! Обязательно делайте! 

У меня сейчас бэкапятся на жесткий диск два моих рабочих компьютера. Сервер делал бэкапы каждый день, но после одной ситуации я сделал, чтобы они создавались каждый час и каждый день. Про ситуацию я писал у себя в блоге, можно прочесть: lesson-web.ru/page/blog/191. В двух словах, не уследил и кончилось место на жестком и mysql сломался (ситуация как в этом проекте), но у меня был бэкапчик и в целом он меня спас)

После этого случая я подумал… А что если на самом деле реально mysql сломался из-за малого места на жестком, но я удалил ibdata и потом было уже ничего не доказать? Если это так, то как-то обидненько даже…

5) Смотрите, что вводите в терминал 

Смотрите какие команды, куда и зачем вводите!!! Я теперь если команду не знаю, то гуглю ее прежде чем ввести в терминал)

6) Разграничивайте ответственность

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

7) Не нойте

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

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

8) Берите ответственность за свои косяки

Накосячил — лови люлей. Если что-то пошло не так, то позвоните заказчику и объясните ситуацию как есть. Они тоже люди и поймут, войдут в ваше положение и даже помогут решить проблему. Не пропадайте) Хуже будет только вам.

Это относится не только к сайтам, на самом деле, но и к жизни. 

9) Мы получаем кайф от форсмажоров

Во время всей это кутерьмы мне друг сказал одну интересную вещь, что все проблемы идут из нашей головы и если проблемы есть, то мы хотим чтобы они были. И я понял, что в какой-то мере кайфую от этой ситуации. Я программистский мазохист! Я люблю форс-мажоры и поэтому притягиваю их. При чем люблю не так, что «Аааааа! Хочу срывать дедлайны! Давайте делать сайт еще 5 месяцев бесплатно по ночам». Просто внутри какая-то маленькая частичка меня сидит и тихо получает удовольствие от происходящего. 

Подумайте об этом, если постоянно срываете дедлайны. 

10) Не беритесь за сомнительные проекты

Фильтруйте ваши заказы. Этот проект изначально был сомнительным. Но мне нужны были деньги и опыт. Сейчас я 70% заказов отсеиваю и говорю что не хочу их делать, просто они мне реально не интересны. Другой вопрос, что я могу себе это сейчас позволить, тогда не мог)

С другой стороны, я взялся за этот проект и получил довольно приличный опыт. Поэтому черт его знает. Наверное, все-таки, беритесь за сомнительные проекты — это опыт. Но только один раз…

11) Вера в Toster

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

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

Сейчас сделал в своем проекте по обучению разработке сайтов такой же раздел, где можно задавать вопросы: lesson-web.ru/question. Так что, если вы только начинаете путь разработчика, можете спрашивать там. Я отвечу) 
P.S. Интерфейс спер у Тостера, ибо очень удобно. 

Завершение

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

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

Спасибо за прочтение! Надеюсь, было интересно.