Как сделать что то сложное
Как начать сложное дело и довести его до конца
Чем старше мы становимся, тем сложнее закрепить в своей жизни положительные привычки либо даже просто довести какую-нибудь крутую задумку до конца. Только начинаем заниматься делом всерьез, как вскоре отступаем. И даже причин отступать толковых не было, просто спотыкаемся на ерунде, в самом начале пути. Зато плохие привычки закрепляются со всей возможной страстью — пару недель и готово. Лучший способ что-то исправить — это задать себе простой вопрос: «Я делаю то, что хочу?».
Но даже если ты делаешь, что хочется, для этого тоже нужна дисциплина. Попробуй прямо сейчас составить список из дел на неделю, который будет называться «я хочу» — это и есть твой главный план. Он сложный. Этот путь гораздо более труден, чем то, чем тебя заставляют заниматься.
Понимаем, что о плане мы говорили тебе уже тысячи раз, но что с нас взять, если это обязательное условие выполнение любой цели, а той, которая сопряжена с твоим желанием, и подавно. Поэтому распиши план, сделай его наиболее детализированным, измеримым. Пускай он будет растянутым. Обязательно включи в план эффект «гибкости», который предполагает, что у тебя есть несколько сценариев выполнения цели. Нельзя ограничиваться только одной дорогой — она может оказаться разбитой или непроходимой. Также имей в виду, что временная шкала выполнения цели должна быть достаточно длинной, чтобы ты успел все сделать. Если цель реально трудная, то рассчитывай на пару месяцев ежедневной работы.
Управляемая цель — это отслеживаемая цель. Ее можно занести в диаграмму, расписать в google-документе, проиллюстрировать презентацией, прогнать через таблицу. То есть ты должен знать, что твоя цель — это не эфемерная идея, а что-то конкретное, что-то, что можно разложить по полочкам.
Тебе не нужна мантра или цитата известного мужика, чтобы понять свое предназначение. Тебе нужны пару строк, которые в полной мере объяснят то, что ты делаешь, и зачем ты это делаешь. Пусть это будет странная фраза или конкретное определение, которые что-то для тебя значат. Пусть это будет что-то важное. Что-то, что во время полнейшего бессилия сможет вернуть тебя в игру. Это один из немногих способов для твоего временного и забывчивого «я» стать направленным и долгосрочным.
Не начинай все в первый день, стартуй плавно. Это поможет тебе выработать привычку, которая останется с тобой на всю жизнь, и это избавит тебя от истощения, которое нередко впивается в мозг, когда мы рвемся в бой, не осознавая, что сил для этого у нас еще нет. И хотим дать тебе еще очень хороший совет, который пропитан нашим болезненным опытом. Если перед тобой десять прекрасных возможностей реализовать себя, то не берись за все сразу — ничего не успеешь или все сделаешь плохо.
Можно быть гибким, и это неплохо, когда хочешь найти лучшие варианты выполнения той или иной цели, но не позволяй оправдывать свое бездействие гибкостью. Порой нужно просто действовать, без всякой задней мысли, а просто тупо делать свое дело. Если ты боишься работать по 10-12 часов, то тебе нет места на празднике жизни. Мы не говорим, что надо загонять себя до трупного состояния. Но если перед тобой сложная цель, то будь жестче с ней — не давай ей тебя сломать.
Если все пойдет по плану, то перед тобой возникнет серьезная проблема — твой старый образ жизни не сможет выдерживать амбиций, которые появились в твоем мозгу за последнее время. Вероятно, сейчас перед тобой стоит возможность большого сдвига в жизни. Это круто, но жизнь требует обновления, чтобы этот сдвиг произошел безболезненно, иначе ты преуспеешь в одной сфере (в карьере, например), но разрушишь все остальное, включая дружеские и романтические отношения.
Если ты прошел все предыдущие шаги, то ты уже должен заметить, что твой путь стал гораздо красочнее, сочнее. Вероятно, цели, заявленные тобой в самом начале, не соответствуют целям, которые ты ощущаешь в данный момент. Значит их надо поменять. Нет в этом ничего плохого. Просто ты вырос, и ты, наконец, понял, что ты хочешь на самом деле. Если цели остались прежними, то и это хорошо — значит, они только укрепились в твоем сознании и достигнуть их будет проще.
Мы не знаем, подойдут ли наши советы для твоей жизни. Никто не знает. Но ты ничего не потеряешь, если просто попробуешь нас послушать. Изменится ли твоя жизнь к лучшему? Возможно. Если так произойдет, то обязательно напиши об этом в комментариях.
Как сделать что-то сложное простым, или Инструкция по построению бизнеса (стр. 1 )
| Из за большого объема этот материал размещен на нескольких страницах: 1 2 3 4 5 6 7 8 9 10 11 |
Как сделать что-то сложное простым,
Инструкция по построению бизнеса
Я надеюсь на то, что данная книга поможет Вам в вашем стремлении к успеху и даст практические инструменты, которые Вы сможете использовать!
Здесь я хочу дать кое-какие пояснения, чтобы было легче ориентироваться.
Я принял некоторые выделения текста, чтобы Вам было легче заострять свое внимание на важных вещах.
Самые главные моменты я выделяю в золотую рамку и пишу золотыми буквами!
То, что касается ваших выгод, я выделил белыми буквами на красном фоне
Менее значимые моменты я выделяю желтым цветом.
Определения слов, пояснения я выделил черной рамкой.
Введение
Эта книга не дает гарантий того, что вы сможете построить свой успешный бизнес, но она дает понимание того, что, как и почему надо делать.
Будете вы это делать или нет, зависит только от вас.
Это не книга из серии «умных сборников», где понадергано цитат из разных книг, собрано все воедино в «новую» книгу.
После прочтения книги Вы будете понимать, где у Вас проблемы, почему Ваш бизнес не растет и что с этим можно сделать.
А теперь о деле, о главном отличии моего подхода от всего, что Вы видели
Мой подход можно разделить на две части:
1. Теория бизнеса (и по ней мои Партнеры сдают экзамен прежде, чем переходить к практическим действиям);
2. Практика бизнеса (она начинается после изучения теории и экзамена. Партнеры проходят через 3-х шаговое практическое обучение, они учатся, занимаясь реальным делом).
Теория
Кто-нибудь из вас слышал о теории бизнеса в МЛМ? Лично я никогда!
МЛМ/Сетевой Маркетинг считается простым занятием, где любой дилетант может легко заработать деньги и для этого не надо ничему учиться, просто иди и говори с энтузиазмом о Компании и продукции.
Как теория может реально пригодиться? Теория показывает заранее, до того как Вы начнете действовать, с какими барьерами Вы можете столкнуться и какие действия надо предпринять, чтобы их избежать или с ними справиться.
Теория вводит Вас в курс дела до того, как Вы погрузитесь в это с головой и увязнете беспомощно в проблемах.
Я дам Вам практическое, пригодное для жизни определение того, что такое теория.
Наверняка Вам известен случай, когда какой-то человек задумал начать свое дело (в любой области, неважно, в какой), а через некоторое время Вы видите его по уши в проблемах: долги, потеря здоровья, развал семьи и т. п.
Что произошло? Просто этот человек не изучил теории той области, в которой попытался заняться практикой (т. е. начал действовать, не понимая что, как и зачем, какие барьеры могут возникнуть на пути и какие последствия ждут).
Практика
А вот определение практики.
Благодаря тому, что барьеры и ситуации известны заранее (описаны в теории), Вы можете действовать эффективно, а не с закрытыми глазами, как в случае с «предпринимателем», который не прочитал элементарных, основополагающих книг по финансам, маркетингу и деловым взаимоотношениям и в результате получил проблемы!
Надеюсь, Вы оцените важность теории как инструмента, позволяющего Вам подготовиться перед тем, как начать действовать. Она позволит Вам получать хорошие результаты и не «наломать дров».
Уважаемые Партнеры и наши будущие Партнеры! А также все те, кому может помочь мой опыт в их деле! В этой брошюре я опишу главные принципы построения бизнеса.
Самое сложное во всем этом – простота. Слишком просто. Наверняка возникнет желание что-то поменять! Но это будет ошибкой.
Пусть будет все ПРОСТО.
Если будете менять, дополнять, то на вас перестанет работать самый важный принцип бизнеса – КОПИРОВАНИЕ!
Надо сохранить простоту, тогда это будет доступно для повторения другими людьми, ведь заставить работать КОПИРОВАНИЕ на себя — это и есть самый главный момент в бизнесе!
Вы уже заметили, что я не использую выражения МЛМ/Сетевой Маркетинг?
Это связано с тем, что я не хочу смешивать заблуждения, ложь, мистику и прочее.
Я хочу четко отделить это все от того, что я предлагаю, чтобы было как можно меньше путаницы. К сожалению, дилетанты и аферисты испортили имидж данной области.
Кто-то пытается поднять имидж МЛМ, Сетевого Маркетинга. Говорит, что сама идея прекрасна, но ее извратили.
Я пошел другим путем, я просто избавился от этих слов. И словосочетание «Бизнес Прямых Продаж» гораздо эффективнее и правильнее описывает то, чем я занимаюсь.
Если кто-то из вас читал книгу известного маркетолога Джека Траута «Новое Позиционирование», то обратил внимание на замечательную историю, которая очень подходит для нас.
Историю о том, как одна известная, старая компании потратили массу денег только для того, чтобы изменить восприятие людьми себя как старой, устаревшей компании, на восприятие ее как современной, высокотехнологичной.
Потратили деньги, а результата так и нет. Разве мы можем тратить такие же суммы (миллионы долларов) на то, чтобы изменить восприятие людей о МЛМ/Сетевом Маркетинге? Даже если бы и могли, учтите, что результата бы все равно не было!
Нет смысла менять восприятие, надо его отбросить и идти делать свое дело, но так, чтобы снова все не испортить.
Вот что я подразумеваю под термином Прямые Продажи:
Прямые продажи – это когда Производитель товаров (услуг) продает произведенный им товар (услугу), напрямую потребителю, исключая цепочку посредников: рекламу, оптовые базы, магазины и прочее.
Отличие этой Системы Построения Бизнеса от других (якобы) Систем
Главное отличие в том, что тут описаны практические действия, основанные на теории и практике миллионеров, но на самом деле даже превосходящие их подход!
Идея со статьёй возникла только потому, что я понял: я не смогу каждому объяснять, что, и как, и почему. Слишком много сил и времени. И еще я понял, что если идти «устным» путем, эта Система Построения Бизнеса просто исчезнет из-за искажений и непонимания людей.
Вы не найдете здесь высказываний типа «Ваш личностный рост определяет размер вашего бизнеса», т. к. это умное выражение не дает человеку практического совета, а вот заморочить может. Такое не раз было. У человека есть и внутренняя мотивация, и действия он совершает, но бизнес не развивается (а настоящая причина — в отсутствии действий, которые могут скопировать его партнеры). И тогда, услышав это умное высказывание, он начинает заниматься самокопанием и думать: «Наверно, я еще не лидер. Мне надо еще много развиваться. Мне надо идти на специальные курсы по развитию личности. Я недостаточно умен, хорош для этого бизнеса».
Соответственно, он впадает в мистику, не зная точной причины, начинает делать странные вещи, и его энтузиазм падает, внутренняя мотивация уменьшается, и человек теряет силы.
Он бросает бизнес. Мне жалко таких людей, они достойны большего, я хочу, чтобы они преуспели!
Еще одна причина, почему такие люди не преуспевают — наличие тех, которые притворяются, что знают, что делать, и говорят, что могут вас научить. К сожалению немало тех, кто на таких людях, стремящихся улучшить себя и жизнь в целом, пытаются зарабатывать за счет якобы обучения. Но такое псевдообучение только еще больше вгоняет человека в замешательство!
Вот основное, что я хотел изложить в этой книге. Надеюсь, вы получите результат, и у вас будет не шанс создать свой бизнес, а возможность. Шанс — дело случая, возможность — дело наших рук.
Все, что вы прочтете, является результатом знаний и опыта по самомучению в попытке построить бизнес в течение 4-х лет. Именно самомучение — то, чем большинство людей занимаются, когда пробуют создавать свое дело в области прямых продаж (или МЛМ/Сетевого Маркетинга).
Когда я устал и понял, что с таким подходом так никто никуда не придет, то возникла мысль найти ответы, собрать по крупинкам практический опыт и знания, которые могли бы дать ответы на то, делать и самое главное – ПОЛУЧИТЬ РЕЗУЛЬТАТ, оставаясь порядочным и чувствовать себя хорошо!
Я посетил более 20 семинаров и потратил на них тысячи три долларов. Имел возможность общаться с людьми, у которых был большой успех в данной области.
Я работал с миллионером. Здесь мне повезло. Этот человек дал мне очень важный урок, без которого я бы не смог разобраться во всем этом, а тем более создать Систему Построения Бизнеса.
От сложного к простому: алгоритм гарантированного решения любой задачи
Программист и математик Дэвид Макайвер в личном блоге рассказывает о собственной системе, которая помогает справляться с, казалось бы, неразрешимыми трудностями
Эта система — полезная концептуальная основа, помогающая лучше освоить то, что вам кажется трудным. Я не всегда четко следую ей, но часто замечаю, что добиваюсь успеха, неявно следуя системе, и почти каждый раз, когда кто-то просит у меня совета, как научиться что-то делать, я просто описываю подходящую им версию системы.
Система работает «всегда» — в том смысле, что «в конце концов» вы либо поймете, почему цели достичь невозможно, либо добьетесь успеха. Но она не дает гарантии, что для этого не потребуется бесконечно долгое время. Более вероятный результат — вы либо сравнительно быстро преуспеете, либо вам надоест, и вы сдадитесь. Но это нормально — система задумана таким образом, чтобы вы получали пользу от следования ей на каждом этапе пути, даже если не достигли своей конечной цели.
Я должен также отметить, что эта система ни в коем случае не служит кратчайшим путем. Она предполагает много работы. Цель системы — не оградить вас от работы, а обеспечить ее полезность.
Система с одной петлей
Когда вы хорошо представляете, что такое успешный результат, но в настоящее время не можете его достичь, система работает следующим образом:
Эта система работает намного лучше, чем просто выполнение сложных задач, потому что она дает вам гораздо более прямой цикл обратной связи. В любой момент, когда вы пытаетесь стать лучше в каком-то деле, существует ровно один аспект проблемы, и вы можете сосредоточиться на этом аспекте, исключив все остальное. Когда вы пытаетесь делать что-то сложное сразу в нескольких аспектах, каждый из них будет вам не даваться. Более того, у вас будет получаться хуже, чем если бы вы брались за каждый из этих аспектов по отдельности. Кроме того, потерпев неудачу, вам придется выполнить сложный анализ первопричин, чтобы выяснить, почему.
Система с двойной петлей
Если вы не очень хорошо представляете себе искомый результат, нужно пройти двойное обучение, чтобы улучшить понимание проблемы и применить решение.
Это все ужасное упрощение? Ну да, конечно, так и есть. Тем не менее, это очень полезное упрощение, которое выводит вас из тупика, когда проблемы кажутся неразрешимыми.
Как определить самые сложные точки
Иногда то, что нужно улучшить, очевидно, иногда — нет. Если это не очевидно, вот что поможет вам понять:
Рабочий пример: учимся лучше писать
Эта система особенно хорошо подходит в качестве механизма для улучшения навыков письма.
Писать трудно во многих отношениях. Вот некоторые из них (примерно в том порядке, в котором, как я думаю, стоит заняться ими):
А дальше можно задуматься о более конкретных деталях, которые вам не даются — например, диалоги, описания и т.д.
Но если вы читаете это, вы определенно можете писать. Даю слово. Возможно, вы не сможете написать роман (я не могу в данный момент), но вы, безусловно, можете написать твит, и нужна всего лишь серия дополнительных шагов, чтобы дойти до цели.
Вот несколько примеров:
Есть много всего другого, что стоит попробовать, но это хорошая отправная точка.
Интересная статья? Подпишитесь на наш канал в Telegram, чтобы получать больше познавательного контента и свежих идей.
Как сделать сложное простым. История создания «Проекта1917»
В конце июня 2016 года ребята из «Проекта 1917», посвященного столетию октябрьской революции в России, попросили помочь им реализовать вебчасть их проекта. Предполагалось, что это будет социальная сеть, где Николай II постит свои фотографии, Ленин ставит ему лайки, Троцкий комментирует. Мы были не первые, к кому они обратились: кто-то говорил, что в очень короткие сроки это сделать невозможно, либо стоить это будет очень дорого.
Создатели проекта говорят, что это лучшая социальная сеть в истории — потому что все ее пользователи давно умерли. Это сайт в формате социальной сети, где пользователями являются реальные исторические личности, которые пишут о событиях, происходивших ровно сто лет назад. Все материалы основаны на реальных исторических документах, письмах, публицистических материалах, используются данные из фотоархивов, из видеоархивов. Читатели нашего времени могут комментировать эти записи, лайкать, делиться ими в социальных сетях.
Изучив задачу, мы поняли, что она вполне реализуема, и можно успеть ее сделать в обозначенный срок. Несмотря на то, что наш основной профиль — администрирование и поддержка высоконагруженных проектов, мы начинали с веб-разработки, и до сих пор иногда занимаемся разработкой (кто, как не мы, лучше знает, как должна быть устроена инфраструктура сайта, рассчитанного на большой трафик).
Ключевой момент: у нас была несдвигаемая дата дедлайна — с точностью до минуты. Это 15:00 14 ноября — в это время в СМИ уйдут пресс-релизы, Яндекс опубликует проект у себя, на Красной площади человек с мегафоном сделает официальный анонс проекта. Вероятность сдвинуть дедлайн хотя бы на час была равна нулю.
На этапе согласования работ с клиентом мы определили четкий график реализации проекта. Понятно, что материалов очень много, и сайт наполнить контентом нужно не за час до релиза, а гораздо раньше. В начале августа мы решили выкатить в продакшн админку и начать верстать. В сентябре — доработать админку и начать привязывать данные, в октябре реализовать взаимодействие с пользователями нашего времени (сделать авторизацию, реализовать шеры, лайки, комментарии). 7 ноября (хорошая дата) было решено провести нагрузочное тестирование. 14 ноября — запуск проекта, спустя неделю после запуска мы реализовываем пуш-уведомления, чтобы возвращать пользователя на сайт. В декабре сайт должен был быть переведен на английский язык.
Формируем команду и начинаем работу
3 июля мы подписали договор, план работ и сделали первый коммит в репозитории.
В сложном проекте с жестким дедлайном очень важно, чтобы команда не стала выглядеть, как эта: Вася, который работает, и над ним десять менеджеров
Первый принцип — no rocket science (никаких ракетных технологий), хотя сроки и сжаты. Мы строим не ракету, которая должна прилететь на Марс и спасти человека, у которого закончилась картошка. Мы всего лишь делаем социальную сеть.
Если в процессе решения какой-то задачи в каком-то из рабочих чатов появлялся такой стикер, это значило: «Ребята, что-то у вас идет не так, нужно разбить задачу на более мелкие подзадачи, решать по отдельности и не усложнять себе жизнь».
В команде у нас были менеджер проекта, три программиста, два админа, два тестера, и в определенный момент было принято решение команду разделить на две географических зоны: часть ребят уехала из Иркутска работать в Москву, чтобы обеспечить длинный рабочий день (у нас главный офис в Иркутске, и разработка сначала велась там).
Какой был выбран стэк? Каждый день появляются новые технологии, и во всем этом очень легко заблудиться, включить что-то ненужное, просто потому, что это модно. Так делать не надо — не забывайте старую русскую поговорку: «Чем круче джип, тем дольше идти за трактором». И в программировании эта поговорка применима.
Как мы решили построить стэк? В качестве веб-сервера мы поставили Nginx с PHP-FPM, для базы был выбран MySQL 5.7, в качестве фреймворка для бэкенда мы выбрали Laravel — это наш рабочий фреймворк. Фреймворком для фронтенда был выбран Angular 1.5.
Один из главных принципов, почему Angular 1.5 — мы используем только то, что хорошо знаем, или сможем быстро найти ответ, если что-то не знаем. Первая более-менее стабильная версия второго Ангуляра вышла спустя две недели после того, как мы начали разработку, и нам было уже не до того, чтобы все переписывать. До этого с версиями 1.5, 1.4 мы работали достаточно много, знали все подводные камни, поэтому решили делать на том, чем мы умеем пользоваться.
Для работы с графикой мы взяли Imagemagic, для работы с видеоматериалами и с гифками мы взяли FFmpeg, обязательно используем Memcached, для сбора и работы со статикой мы используем Gulp с собственными, нами написанными тасками.
Делаем админку и верстаем
Через месяц мы уже выдали админку. Как построили админскую часть, как сайт наполняется контентом? За основу мы в бэкенде положили пакет L5-repository — это пакет для Laravel, который позволяет буквально тремя командами реализовывать нам RESTful API, делать нам все модели, создавать из коробки миграции со сложными отношениями, одним рутом генерировать нам полностью контроллер для работы с данными. Фронтенд админки был выполнен как одностраничное веб-приложение: активно используется сервис ngResource, чтобы взаимодействовать с API. На стороне фронтендa мы попытались реализовать самописный JS-cache, чтобы из админки данные постоянно не запрашивались с сервера, если мы что-то один раз загрузили, и с этим работаем на клиенте. Вся админка построена на Angular-компонентах.
Очень важно было обсудить с клиентом, как они хотят построить работу редакции. Идеальный вариант админки — когда над каким-нибудь разделом работает одновременно пять человек: кто-то обновил название, кто-то — текст. Клиент запланировал последовательную работу: будут ответственный за текст поста и ответственный за порядок постов. Мы сделали так, что компоненты не пересекаются между собой, и обновляют только те данные, с которыми они работают. В среднем на разработку компонента мы тратили где-то час, и какой-то принципиально новый раздел в админке выкатывали за день.
Самый простой наш компонент — текстовый редактор. Понятно, что это обычный TinyMCE, но немного доработанный. Видно, что у нас есть кнопки «вставить ссылку», «вставить героя» и сразу в тексте видно, что в текст будет вставлена, например, ссылка на Владимира Ленина, где будет потом красивый попап с его фотографией, и так далее.
Вот так вот выглядела редакция, которая в первый раз увидела нашу админку — они очень радовались, им было очень удобно и настолько просто, что можно научить ей пользоваться даже собаку:
Дорабатываем админку и привязываем данные
Итак, админку мы сделали, подбираемся к публичной части проекта — к фронтенду. Так получилось, что макеты нам дали чуть позже, каждый день на ходу менялись задачи. Это был первый тревожный звоночек: мы можем не успеть. Решили сразу верстать и адаптироваться на живые данные.
Как мы решили реализовать фронтенд? Для поисков, фильтрации, сортировок мы так же используем пакет, который используем в админке, — L5-репозиторий, то есть работаем со всеми данными как с репозиторием. Какие-то блоки на сайте с точки зрения PHP-кода мы выделяем в отдельные сервисы, они подключаются как объекты-одиночки, и нужно выстроить их так, что если понадобится вытащить из сайта один компонент и вставить его куда-то в другое место, все должно работать.
Например, есть у нас такой базовый компонент — календарь. Сразу же от этого компонента у нас выходит компонент «шапка». Это красивая картинка с популярными постами, с возможностью поделиться:
Дальше у нас идет лента постов, которая «общается» с календарем и смотрит, «какой день надо нарисовать».
От ленты зависят блоки рекомендаций и блок подписки. От календаря зависят такие блоки, как погода, валюты, дни рождения. Почти как в настоящем Фэйсбуке можно посмотреть всю картину дня сразу.
На бэкенд, то есть на сервер, можно было предсказать нагрузку — в ТЗ обозначили определенное количество RPS, а вот то, с каких устройств будут просматривать сайт, мы предсказать не можем. Поэтому было решено публичную часть фронтенда делать максимально просто.
Во-первых, вся статика у нас сразу запрашивается из кэша, для динамической уникальной пользовательской информации мы используем API, которое не кэшируется. Вся динамическая загрузка работает через HTML. Сервер генерирует статичную ленту, например, прокрутили — пришла новая страница в HTML, то есть, данные не в JSON. Если вдруг все равно нам надо как-то работать на странице с JavaScript, мы либо оптимизируем, либо минимизируем использование AngularJS, и активно используем библиотеку Bindonce, которая позволяет реализовывать одноразовые связывания. Все изображения оптимизируются средствами Nginx, с помощью модуля http_image_filter, и в случае каких-то пиковых нагрузок мы раздачу статики переводим на CDN.
Делаем лайки, шеры, комментарии
Их реализовали за неделю. Во-первых, что такое, например, лайк или комментарий? По сути, с точки зрения базы данных, это обычная таблица, которая реализует связь many-to-many: есть, например, post id, есть user id. Мы решили подойти по-другому, и работать с этим отношением не как с отношением, то есть, например, что у нас пост имеет комментарии, мы выделили комментарии в отдельную сущность, которая имеет hasOne пост, hasOne автор. При этом, в Гугле по запросу «как написать лайки» предлагают использовать такую связь, например, как morph-by-many. Когда таблица хранит не два айдишника объектов, которые она связывает, а like-type, like-id. Например, хотите вы делать лайки для постов, для видео — вам предлагают сделать like-type, like-id. Мы решили, что это лишнее — у нас будет только одна таблица лайков.
Дальше. Активно использовали методы-мутаторы, чтобы, например, на странице одной строчкой получить число шеров, например, это у нас вк-шер, ок-шер, фб-шер. На фронтенде используется Localstorage, который в случае, например, неподдерживаемости браузером может опуститься до уровня кук. Там мы, например, храним информацию о том, что пользователь лайкнул пост, то есть, чтобы каждый раз мы не делали запросы в базу, не получали список постов. Мы сохраняем один раз все в Localstorage, страница срендерилась, сердечко закрасилось, лишний запрос в базу мы не делаем.
Мы не кэшируем API для работы с пользователем — он должен в реальном времени получать, например, актуальные комментарии. Нельзя сказать пользователю: Извини, у нас пять минут кэша, через пять минут твой комментарий появится». И если вдруг нам понадобится какое-то, например, динамическое общение с сервером, мы спокойно можем использовать события с каналами из Laravel, которые работают уже с Node.js.
Теперь о шеринге. Многие спрашивают, почему мы не используем какое-то готовое решение для этого. Дело в том, что помимо контента у нас очень много спецпроектов, где человек может пройти тест, загрузить фотографию, ему сгенерируется открыточка, он ее шерит в социальную сеть. При этом, если другой человек увидел в ленте у своего друга эту картинку, он на нее нажимает и должен попасть на страницу теста. То есть, на уровне Ngnix мы ботов отправляем на заглушки, а не редиректим ботов туда, куда нам надо.
Также в нашей системе шеринга мы реализовали свой механизм подсчета. Для всех подобного рода систем очень важно выводить акуальную информацию (число репостов), а также хранить их в базе для подсчета определенных статистик, рейтингов и прочее. Очень часто программисты, сталкивающеся с шерингом первый раз, реализуют подсчет следующим образом: по заданиям в cron бэкенд делает запросы к апи социальных сетей, получает свежие данные, сохраняет. У этого подхода есть два серьезных недостатка — во-первых, информация в текущий момент времени может быть не актуальна (например, крон раз в 10 минут обновляет данные о 1000 постов), во-вторых за частые обращения к апи социальных сетей с одного IP-адреса вас могут забанить.
Мы пошли другим путем. В момент, когда пользователь шерит пост в свою социальную сеть, мы паралельно с попапом шеринга делаем запрос к api социальной сети из js-кода (соответственно — с ip-адреса клиента), получаем актуальное число репостов, прибавляем к этому числу 1 (пользователь же еще не пошерил) и сохраняем в базу данных. Соответственно, мы постоянно поддерживаем базу количества шерингов в актуальном состоянии, и даже возникает такой эффект, что, например, ты пошерил, а число увеличилось на 10, значит, кто-то с тобой вместе сейчас шерит, ты такой: «О, круто, все в реальном времени работает, как мне это нравится!».
Разрабатываем пуш-уведомления и запускаем
Приближалось 14 ноября, ничего не предвещало беды, мы спокойно прошли нагрузочное тестирование, полностью подготовили сайт к релизу, как в 9 вечера по Москве появилось такое сообщение. Ребята передумали и решили сдвинуть разработку пушей на сейчас. Пик трафика ожидался как раз в день запуска, и базу подписчиков нужно было собрать уже в этот день. Когда люди разрабатывают пуш-уведомления, они не обращают внимания на главную проблему: цена ошибки при разработке — это новый домен и потерянная база подписчиков. Например, вы долго-долго колдовали и наконец-то добились того, что у вас в браузере появилась вот эта вот плашка «я подтверждаю отправку мне уведомлений». Если код у вас выглядел в этот момент вот так (больше человек эту плашечку никогда в своей жизни не увидит, пока в настройках не сбросит пермишены на пуши):
Вы не сохранили токен, а просто его законсолили
Как мы решили реализовывать пуши. За основу был взят сервис Google Fairbase. Так как времени оставалось мало, мы обязательно смотрим документацию и делаем все по ней. В случае, если человек не был авторизован на сайте, решили делать очень просто. Мы генерируем какую-то уникальную cookie этому человеку, и в базу сохраняем токен с ней. Потом человек авторизовался на сайте, мы посмотрели, что у него есть cookie, в базе есть токен с ней, перепривязываем токен на конкретного пользователя, и потом уже ему рассылаем какие-то персональные уведомления.
В качестве рассыльщика решили использовать пакет Laravel-FCM. Тот, кто работал с FCM или Firebase, знает, что, для того, чтобы отправить сообщение, нужно все поделить на пачки по тысяче токенов, сделать отдельно запросы. Laravel-FCM это берет на себя. При этом он очень просто позволяет нам генерировать payload в пуши, делать какую-то персональную картинку для человека, персональный заголовок, персональный текст, персональную ссылку и так далее.
Мы успели. Выкатили пуши за час до релиза. На следующий вечер про проект написали The Village, Медуза, CNN, BBC, в «Третьяковской галерее» устроили банкет для СМИ, на который нас пригласили. И такая небольшая ирония: до декабря 2016 года главный офис нашей компании официально располагался посреди леса. Представьте, как круто — вы сделали проект, о котором написали в CNN, а сделали вы его в лесу.
Делаем локализацию
Итак, мы запустили проект, он работает, баги поправили, на дворе декабрь, нам надо делать локализацию. Локализовали проект за два дня.
Хранить в базе данных информацию о двух языковых версиях мы решили так. Для каждой сущности, которая может быть переведена на другой язык (пост, герой, группа, видео, геолокация) мы добавили поля: lang, которое хранит язык — 0русский/1английский) и поле mirror_id, куда сохраняется id записи «дублера» при копировании.
При таком копировании, например, если у объекта есть какие-то отношения (автор у поста, геолокация), все его дочерние сущности тоже скопируются, причем если сущность уже копировалась (mirror_id не пусто), то у копируемой записи перепривяжутся отношения на эту сущность, если нет, то сначала скопируется она и потом перепривяжется.
Например, в русской версии есть два поста, написанных Николаем II, при копировании первого поста скопируется и пост, и автор, при копировании второго — только второй пост, а автором назначится уже скопированный ранее Николай II.
Что дальше?
Как вообще проект живет сейчас. Основную функциональность мы уже разработали, практически ничего не меняется, делаем спецпроекты (игры, тесты), и до сих пор у всех возникает желание все переписать. Энергию направляем в мирные цели — если был какой-то спецпроект, и что-то сделали не идеально, мы это не переписываем, а реализуем уже в новом спецпроекте.
Например, из спецпроектов мы сделали: