Грязный ноукодер pinned «За последние 3 года no-code вырос очень сильно - множество людей стали переходить сюда из различных сфер и бизнес стал понимать его плюсы. Однако, когда я начинал, российское сообщество было совсем маленьким, и многих ключевых игроков ты знал лично, делал…»
Как жить, когда проектов много
На моей практике все активности происходят волнами. Неизвестно связанно ли это с какими-то биологическими и физическими процессами, но после каждого затишья начинается буря. В этой буре я часто оказываюсь погребенным под волной проектов из-за своего желания помочь всем и каждому.
Сначала, из-за отсутствия проектов, начинается паника и голод, тогда начинаешь соглашаться на все возможные подработки и проекты. Далее идет активная фаза откликов на все что только движется. И вот, когда уже начинает казаться, что удача от тебя отвернулась и придется идти на завод, тебя накрывает огромная волна откликов и предложений.
Данный круговорот событий случался со мной не раз и не два, но я все еще плохо справляюсь с такими ситуациями. Правильной тактикой будет повышение цены на свои услуги и выбор наиболее интересных и перспективных проектов. Но предсказать будущее достаточно сложно, ведь еще вчера клиенту все понравилось и он готовил описание новой задачи, а уже сегодня он бесследно исчез (и возможно появится снова в самый не подходящий момент).
А посему, я тону в пучине задач и звонков снова и снова…
На моей практике все активности происходят волнами. Неизвестно связанно ли это с какими-то биологическими и физическими процессами, но после каждого затишья начинается буря. В этой буре я часто оказываюсь погребенным под волной проектов из-за своего желания помочь всем и каждому.
Сначала, из-за отсутствия проектов, начинается паника и голод, тогда начинаешь соглашаться на все возможные подработки и проекты. Далее идет активная фаза откликов на все что только движется. И вот, когда уже начинает казаться, что удача от тебя отвернулась и придется идти на завод, тебя накрывает огромная волна откликов и предложений.
Данный круговорот событий случался со мной не раз и не два, но я все еще плохо справляюсь с такими ситуациями. Правильной тактикой будет повышение цены на свои услуги и выбор наиболее интересных и перспективных проектов. Но предсказать будущее достаточно сложно, ведь еще вчера клиенту все понравилось и он готовил описание новой задачи, а уже сегодня он бесследно исчез (и возможно появится снова в самый не подходящий момент).
А посему, я тону в пучине задач и звонков снова и снова…
4 способа, как я использовал ChatGPT на этой неделе.
1. Очищал спарсенные с Linkedin данные. ChatGPT не идеален и сломался на небольшой задаче в конце, поэтому пришлось доделывать ручками, но все же были сэкономлены часы времени.
2. Делал демо за час до звонка с клиентом. 3 из 3 лидов, где я показал демо на первом звонке, тут же подписали контракты. Чат помогает быстро понять, что нужно клиенту, прикинуть небольшое демо и даже симулировать API запросы - вместо сервиса я обращаюсь к OpenAI API, что рассчитать время полета между двумя городами.
3. Провел ретро по коммуникации с клиентами - скормил ИИ переписки, разобрал сделанные ошибки и сделал выводы на будущее. Любое ретро будет полезным - по проектам, по привычкам, по проведенному свободному времени и тд.
4. Приготовил базу для генерации контента - определил персоны, типы контента и хуки для постов, накидал десяток различных тем на будущее. Однако, времени на его генерацию совсем нет, нужно стараться готовить контент на неделю в выходные.
Ставьте лайк и подписывайтесь, данная рубрика публикуется еженедельно.
1. Очищал спарсенные с Linkedin данные. ChatGPT не идеален и сломался на небольшой задаче в конце, поэтому пришлось доделывать ручками, но все же были сэкономлены часы времени.
2. Делал демо за час до звонка с клиентом. 3 из 3 лидов, где я показал демо на первом звонке, тут же подписали контракты. Чат помогает быстро понять, что нужно клиенту, прикинуть небольшое демо и даже симулировать API запросы - вместо сервиса я обращаюсь к OpenAI API, что рассчитать время полета между двумя городами.
3. Провел ретро по коммуникации с клиентами - скормил ИИ переписки, разобрал сделанные ошибки и сделал выводы на будущее. Любое ретро будет полезным - по проектам, по привычкам, по проведенному свободному времени и тд.
4. Приготовил базу для генерации контента - определил персоны, типы контента и хуки для постов, накидал десяток различных тем на будущее. Однако, времени на его генерацию совсем нет, нужно стараться готовить контент на неделю в выходные.
Ставьте лайк и подписывайтесь, данная рубрика публикуется еженедельно.
Мини-гайд - Как сделать динамический progress bar для сервиса доставки
1. Создаем option list Statuses со статусами (у нас 7 статусов) и дополнительным атрибутом Order, где будет храниться порядковый номер статуса
2. Создаем state на главной странице для хранения статуса index status. При получении текстового статуса из источника мы будем сравнивать его с Statuses Display и сохранять в state. (Get Option - Statuses: All options - filtered by Display = нас текстовый статус)
3. Создаем repeating group со списком наших статусов отсортированных по порядку (Get Option - Statuses: All options - sorted by Order)
4. Создаем группу с align to parent layout, чтобы наложить визуальные элементы друг на друга - черную полосу (max width = 150px), белый кружок и черный кружок побольше (невидимый по дефолту). Все центрируем.
5. Обрезаем углы по бокам у полоски - для этого делаем 2 условия, где Statuses’s Order = 1/7 (у нас 7 статусов). Устанавливаем ряд изменений - max width 75 px (половина от изначальной), border roundness left/right top/bottom и alignment center left/right. Таким образом для первых и последних статусов будет отображаться лишь половина полосы справа или слева.
6. Чтобы показать текущий этап, устанавливаем условие видимости для большого кружка - parent group Statuses’s Order is index’s status’s order.
7. Чтобы отметить прошедшие этапы, устанавливаем условия смены цвета белого кружка на красный - parent group Statuses’s Order <= index’s status’s order.
8. (опционально) Допустим, нам нужно отметить прошедшие этапы на полосе, закрасив ее зеленой. Так как точка у нас располагается посередине отрезка, нам нужно закрашивать его наполовину, для этого добавим дополнительную половинку зеленой полосы. Добавляем черной полосе условие смены цвета parent group Statuses’s Order < index’s status’s order и добавляем спрятанную зеленую полоску с alignment center left и max width 75 px, показываем ее по условию Statuses’s Order != 1 (у нас 7 статусов). Таким образом мы будем закрашивать левую половину у полосы до точки посередине.
Лучше делать полосу вертикальной, чтобы решение было адаптивным для мобильных экранов. (на последнем скрине решение у Fedex)
А как бы это сделали вы?
Ставьте лайк и подписывайтесь, я выстраиваю систему генерации контента, поэтому скоро его станет еще больше (позже расскажу и о системе)
1. Создаем option list Statuses со статусами (у нас 7 статусов) и дополнительным атрибутом Order, где будет храниться порядковый номер статуса
2. Создаем state на главной странице для хранения статуса index status. При получении текстового статуса из источника мы будем сравнивать его с Statuses Display и сохранять в state. (Get Option - Statuses: All options - filtered by Display = нас текстовый статус)
3. Создаем repeating group со списком наших статусов отсортированных по порядку (Get Option - Statuses: All options - sorted by Order)
4. Создаем группу с align to parent layout, чтобы наложить визуальные элементы друг на друга - черную полосу (max width = 150px), белый кружок и черный кружок побольше (невидимый по дефолту). Все центрируем.
5. Обрезаем углы по бокам у полоски - для этого делаем 2 условия, где Statuses’s Order = 1/7 (у нас 7 статусов). Устанавливаем ряд изменений - max width 75 px (половина от изначальной), border roundness left/right top/bottom и alignment center left/right. Таким образом для первых и последних статусов будет отображаться лишь половина полосы справа или слева.
6. Чтобы показать текущий этап, устанавливаем условие видимости для большого кружка - parent group Statuses’s Order is index’s status’s order.
7. Чтобы отметить прошедшие этапы, устанавливаем условия смены цвета белого кружка на красный - parent group Statuses’s Order <= index’s status’s order.
8. (опционально) Допустим, нам нужно отметить прошедшие этапы на полосе, закрасив ее зеленой. Так как точка у нас располагается посередине отрезка, нам нужно закрашивать его наполовину, для этого добавим дополнительную половинку зеленой полосы. Добавляем черной полосе условие смены цвета parent group Statuses’s Order < index’s status’s order и добавляем спрятанную зеленую полоску с alignment center left и max width 75 px, показываем ее по условию Statuses’s Order != 1 (у нас 7 статусов). Таким образом мы будем закрашивать левую половину у полосы до точки посередине.
Лучше делать полосу вертикальной, чтобы решение было адаптивным для мобильных экранов. (на последнем скрине решение у Fedex)
А как бы это сделали вы?
Ставьте лайк и подписывайтесь, я выстраиваю систему генерации контента, поэтому скоро его станет еще больше (позже расскажу и о системе)
Как закрыть 5 из 5 лидов?
Все просто - нужно сделать демо.
Я по жизни руководствуюсь принципом - “чтобы что-то получить, нужно что-то дать”.
Разработка демо и погружение в проект клиента может занять от 30 до 60 минут вашего времени - здесь вы отдаете время.
Клиент, видя частично работающий продукт на основе его запроса, скорее согласиться работать с вами, нежели с абстрактными откликами - тут вы получаете расположение.
Создавать за такой короткий срок работающее демо сможет не каждый, но если придерживаться некоторых принципов, то со временем вы сможете приблизиться к таким результатам.
Вот мои основные принципы:
1. Готовая рабочая среда - у меня есть готовое приложение Bubble, интегрированное с базой Airtable, и я использую Make для внутренней автоматизации с готовыми интеграциями OpenAI и Gmail.
2. Библиотека элементов - готовые страницы аутентификации, списки с карточками/формами и другие элементы, которые помогут вам быстро собрать дизайн (для дизайна я использую Untitled UI Kit).
3. Генерация данных - использование ChatGPT для создания фиктивных данных, адаптированных к конкретному кейсу.
4. Симуляция действия и интеграция - использование ChatGPT или заготовленных JSON для имитации ответов от сервисов или действий.
5. Автоматизация процесса - я создал приложение, которое автоматически генерирует базы Airtable с таблицами на основе промпта. Я уже упоминал о нем, но теперь нет времени его доделать и опубликовать.
Часть этих принципов относится не только к прототипированию, но и к работе с проектами в целом.
Ставьте лайк и подписывайтесь, если хотите узнать, как я управляю этими 5-ю проектами одновременно
Все просто - нужно сделать демо.
Я по жизни руководствуюсь принципом - “чтобы что-то получить, нужно что-то дать”.
Разработка демо и погружение в проект клиента может занять от 30 до 60 минут вашего времени - здесь вы отдаете время.
Клиент, видя частично работающий продукт на основе его запроса, скорее согласиться работать с вами, нежели с абстрактными откликами - тут вы получаете расположение.
Создавать за такой короткий срок работающее демо сможет не каждый, но если придерживаться некоторых принципов, то со временем вы сможете приблизиться к таким результатам.
Вот мои основные принципы:
1. Готовая рабочая среда - у меня есть готовое приложение Bubble, интегрированное с базой Airtable, и я использую Make для внутренней автоматизации с готовыми интеграциями OpenAI и Gmail.
2. Библиотека элементов - готовые страницы аутентификации, списки с карточками/формами и другие элементы, которые помогут вам быстро собрать дизайн (для дизайна я использую Untitled UI Kit).
3. Генерация данных - использование ChatGPT для создания фиктивных данных, адаптированных к конкретному кейсу.
4. Симуляция действия и интеграция - использование ChatGPT или заготовленных JSON для имитации ответов от сервисов или действий.
5. Автоматизация процесса - я создал приложение, которое автоматически генерирует базы Airtable с таблицами на основе промпта. Я уже упоминал о нем, но теперь нет времени его доделать и опубликовать.
Часть этих принципов относится не только к прототипированию, но и к работе с проектами в целом.
Ставьте лайк и подписывайтесь, если хотите узнать, как я управляю этими 5-ю проектами одновременно
Как персонализировать аутрич B2B лидов и заинтересовать больше потенциальных клиентов?
Один из новых трендов, пришедший с развитием ИИ, — это персонализация. Моя задача — создавать персонализированные сервисы и автоматизации для развития бизнеса. Я анализирую деятельность компании, изучаю внутренние процессы и взаимодействую со стейкхолдерами.
Теперь ИИ тоже может исследовать источники и анализировать информацию. Для этого ему требуется хороший датасет - сайт компании, данные из социальных сетей и новостей. Эта информация может быть собрана как непосредственно ИИ, так и через сервисы парсинга, такие как Phantombuster. Также теперь ChatGPT может анализировать и графические файлы, например, скриншоты сайта/социальных сетей (который также могут быть собраны через API, к примеру APIFlash ).
Все это может послужить отличной основной для создания персонализированного обращения.
Кроме аутрича, анализ данных о клиентах помогает категоризировать их, отсеивать неподходящих клиентов, формировать персональные предложения и определять оптимальную ценовую стратегию.
Сервисы для умного аутрича через email и linkedin:
https://www.getintently.ai/
https://www.fastoutreach.ai/
https://www.smartwriter.ai/
https://lyne.ai/
Ставьте лайк и подписывайтесь, завтра я расскажу о том, как управлять контентом, используя Airtable
Один из новых трендов, пришедший с развитием ИИ, — это персонализация. Моя задача — создавать персонализированные сервисы и автоматизации для развития бизнеса. Я анализирую деятельность компании, изучаю внутренние процессы и взаимодействую со стейкхолдерами.
Теперь ИИ тоже может исследовать источники и анализировать информацию. Для этого ему требуется хороший датасет - сайт компании, данные из социальных сетей и новостей. Эта информация может быть собрана как непосредственно ИИ, так и через сервисы парсинга, такие как Phantombuster. Также теперь ChatGPT может анализировать и графические файлы, например, скриншоты сайта/социальных сетей (который также могут быть собраны через API, к примеру APIFlash ).
Все это может послужить отличной основной для создания персонализированного обращения.
Кроме аутрича, анализ данных о клиентах помогает категоризировать их, отсеивать неподходящих клиентов, формировать персональные предложения и определять оптимальную ценовую стратегию.
Сервисы для умного аутрича через email и linkedin:
https://www.getintently.ai/
https://www.fastoutreach.ai/
https://www.smartwriter.ai/
https://lyne.ai/
Ставьте лайк и подписывайтесь, завтра я расскажу о том, как управлять контентом, используя Airtable
Как я систематизировал публикацию контента
За последние 3 недели я стал регулярно публиковать контент. До этого контент появлялся случайно, когда у меня было свободное время и вдохновение. Хотя у меня всегда было желание писать регулярно — я люблю это дело, и публикации помогают мне находить новые знакомства и возможности.
Что изменилось? Я построил систему.
Месяц назад я присоединился к сообществу владельцев no-code агентств и там встретил Кола Фортмана. Именно он поделился со мной своей системой, которая стала отправной точкой для моей собственной.
Моя система создания контента включает: подбор актуальных для моей аудитории идей, планирование тем на следующую неделю, формулирование основных тезисов и редактирование текста с помощью ChatGPT.
Как я ищу идеи? На работе я часто сталкиваюсь с интересными задачами, которые становятся основой для моих постов. Также в Airtable я составил базу данных о своей аудитории и возможных форматах контента для генерации свежих идей:
1. Хуки - различные варианты заголовков: вопросы, провокационные утверждения и пр.
2. Аудитория - характеристика разных сегментов моей целевой аудитории: портрет, основные цели, проблемы и способы их решения на моем примере.
3. Типы контента - обзор различных форматов и их структуры, а также визуальные решения: кейсы, опросы, руководства и т. д.
4. Стадии - этапы воронки продаж, на которых находятся потенциальные клиенты. Это помогает разнообразить контент и лучше понимать нужды клиентов на разных этапах.
В Airtable я могу выбирать разные параметры (хук, аудитория и т. д.), и в итоге получать общее саммари по ним, которое я использую для доработки поста. Основную часть контента я создаю сам, так как автоматически сгенерированный текст часто кажется неэмоциональным. ChatGPT помогает мне совершенствовать написанное с точки зрения грамматики и стиля.
Каждые выходные я трачу 2-3 часа на планирование контента на следующую неделю. Потом мне остается только публиковать готовые материалы.
В будущем я планирую внедрить анализ опубликованного контента, чтобы улучшать его качество, добавляя визуальные элементы и углубляясь в изучаемые темы.
Ставьте лайк и подписывайтесь, завтра я расскажу о том, как выглядит идеальное техническое задание для меня
За последние 3 недели я стал регулярно публиковать контент. До этого контент появлялся случайно, когда у меня было свободное время и вдохновение. Хотя у меня всегда было желание писать регулярно — я люблю это дело, и публикации помогают мне находить новые знакомства и возможности.
Что изменилось? Я построил систему.
Месяц назад я присоединился к сообществу владельцев no-code агентств и там встретил Кола Фортмана. Именно он поделился со мной своей системой, которая стала отправной точкой для моей собственной.
Моя система создания контента включает: подбор актуальных для моей аудитории идей, планирование тем на следующую неделю, формулирование основных тезисов и редактирование текста с помощью ChatGPT.
Как я ищу идеи? На работе я часто сталкиваюсь с интересными задачами, которые становятся основой для моих постов. Также в Airtable я составил базу данных о своей аудитории и возможных форматах контента для генерации свежих идей:
1. Хуки - различные варианты заголовков: вопросы, провокационные утверждения и пр.
2. Аудитория - характеристика разных сегментов моей целевой аудитории: портрет, основные цели, проблемы и способы их решения на моем примере.
3. Типы контента - обзор различных форматов и их структуры, а также визуальные решения: кейсы, опросы, руководства и т. д.
4. Стадии - этапы воронки продаж, на которых находятся потенциальные клиенты. Это помогает разнообразить контент и лучше понимать нужды клиентов на разных этапах.
В Airtable я могу выбирать разные параметры (хук, аудитория и т. д.), и в итоге получать общее саммари по ним, которое я использую для доработки поста. Основную часть контента я создаю сам, так как автоматически сгенерированный текст часто кажется неэмоциональным. ChatGPT помогает мне совершенствовать написанное с точки зрения грамматики и стиля.
Каждые выходные я трачу 2-3 часа на планирование контента на следующую неделю. Потом мне остается только публиковать готовые материалы.
В будущем я планирую внедрить анализ опубликованного контента, чтобы улучшать его качество, добавляя визуальные элементы и углубляясь в изучаемые темы.
Ставьте лайк и подписывайтесь, завтра я расскажу о том, как выглядит идеальное техническое задание для меня
Как написать ТЗ к 3 проектам за неделю и не сойти с ума
Сама по себе разработка является воплощением задуманных идей во что-то “реальное” - код или в нашем случае набор элементов в конструкторе. В разработке есть свои тонкости и зачастую существует несколько вариантов реализации одной и той же идеи, но выбор варианта всегда связан с другими элементами и общим контекстом проекта.
Более важным элементом реализации проекта является планирование - ведь без четкого плана и договоренностей с клиентом по каждому критическому вопросу в моменте разработки начинается фрустрация и метания между тем, чтобы сделать на свой вкус, и тем, чтобы напрячь клиента, который зачастую сам не знает, как именно должно быть. И как бы не хотелось опустить руки и “сделать все как-нибудь, а потом разберемся”, очень важно потратить достаточное количество времени на написание документации к проекту и согласовать все наиболее важные моменты.
Поэтому сегодня я расскажу, как выглядит мой процесс подготовки к работе над проектом.
1. Сначала мы просим клиента собрать все его хотелки в конкретные юзер сториз от лица пользователя, админа и тд. Формат может быть простым - как пользователь я хочу создать план платежей, чтобы ежемесячно запрашивать платежи с клиентов
2. Далее нам нужно сгруппировать эти юзер сториз по ролям и выстроить их по порядку. Порядок может быть условно хронологическим, так как некоторые процессы могут выполняться параллельно.
3. Перед тем как углубляться в эти юзер сториз, нужно проанализировать текущие и подумать, не пропущены ли какие-либо части - для этого можно использовать ChatGPT и попросить его дополнить список или задать вопросы к ТЗ с точки зрения критика.
4. Слона лучше есть по кусочкам и поэтому далее я расписываю каждую историю по трем пунктам - интерфейс, база данных, бэкенд. Это помогает фокусироваться на конкретной сториз и думать, как она связана с другими частями приложения, находить упущенные детали и подготавливать вопросы для клиента.
- Для интерфейса я указываю описание элемента интерфейса, нужного для реализации данной юзер сториз. Это может быть форма, таблица, кнопка и тд. Если в интерфейсе есть какой-то элемент, запускающий действие, я описываю это действие отдельно в бэкенде.
- Для базы данных я указываю таблицу, поля и тип данных, которые будут задействованы в этой юзер сториз
- Для бэкенда я указываю процессы, которые должны происходить после действий на фронте (к примеру, нажатие кнопки) или которые должны быть запущены автоматически системой без участия пользователя (к примеру, ежедневная проверка новых платежей).
5. После прохождения по всем сториз у меня набирается ряд вопросов, которые я оставляю комментариями в документе (я работаю в Google Docs).
6. После уточнения всех деталей, я перехожу к сборке каждой из частей - интерфейса, базы данных и бэкенда.
7. На основе описания всех частей можно приступать к созданию дизайна.
Таким образом на выходе у меня оказывается полноценное и согласованное описание проекта. Далее я перехожу к разработке.
P.S. до ноукода я год работал бизнес-аналитиком и писал ТЗ на внедрение Битрикс-24. Там я набрался опыта и выработал собственные принципы по написанию документации. Последний проект был реализован после моего ухода на основе моего ТЗ на 70 страниц.
Ставьте лайк и подписывайтесь, а таже делитесь в комментариях своим подходом к планированию проекта, мне будет интересно узнать новые best practices и улучшить свой процесс
Сама по себе разработка является воплощением задуманных идей во что-то “реальное” - код или в нашем случае набор элементов в конструкторе. В разработке есть свои тонкости и зачастую существует несколько вариантов реализации одной и той же идеи, но выбор варианта всегда связан с другими элементами и общим контекстом проекта.
Более важным элементом реализации проекта является планирование - ведь без четкого плана и договоренностей с клиентом по каждому критическому вопросу в моменте разработки начинается фрустрация и метания между тем, чтобы сделать на свой вкус, и тем, чтобы напрячь клиента, который зачастую сам не знает, как именно должно быть. И как бы не хотелось опустить руки и “сделать все как-нибудь, а потом разберемся”, очень важно потратить достаточное количество времени на написание документации к проекту и согласовать все наиболее важные моменты.
Поэтому сегодня я расскажу, как выглядит мой процесс подготовки к работе над проектом.
1. Сначала мы просим клиента собрать все его хотелки в конкретные юзер сториз от лица пользователя, админа и тд. Формат может быть простым - как пользователь я хочу создать план платежей, чтобы ежемесячно запрашивать платежи с клиентов
2. Далее нам нужно сгруппировать эти юзер сториз по ролям и выстроить их по порядку. Порядок может быть условно хронологическим, так как некоторые процессы могут выполняться параллельно.
3. Перед тем как углубляться в эти юзер сториз, нужно проанализировать текущие и подумать, не пропущены ли какие-либо части - для этого можно использовать ChatGPT и попросить его дополнить список или задать вопросы к ТЗ с точки зрения критика.
4. Слона лучше есть по кусочкам и поэтому далее я расписываю каждую историю по трем пунктам - интерфейс, база данных, бэкенд. Это помогает фокусироваться на конкретной сториз и думать, как она связана с другими частями приложения, находить упущенные детали и подготавливать вопросы для клиента.
- Для интерфейса я указываю описание элемента интерфейса, нужного для реализации данной юзер сториз. Это может быть форма, таблица, кнопка и тд. Если в интерфейсе есть какой-то элемент, запускающий действие, я описываю это действие отдельно в бэкенде.
- Для базы данных я указываю таблицу, поля и тип данных, которые будут задействованы в этой юзер сториз
- Для бэкенда я указываю процессы, которые должны происходить после действий на фронте (к примеру, нажатие кнопки) или которые должны быть запущены автоматически системой без участия пользователя (к примеру, ежедневная проверка новых платежей).
5. После прохождения по всем сториз у меня набирается ряд вопросов, которые я оставляю комментариями в документе (я работаю в Google Docs).
6. После уточнения всех деталей, я перехожу к сборке каждой из частей - интерфейса, базы данных и бэкенда.
7. На основе описания всех частей можно приступать к созданию дизайна.
Таким образом на выходе у меня оказывается полноценное и согласованное описание проекта. Далее я перехожу к разработке.
P.S. до ноукода я год работал бизнес-аналитиком и писал ТЗ на внедрение Битрикс-24. Там я набрался опыта и выработал собственные принципы по написанию документации. Последний проект был реализован после моего ухода на основе моего ТЗ на 70 страниц.
Ставьте лайк и подписывайтесь, а таже делитесь в комментариях своим подходом к планированию проекта, мне будет интересно узнать новые best practices и улучшить свой процесс
Как я успеваю управлять 5 клиентами?
Идея создать агентство и систематизировать все процессы была у меня на примете уже более двух лет. Судя по моим беседам с владельцами разных ноукод агентств, многие из них не имеют четко установленного процесса – по крайней мере в этой сфере. Под "четким процессом" я имею в виду хорошо отлаженный и понятный путь от первой встречи с клиентом до успешного завершения проекта.
За последние два года я многократно пересматривал детали своего подхода к разработке, но многие из них так и оставались лишь на бумаге. Однако когда месяц назад ко мне одновременно обратились несколько клиентов, стало ясно, что без четкой системы я выгорю уже через 2 недели. Как и всегда - идеи реализуются только при реальной потребности.
Ранее я вел задачи в Clickup, но работа с ним вечно не приживается (возможно станет получше в версии 3.0). Поэтому я решил попробовать Airtable.
И так моя система (таблицы):
1. Клиенты - тут я храню основную информацию о клиентах, почасовую ставку, источник привлечения и так далее
2. К каждому клиенту привязывается проект, их может быть и несколько. Тут указывается стэк, основная идея, ссылка на документацию проекта.
3. К каждому проекту крепятся milestones. По сути эдакие эпики/большие фичи, к которым крепятся задачи. У них есть дедлайн и примерная оценка в часах.
4. К milestones крепятся задачи. У задачи есть название, описание, дата начала и конца, приоритетность, статус, заметка для статуса Blocking (уточнение почему задача заблокирована). Сейчас я пытаюсь подключить к системе разработчика, поэтому добавились поля assignee и заметки. После выполнения задача уходит ко мне на проверку и я оставляю заметки для разработчика.
В дополнение к основным таблицам у меня есть:
5. Звонки - тут, в идеале, должны фиксироваться все звонки с кратким содержанием, однако этот пункт пока еще в разработке.
6. Уведомления - напоминания о необходимости выставить счета, провести звонки и так далее.
7. Интеграция с календарем - тут я вижу все события из своего календаря.
8. Доступы - информация о доступах ко всем сервисам клиента.
9. Трекер времени - я использую трекер от Toptal. У него есть внутреннее API, которое я использую, чтобы вытащить данные по конкретному проекту. Название проектов в CRM и трекере совпадают. Таким образом я могу сравнивать суммарную оценку времени по milestones и реально затраченное время.
10. Счета - тут я храню данные о счетах. Они вяжутся к отдельной таблице с налоговыми отчетами (я подаю их каждый месяц)
Я также настроил интерфейсы для удобного управления задачами и их отображения в календаре. У разработчика есть свой интерфейс, где он видит информацию только по тем проектам, к которым он привязан.
Это все хорошо, но действительно ли оно работает, как задумано?
Я стараюсь записывать обновления по всем проектам в конце дня. Иногда я пропускаю дни, если работы очень много, но в течении нескольких дней все равно делаю ревью.
Ставьте лайк и подписывайтесь, завтра я буду пробовать новый формат и расскажу как расписать в ТЗ процесс оплаты и ничего не забыть.
Идея создать агентство и систематизировать все процессы была у меня на примете уже более двух лет. Судя по моим беседам с владельцами разных ноукод агентств, многие из них не имеют четко установленного процесса – по крайней мере в этой сфере. Под "четким процессом" я имею в виду хорошо отлаженный и понятный путь от первой встречи с клиентом до успешного завершения проекта.
За последние два года я многократно пересматривал детали своего подхода к разработке, но многие из них так и оставались лишь на бумаге. Однако когда месяц назад ко мне одновременно обратились несколько клиентов, стало ясно, что без четкой системы я выгорю уже через 2 недели. Как и всегда - идеи реализуются только при реальной потребности.
Ранее я вел задачи в Clickup, но работа с ним вечно не приживается (возможно станет получше в версии 3.0). Поэтому я решил попробовать Airtable.
И так моя система (таблицы):
1. Клиенты - тут я храню основную информацию о клиентах, почасовую ставку, источник привлечения и так далее
2. К каждому клиенту привязывается проект, их может быть и несколько. Тут указывается стэк, основная идея, ссылка на документацию проекта.
3. К каждому проекту крепятся milestones. По сути эдакие эпики/большие фичи, к которым крепятся задачи. У них есть дедлайн и примерная оценка в часах.
4. К milestones крепятся задачи. У задачи есть название, описание, дата начала и конца, приоритетность, статус, заметка для статуса Blocking (уточнение почему задача заблокирована). Сейчас я пытаюсь подключить к системе разработчика, поэтому добавились поля assignee и заметки. После выполнения задача уходит ко мне на проверку и я оставляю заметки для разработчика.
В дополнение к основным таблицам у меня есть:
5. Звонки - тут, в идеале, должны фиксироваться все звонки с кратким содержанием, однако этот пункт пока еще в разработке.
6. Уведомления - напоминания о необходимости выставить счета, провести звонки и так далее.
7. Интеграция с календарем - тут я вижу все события из своего календаря.
8. Доступы - информация о доступах ко всем сервисам клиента.
9. Трекер времени - я использую трекер от Toptal. У него есть внутреннее API, которое я использую, чтобы вытащить данные по конкретному проекту. Название проектов в CRM и трекере совпадают. Таким образом я могу сравнивать суммарную оценку времени по milestones и реально затраченное время.
10. Счета - тут я храню данные о счетах. Они вяжутся к отдельной таблице с налоговыми отчетами (я подаю их каждый месяц)
Я также настроил интерфейсы для удобного управления задачами и их отображения в календаре. У разработчика есть свой интерфейс, где он видит информацию только по тем проектам, к которым он привязан.
Это все хорошо, но действительно ли оно работает, как задумано?
Я стараюсь записывать обновления по всем проектам в конце дня. Иногда я пропускаю дни, если работы очень много, но в течении нескольких дней все равно делаю ревью.
Ставьте лайк и подписывайтесь, завтра я буду пробовать новый формат и расскажу как расписать в ТЗ процесс оплаты и ничего не забыть.
Как я использовал ChatGPT за последние 2 недели:
1. Любая техническая рутина - повторные действия где нужно что-то копировать/вставлять/менять много раз/форматировать.
2. Функция для замены испанских букв на английские - политика нейминга файлов AWS запрещает ряд символов и требует нормализации для сохранения на сервер. Я не смог найти какого-то существующего решения и пришлось писать код для замены каждого символа. (Смотрите в сторону нормализации по NFC и мэтчингу символов по юникоду)
На днях я доделал проект - копия HR инструмента для поиска кандидатов. Основой является большая БД с данными профилей с Linkedin и AI поиск. В рамках этого проекта я решил ряд задач с помощью ChatGPT:
1. До этого я не делал многоуровневую фильтрацию к SQL базе и оказалось, что для этого нужно собирать сложный запрос на лету. Вместе с GPT я собрал код для учета 8 разных фильтров (каждый фильтр принимает массив значений). На стороне Bubble я собираю JSON из выбранных фильтров и отправляю его в сценарий на Make. Этот сценарий является функцией - он получает данные с помощью webhook и возвращает их через webhook response. В этом сценарии я делаю запрос к функции на Napkin и возвращаю готовый SQL запрос, который использую дальше для поиска данных в БД и возвращения их в Bubble. Полученный список кандидатов выводится в РГ.
2. Одним из параметров является степень образования (магистр, бакалавр и тд). Linkedin не имеет жесткого ограничения на ввод данных, поэтому спарсенная информация представляет из себя микс всевозможных вариантов. С помощью SQL запроса я вывел список уникальных значений и скормил его GPT. На основе этого списка он составил мне SQL запрос для нормализации данных - замена Bachelors, Bachelor и тд. на Bachelor’s Degree.
3. Одной из главных фичей является поиск кандидатов по средством общения с системой подобно ChatGPT. Для реализации этого функционала я добавил шаг обработки запроса пользователя с помощью GPT - в промпте указываются инструкции для парсинга параметров и составления JSON подобно тому, что я отсылаю на бэк при обычной фильтрации. Дальше я использую этот JSON для поиска кандидатов с помощью сценария, описанного в первом пункте.
4. Найденные кандидаты возвращаются назад в сценарий и обрабатываются с помощью еще одного запроса к GPT. Он изучает полученную информацию о кандидатах и делает им короткое описание релевантное запросу пользователя. Полученный ответ сохраняется в БД и отображается в чате. Также к ответу крепится список пользователей, который можно отобразить списком (как при фильтрации) и изучить профиль каждого кандидата отдельно.
Такая реализация AI поиска является упрощенной, относительного того, как это должно быть сделано на самом деле с векторной базой и прочими AI элементами.
_____
Небольшое лирическое отступление - куда я пропал?
Оказалось, что невозможно вести 5 проектов, постить контент три раза в неделю и чувствовать себя хорошо, поэтому у меня практически полностью кончились силы как физические, так и моральные.
Сейчас я стараюсь освободить время для себя, а также я переехал в Мексику на берег Карибского моря, что думаю способствует релаксации на пассиве.
Ставьте лайк и подписывайтесь, со следующей недели я постараюсь вернуться в обычный темп и снова делиться с вами большим количеством полезной информации.
1. Любая техническая рутина - повторные действия где нужно что-то копировать/вставлять/менять много раз/форматировать.
2. Функция для замены испанских букв на английские - политика нейминга файлов AWS запрещает ряд символов и требует нормализации для сохранения на сервер. Я не смог найти какого-то существующего решения и пришлось писать код для замены каждого символа. (Смотрите в сторону нормализации по NFC и мэтчингу символов по юникоду)
На днях я доделал проект - копия HR инструмента для поиска кандидатов. Основой является большая БД с данными профилей с Linkedin и AI поиск. В рамках этого проекта я решил ряд задач с помощью ChatGPT:
1. До этого я не делал многоуровневую фильтрацию к SQL базе и оказалось, что для этого нужно собирать сложный запрос на лету. Вместе с GPT я собрал код для учета 8 разных фильтров (каждый фильтр принимает массив значений). На стороне Bubble я собираю JSON из выбранных фильтров и отправляю его в сценарий на Make. Этот сценарий является функцией - он получает данные с помощью webhook и возвращает их через webhook response. В этом сценарии я делаю запрос к функции на Napkin и возвращаю готовый SQL запрос, который использую дальше для поиска данных в БД и возвращения их в Bubble. Полученный список кандидатов выводится в РГ.
2. Одним из параметров является степень образования (магистр, бакалавр и тд). Linkedin не имеет жесткого ограничения на ввод данных, поэтому спарсенная информация представляет из себя микс всевозможных вариантов. С помощью SQL запроса я вывел список уникальных значений и скормил его GPT. На основе этого списка он составил мне SQL запрос для нормализации данных - замена Bachelors, Bachelor и тд. на Bachelor’s Degree.
3. Одной из главных фичей является поиск кандидатов по средством общения с системой подобно ChatGPT. Для реализации этого функционала я добавил шаг обработки запроса пользователя с помощью GPT - в промпте указываются инструкции для парсинга параметров и составления JSON подобно тому, что я отсылаю на бэк при обычной фильтрации. Дальше я использую этот JSON для поиска кандидатов с помощью сценария, описанного в первом пункте.
4. Найденные кандидаты возвращаются назад в сценарий и обрабатываются с помощью еще одного запроса к GPT. Он изучает полученную информацию о кандидатах и делает им короткое описание релевантное запросу пользователя. Полученный ответ сохраняется в БД и отображается в чате. Также к ответу крепится список пользователей, который можно отобразить списком (как при фильтрации) и изучить профиль каждого кандидата отдельно.
Такая реализация AI поиска является упрощенной, относительного того, как это должно быть сделано на самом деле с векторной базой и прочими AI элементами.
_____
Небольшое лирическое отступление - куда я пропал?
Оказалось, что невозможно вести 5 проектов, постить контент три раза в неделю и чувствовать себя хорошо, поэтому у меня практически полностью кончились силы как физические, так и моральные.
Сейчас я стараюсь освободить время для себя, а также я переехал в Мексику на берег Карибского моря, что думаю способствует релаксации на пассиве.
Ставьте лайк и подписывайтесь, со следующей недели я постараюсь вернуться в обычный темп и снова делиться с вами большим количеством полезной информации.
Всем привет!
После месяца молчания я снова в строю. За этот месяц многое поменялось - я вернулся из своего 1.5 годового путешествия домой, сделал порядка 5 проектов и окончательно устал от работы.
В ближайшее время, я хочу сделать выводы на основе полученного опыта и поделиться полезными советами. А пока поделюсь небольшим лайфаком о том, как получить небольшой бонус к основному заработку - старые добрые реферальные системы.
Вариант 1:
Я зарегистрирован в Make уже более 3 лет. За это время я несколько раз делился своей реферальной ссылкой с клиентами и в чатах сообщества, когда не забывал этого делать. Суммарно по моей ссылке зарегистрировались около 40 пользователей и около 5 из них были платящими. Часть платежей застряли в Integromat и были перенесены на мой аккаунт только в октябре этого года, после чего сайт Integromat закрылся насовсем.
В итоге, месяц назад я вывел свой новогодний бонус - $470. Я думаю эта сумма могла бы быть в два раза больше, если бы я не забывал делиться ссылкой с клиентами, но все равно приятно 🙂
Многие сервисы имеют такую систему, но мало кто ею пользуется и зря. Таким же образом я накопил $80 на счету Airtable для оплаты личной подписки.
Вариант 2:
Вам не обязательно быть no-code разработчиком, чтобы зарабатывать в этой сфере. Если вы отличный продажник, то можете выстроить воронку лидогенерации для no-code агентств, которые с радостью примут ваших лидов за процент от контракта.
Месяц назад ко мне обратился клиент и в процессе общения я понял, что он чересчур активен и я не смогу с ним поладить. Я отдал этого клиента одному из участников no-code сообщества, где собираются владельцы агентств. Ребята успешно закрыли этого лида и через месяц перевели мне $200 (5% от контракта). Таким образом в выигрыше остались абсолютно все.
Какой можно сделать вывод - способов заработка достаточно много, нужно лишь понять есть ли у ваших действий сторонние выгодоприоретатели. Найдя их, смело просите награду за свои старания.
Ставьте лайк и подписывайтесь, чтобы не упустить новый сезон полезных постов.
После месяца молчания я снова в строю. За этот месяц многое поменялось - я вернулся из своего 1.5 годового путешествия домой, сделал порядка 5 проектов и окончательно устал от работы.
В ближайшее время, я хочу сделать выводы на основе полученного опыта и поделиться полезными советами. А пока поделюсь небольшим лайфаком о том, как получить небольшой бонус к основному заработку - старые добрые реферальные системы.
Вариант 1:
Я зарегистрирован в Make уже более 3 лет. За это время я несколько раз делился своей реферальной ссылкой с клиентами и в чатах сообщества, когда не забывал этого делать. Суммарно по моей ссылке зарегистрировались около 40 пользователей и около 5 из них были платящими. Часть платежей застряли в Integromat и были перенесены на мой аккаунт только в октябре этого года, после чего сайт Integromat закрылся насовсем.
В итоге, месяц назад я вывел свой новогодний бонус - $470. Я думаю эта сумма могла бы быть в два раза больше, если бы я не забывал делиться ссылкой с клиентами, но все равно приятно 🙂
Многие сервисы имеют такую систему, но мало кто ею пользуется и зря. Таким же образом я накопил $80 на счету Airtable для оплаты личной подписки.
Вариант 2:
Вам не обязательно быть no-code разработчиком, чтобы зарабатывать в этой сфере. Если вы отличный продажник, то можете выстроить воронку лидогенерации для no-code агентств, которые с радостью примут ваших лидов за процент от контракта.
Месяц назад ко мне обратился клиент и в процессе общения я понял, что он чересчур активен и я не смогу с ним поладить. Я отдал этого клиента одному из участников no-code сообщества, где собираются владельцы агентств. Ребята успешно закрыли этого лида и через месяц перевели мне $200 (5% от контракта). Таким образом в выигрыше остались абсолютно все.
Какой можно сделать вывод - способов заработка достаточно много, нужно лишь понять есть ли у ваших действий сторонние выгодоприоретатели. Найдя их, смело просите награду за свои старания.
Ставьте лайк и подписывайтесь, чтобы не упустить новый сезон полезных постов.
Как я использовал чат ChatGPT за последние 2 месяца:
1. Основной и самой сложной задачей последнего месяца был риверс инжениринг внутренного API маркетплейса Poizon. В отличии от обычных API здесь добавляется шаг с шифрованием данных и созданием уникальной подписи на основе запроса. Таким образом для понимания процесса шифрования требовались навыки JS и на рынке оценили эту задачу в $600-1000 (скорее всего можно и дешевле, но это вопрос поиска хорошего специалиста). Я не отчаялся и решил скормить все, что вижу в консоле разработчика, GPT в надежде на его силы - через полчаса у меня был готовый код для создания подписи и неприступный API был взломан.
2. Для этого же проекта мне потребовалось создать список верхнеуровневых категорий на основе 300 подкатегорий с переводом на русский. Выдавать результаты в чате GPT поленился и это потребовало бы около 10 сообщений. Решением стал небольшой сценарий в Make сохранением данных в Airtable. Не забудьте переключить модель в API запросах на новую 1106-preview, так как она стоит в 2 раза меньше.
3. Схожую задачу категоризации я решил на соседнем проекте, где на основе неструктурированных данных из Linkedin требовалось выбрать уровень образования кандидата из фиксированного списка (bachelor, masters and etc)
4. Вместе с GPT я обновил проекты и портфолио на Upwork - зацените какая теперь красота.
5. На одном небольшом проекте я сделал финансовый дашборд и для тестирования формул основных метрик я сгенерировал десятки различных платежей, которыми заполнил базу.
6. На волне хайпа кастомных GPT я пробовал создать свой GPT на основе 2ух книг от Amliesolutions по оптимизации и безопасности в Bubble. Результат можете оценить сами.
Ставьте лайк и подписывайтесь, впереди много полезного контента.
1. Основной и самой сложной задачей последнего месяца был риверс инжениринг внутренного API маркетплейса Poizon. В отличии от обычных API здесь добавляется шаг с шифрованием данных и созданием уникальной подписи на основе запроса. Таким образом для понимания процесса шифрования требовались навыки JS и на рынке оценили эту задачу в $600-1000 (скорее всего можно и дешевле, но это вопрос поиска хорошего специалиста). Я не отчаялся и решил скормить все, что вижу в консоле разработчика, GPT в надежде на его силы - через полчаса у меня был готовый код для создания подписи и неприступный API был взломан.
2. Для этого же проекта мне потребовалось создать список верхнеуровневых категорий на основе 300 подкатегорий с переводом на русский. Выдавать результаты в чате GPT поленился и это потребовало бы около 10 сообщений. Решением стал небольшой сценарий в Make сохранением данных в Airtable. Не забудьте переключить модель в API запросах на новую 1106-preview, так как она стоит в 2 раза меньше.
3. Схожую задачу категоризации я решил на соседнем проекте, где на основе неструктурированных данных из Linkedin требовалось выбрать уровень образования кандидата из фиксированного списка (bachelor, masters and etc)
4. Вместе с GPT я обновил проекты и портфолио на Upwork - зацените какая теперь красота.
5. На одном небольшом проекте я сделал финансовый дашборд и для тестирования формул основных метрик я сгенерировал десятки различных платежей, которыми заполнил базу.
6. На волне хайпа кастомных GPT я пробовал создать свой GPT на основе 2ух книг от Amliesolutions по оптимизации и безопасности в Bubble. Результат можете оценить сами.
Ставьте лайк и подписывайтесь, впереди много полезного контента.
Как использовать Option sets в Bubble
Я замечаю, что многие практики разработки, которые давно стали для меня обыденностью, являются непознанными для других разработчиков. Скорее всего и я упускаю какие-то best practice, которые бы помогли мне в работе. С этой целью я буду потихоньку разбирать различные части рабочих инструментов и приглашаю вас к обсуждению и обмену опытом.
Начнем с теории, которую вы можете найти в официальной документации:
1. Данные из Option sets подгружаются на сторону пользователя вместе с загрузкой страницы, а значит там не стоит хранить чувствительную информацию.
2. Хоть эти данные и сохраняются в кэше пользователя до следующего деплоя, не стоит держать там длинных списков, чтобы не замедлять загрузку страницы.
3. Однако, даже если вы и захотите загрузить туда большой список, вам придется постараться, так как записи загружаются туда по одной вручную из панели разработчика, что делает этот функционал непригодным для типа данных, который может изменяться пользователями.
4. Как и в БД, к основной колонке Display вы можете добавить дополнительные аттрибуты (колонки). Их возможно поменять только открыв детали конкретной записи.
5. Аттрибут может иметь один из стандартных типов данных либо являться ссылкой на другой Option set. Ссылаться на таблицы из БД нельзя. Сам Options set может быть выбран как тип данных в API и SQL connector’ах, backend workflows и БД.
6. Значения Display могут быть неуникальными, поэтому нужно быть осторожным при создании списка и проверять на дубликаты.
7. Для изменения списка в Live потребуется деплой.
А вот что я успел понять об Option sets:
1. Иногда требуется загрузить длинный список значений (области страны). Для bulk загрузки можно использовать плагин, но работает он не совсем стабильно и не имеет возможности загружать аттрибуты.
2. Основные кейсы, когда я использую Option sets - статусы, опции для dropdown (области, должности, категории и тд), страницы приложения (menu, submenu), алерты.
3. Аттрибуты я использовал для перевода статусов на русский (в БД всегда англ), для сохранения порядкового номера (и дальнейшей сортировке на фронте), для динамических цветов тега.
4. Почему то так сложилось, что моя нейминговая конвенция для Options sets - start case (каждое слово с большой буквы).
А как вы используете Option sets?
___
Не забывайте ставить лайк и подписываться на канал, это мотивирует меня делать больше интересного контента
Я замечаю, что многие практики разработки, которые давно стали для меня обыденностью, являются непознанными для других разработчиков. Скорее всего и я упускаю какие-то best practice, которые бы помогли мне в работе. С этой целью я буду потихоньку разбирать различные части рабочих инструментов и приглашаю вас к обсуждению и обмену опытом.
Начнем с теории, которую вы можете найти в официальной документации:
1. Данные из Option sets подгружаются на сторону пользователя вместе с загрузкой страницы, а значит там не стоит хранить чувствительную информацию.
2. Хоть эти данные и сохраняются в кэше пользователя до следующего деплоя, не стоит держать там длинных списков, чтобы не замедлять загрузку страницы.
3. Однако, даже если вы и захотите загрузить туда большой список, вам придется постараться, так как записи загружаются туда по одной вручную из панели разработчика, что делает этот функционал непригодным для типа данных, который может изменяться пользователями.
4. Как и в БД, к основной колонке Display вы можете добавить дополнительные аттрибуты (колонки). Их возможно поменять только открыв детали конкретной записи.
5. Аттрибут может иметь один из стандартных типов данных либо являться ссылкой на другой Option set. Ссылаться на таблицы из БД нельзя. Сам Options set может быть выбран как тип данных в API и SQL connector’ах, backend workflows и БД.
6. Значения Display могут быть неуникальными, поэтому нужно быть осторожным при создании списка и проверять на дубликаты.
7. Для изменения списка в Live потребуется деплой.
А вот что я успел понять об Option sets:
1. Иногда требуется загрузить длинный список значений (области страны). Для bulk загрузки можно использовать плагин, но работает он не совсем стабильно и не имеет возможности загружать аттрибуты.
2. Основные кейсы, когда я использую Option sets - статусы, опции для dropdown (области, должности, категории и тд), страницы приложения (menu, submenu), алерты.
3. Аттрибуты я использовал для перевода статусов на русский (в БД всегда англ), для сохранения порядкового номера (и дальнейшей сортировке на фронте), для динамических цветов тега.
4. Почему то так сложилось, что моя нейминговая конвенция для Options sets - start case (каждое слово с большой буквы).
А как вы используете Option sets?
___
Не забывайте ставить лайк и подписываться на канал, это мотивирует меня делать больше интересного контента
Если клиент просит добавить фичу (за деньги), которая заведомо не имеет продуктовой значимости, основана на чистом желании клиента и не будет использоваться, вы добавите ее не обсуждая или попытаетесь доказать, что она не нужна?
Почему? (мотивация может быть разной - деньги, время, принципы и тд)
Почему? (мотивация может быть разной - деньги, время, принципы и тд)
Сегодня я поделюсь лайфхаками по работе с Supabase, которые я узнал, пока автоматизировал многоступенчатый процесс лизинга для мексиканской компании.
1️⃣ Вы можете создать базу через интерфейс, но мне больше нравится описывать вместе с ChatGPT запросы на создание нужных таблиц и просто запускать их во вкладке SQL Editor.
CREATE TABLE public.log_types (
id uuid NOT NULL DEFAULT gen_random_uuid(),
type_name TEXT NOT NULL,
CONSTRAINT log_types_pkey PRIMARY KEY (id)
) TABLESPACE pg_default;
2️⃣Немного о первичном ключе:
- Каждая запись должна иметь уникальный идентификатор, иначе вы не сможете изменять или удалять их.
- Для первичного ключа я использую поле с типом uuid и автоматической генерацией через дефолтное значение - gen_random_uuid(). Можно выбрать порядковую нумерация начиная с 1, но мне такой вариант не подошел, ведь при использовании этого id в ссылке пользователь сможет заменить его на другой и посмотреть чужую запись.
- Если вы ошиблись и хотите поменять тип Primary поля, то вам придется сделать несколько действий - для начала вам нужно снять галочку с текущего поля и сохранить таблицу, только после этого вы сможете выбрать новое поле.
3️⃣ Для разных типов данных можно использовать разные типы поля. Вы можете использовать для текста один и тот же тип text, а можете варьировать тип в зависимости от размера данных, которые собираетесь там хранить. Каждый из типов резервирует в базе определенный размер памяти, поэтому если вы собираетесь делать большой и масштабируемый проект, есть смысл задумываться над типом каждого поля.
- Varchar - короткий текст
- Text - длинный текст
- Timestamptz - дата с временем и таймзоной
- Int8 - для целых чисел
- Float8 - для чисел с точкой
- Bool - для логических переменных
- JSON - для хранения объектов
4️⃣ У поля можно выбрать дефолтное значение - удобно выставлять текущую дату или дефолтный статус.
5️⃣ Вы можете настроить поле с ссылкой на другую таблицу (значок ссылки). Для этого нужно будет выбрать таблицу и нужное поле (uuid). В настройке “Action if referenced row is removed” следует выбрать поведение базы при удалении референса, иначе при удалении записи и наличии связи база выдаст ошибку.
- Cascade - удалить связанные записи
- No action - ничего не делать, но вызывает ошибку
- Set default/NULL - выставить дефолтное/NULL значение (выбрайте это, если не знаете что лучше)
6️⃣ Все типы полей могут быть массивами (значок шестеренки - Set as Array). Однако, ссылки на другие таблицы не поддерживают массивы. Для хранения массива ссылок на другую таблицу следует убрать связь и хранить данные как массив uuid/text.
7️⃣ Не стоит забывать про нейминг таблиц и полей. Я использую snake_case конвенцию, а ссылки на другие таблицы обозначаю как entity_id.
8️⃣ Файлы хранятся отдельно в storage и вызываются/сохраняются по пути файла через API (название папок/название файла.расширение). Каждый файл я храню в отдельной папке пользователя (название - user_id), сами папки хранятся в папке сущности (users). В отдельной таблице в БД хранятся файлы с названием и полным путем до файла в storage (users/user_id/filename.txt).
9️⃣ Для получения временной ссылки на файл (удобно для просмотра) нужно сначала запросить url с помощью запроса https://yourbase.supabase.co/storage/v1/object/sign/file_storage/[filepath] : JSON body {"expiresIn": 600}. Далее эту ссылку можно использовать с префиксом https://yourbase.supabase.co/storage/v1
Данные советы могут содержать неточности и основаны лишь на моем опыте. Также для простоты я использую мастер-ключ для API запросов к базе (получение файлов), что является плохой практикой. Каждый пользователь должен быть создан в Supabase, данные должны быть привязаны к пользователю и для запросов к API нужно использовать токен пользователя, чтобы ограничить доступ к другим файлам.
Ставьте лайк и подписывайтесь, в следующей части мы разберем лайфхаки подключения SQL к Bubble
1️⃣ Вы можете создать базу через интерфейс, но мне больше нравится описывать вместе с ChatGPT запросы на создание нужных таблиц и просто запускать их во вкладке SQL Editor.
CREATE TABLE public.log_types (
id uuid NOT NULL DEFAULT gen_random_uuid(),
type_name TEXT NOT NULL,
CONSTRAINT log_types_pkey PRIMARY KEY (id)
) TABLESPACE pg_default;
2️⃣Немного о первичном ключе:
- Каждая запись должна иметь уникальный идентификатор, иначе вы не сможете изменять или удалять их.
- Для первичного ключа я использую поле с типом uuid и автоматической генерацией через дефолтное значение - gen_random_uuid(). Можно выбрать порядковую нумерация начиная с 1, но мне такой вариант не подошел, ведь при использовании этого id в ссылке пользователь сможет заменить его на другой и посмотреть чужую запись.
- Если вы ошиблись и хотите поменять тип Primary поля, то вам придется сделать несколько действий - для начала вам нужно снять галочку с текущего поля и сохранить таблицу, только после этого вы сможете выбрать новое поле.
3️⃣ Для разных типов данных можно использовать разные типы поля. Вы можете использовать для текста один и тот же тип text, а можете варьировать тип в зависимости от размера данных, которые собираетесь там хранить. Каждый из типов резервирует в базе определенный размер памяти, поэтому если вы собираетесь делать большой и масштабируемый проект, есть смысл задумываться над типом каждого поля.
- Varchar - короткий текст
- Text - длинный текст
- Timestamptz - дата с временем и таймзоной
- Int8 - для целых чисел
- Float8 - для чисел с точкой
- Bool - для логических переменных
- JSON - для хранения объектов
4️⃣ У поля можно выбрать дефолтное значение - удобно выставлять текущую дату или дефолтный статус.
5️⃣ Вы можете настроить поле с ссылкой на другую таблицу (значок ссылки). Для этого нужно будет выбрать таблицу и нужное поле (uuid). В настройке “Action if referenced row is removed” следует выбрать поведение базы при удалении референса, иначе при удалении записи и наличии связи база выдаст ошибку.
- Cascade - удалить связанные записи
- No action - ничего не делать, но вызывает ошибку
- Set default/NULL - выставить дефолтное/NULL значение (выбрайте это, если не знаете что лучше)
6️⃣ Все типы полей могут быть массивами (значок шестеренки - Set as Array). Однако, ссылки на другие таблицы не поддерживают массивы. Для хранения массива ссылок на другую таблицу следует убрать связь и хранить данные как массив uuid/text.
7️⃣ Не стоит забывать про нейминг таблиц и полей. Я использую snake_case конвенцию, а ссылки на другие таблицы обозначаю как entity_id.
8️⃣ Файлы хранятся отдельно в storage и вызываются/сохраняются по пути файла через API (название папок/название файла.расширение). Каждый файл я храню в отдельной папке пользователя (название - user_id), сами папки хранятся в папке сущности (users). В отдельной таблице в БД хранятся файлы с названием и полным путем до файла в storage (users/user_id/filename.txt).
9️⃣ Для получения временной ссылки на файл (удобно для просмотра) нужно сначала запросить url с помощью запроса https://yourbase.supabase.co/storage/v1/object/sign/file_storage/[filepath] : JSON body {"expiresIn": 600}. Далее эту ссылку можно использовать с префиксом https://yourbase.supabase.co/storage/v1
Данные советы могут содержать неточности и основаны лишь на моем опыте. Также для простоты я использую мастер-ключ для API запросов к базе (получение файлов), что является плохой практикой. Каждый пользователь должен быть создан в Supabase, данные должны быть привязаны к пользователю и для запросов к API нужно использовать токен пользователя, чтобы ограничить доступ к другим файлам.
Ставьте лайк и подписывайтесь, в следующей части мы разберем лайфхаки подключения SQL к Bubble
В no-code возможно зарабатывать $5-10 тыс./мес.
Какого уровня дохода вам хотелось бы достичь в следующем году? Как вы думаете, какие скиллы вам нужно для этого подтянуть?
Какого уровня дохода вам хотелось бы достичь в следующем году? Как вы думаете, какие скиллы вам нужно для этого подтянуть?
Как сделать не виснующее ноукод приложение с БД в 1000000 строк?
Продолжаем говорить о SQL и сегодня разберем полезные советы о работе с SQL в Bubble.
Ранее я уже делал ряд постов об этом, поэтому не будем повторяться и посмотрим новые инсайты.
1️⃣ Для подключение к Supabase устанавливаем плагин SQL Connector и берем креды из Settings - Database. Далее формируем строку для плагина - postgres://User:Password@Host:Port/Database.
- Пример: postgres://postgres:YGe24reS51Sba@db.ekgfdgwertwerajnwqw.supabase.co:5432/postgres
2️⃣ Работая с большим объемом данных не обойтись без пагинации - ее можно сделать с помощью OFFSET и переменной ($1). Для показа следующей “страницы” добавьте к переменной число, указанное у вас в LIMIT. При пагинации обязательна сортировка данных, чтобы БД точно понимать какие именно записи идут следующими.
- ORDER BY created_date DESC LIMIT 200 OFFSET $1;
3️⃣ Переменные в запросах:
- При составлении запроса заранее задумайтесь о переменных, которые вы будете использовать в нем. Если вы захотите удалить переменную, то порядок всех остальных переменных сместиться, поэтому лучше просто заменять ненужную переменную на последнюю в списке.
- Если вам нужно сделать запрос для поиска с различными фильтрами (переменными), которые могут быть пустыми, добавьте в условие проверку переменной - $1 IS NULL. Примеры условий для разных типов:
- - Текстовая переменная - (status LIKE '%' $1 '%' OR $1 IS NULL)
- - Числовая переменная - (telegram_id = $1 OR $1 IS NULL)
- - Массив - school_name = ANY(ARRAY[$1] OR $1 IS NULL) - $1=‘Harvard,Stanford’
- Если у вас есть проблемы с типом данных на стороне Bubble, смените тип переменной в SQL - $1::text или $1::int
4️⃣ Не бойтесь SQL, за меня на нем пишет ChatGPT. Даже 3.5 версии достаточно скормить структуру ваших таблиц (Table - Definition) и он сам напишет все нужные запросы за вас.
🔥Совет со звездочкой для самых-самых:
Кейс - я хочу выбрать из списка заказ и показать детали этого заказа.
Источником данных для карточки деталей заказа я использую выбранную запись из общего списка заказов, который основан на запросе get_orders. Тут нет проблем - жмем на заказ и используем This get_orders.
Но каждый запрос воспринимается как отдельный тип данных. Если я хочу из карточки счета перейти в заказ мне нужно либо использовать отдельный запрос get_this_order, либо брать весь список заказов и фильтровать его на стороне клиента, чтобы получить данные по конкретному заказу.
Первый способ вернет другой типа данных, который нельзя использовать для карточки товара (у нас там все завязано на get_orders). Второй же способ небезопасен (так как грузятся все данные на сторону клиента) и неэффективен (это может занять очень много времени). Что же делать?
Мы делаем универсальный запрос get_orders, куда добавляем еще один фильтр id=$1. Проблема в том, что UUID это жесткий 32 символьный формат и при попытке отправки пустой строки вы получите ошибку ($1 IS NULL тоже не поможет). Для обхода этой проблемы мы заменяем дефолтное пустое значение на валидный UUID и меняем условие. (id = $4 OR $4= '00000000-0000-0000-0000-000000000000’)
Спасибо вам, за то что читали мой блог весь этот год. ❤️🔥
Поздравляю всех с наступающим Новым Годом🎄, ставьте лайки и подписывайтесь, в следующем году дело примет серьезные обороты!
Продолжаем говорить о SQL и сегодня разберем полезные советы о работе с SQL в Bubble.
Ранее я уже делал ряд постов об этом, поэтому не будем повторяться и посмотрим новые инсайты.
1️⃣ Для подключение к Supabase устанавливаем плагин SQL Connector и берем креды из Settings - Database. Далее формируем строку для плагина - postgres://User:Password@Host:Port/Database.
- Пример: postgres://postgres:YGe24reS51Sba@db.ekgfdgwertwerajnwqw.supabase.co:5432/postgres
2️⃣ Работая с большим объемом данных не обойтись без пагинации - ее можно сделать с помощью OFFSET и переменной ($1). Для показа следующей “страницы” добавьте к переменной число, указанное у вас в LIMIT. При пагинации обязательна сортировка данных, чтобы БД точно понимать какие именно записи идут следующими.
- ORDER BY created_date DESC LIMIT 200 OFFSET $1;
3️⃣ Переменные в запросах:
- При составлении запроса заранее задумайтесь о переменных, которые вы будете использовать в нем. Если вы захотите удалить переменную, то порядок всех остальных переменных сместиться, поэтому лучше просто заменять ненужную переменную на последнюю в списке.
- Если вам нужно сделать запрос для поиска с различными фильтрами (переменными), которые могут быть пустыми, добавьте в условие проверку переменной - $1 IS NULL. Примеры условий для разных типов:
- - Текстовая переменная - (status LIKE '%' $1 '%' OR $1 IS NULL)
- - Числовая переменная - (telegram_id = $1 OR $1 IS NULL)
- - Массив - school_name = ANY(ARRAY[$1] OR $1 IS NULL) - $1=‘Harvard,Stanford’
- Если у вас есть проблемы с типом данных на стороне Bubble, смените тип переменной в SQL - $1::text или $1::int
4️⃣ Не бойтесь SQL, за меня на нем пишет ChatGPT. Даже 3.5 версии достаточно скормить структуру ваших таблиц (Table - Definition) и он сам напишет все нужные запросы за вас.
🔥Совет со звездочкой для самых-самых:
Источником данных для карточки деталей заказа я использую выбранную запись из общего списка заказов, который основан на запросе get_orders. Тут нет проблем - жмем на заказ и используем This get_orders.
Но каждый запрос воспринимается как отдельный тип данных. Если я хочу из карточки счета перейти в заказ мне нужно либо использовать отдельный запрос get_this_order, либо брать весь список заказов и фильтровать его на стороне клиента, чтобы получить данные по конкретному заказу.
Первый способ вернет другой типа данных, который нельзя использовать для карточки товара (у нас там все завязано на get_orders). Второй же способ небезопасен (так как грузятся все данные на сторону клиента) и неэффективен (это может занять очень много времени). Что же делать?
Мы делаем универсальный запрос get_orders, куда добавляем еще один фильтр id=$1. Проблема в том, что UUID это жесткий 32 символьный формат и при попытке отправки пустой строки вы получите ошибку ($1 IS NULL тоже не поможет). Для обхода этой проблемы мы заменяем дефолтное пустое значение на валидный UUID и меняем условие. (id = $4 OR $4= '00000000-0000-0000-0000-000000000000’)
Спасибо вам, за то что читали мой блог весь этот год. ❤️🔥
Поздравляю всех с наступающим Новым Годом🎄, ставьте лайки и подписывайтесь, в следующем году дело примет серьезные обороты!
Telegram
.DEV | No/low-code agency
Недавно мы сделали интеграцию между Bubble и AWS RDS и хотели бы поделиться с вами ценными советами, которые мы не смогли найти в Интернете.
Совет дня (Bubble — SQL-запрос):
Используйте NULLIF($1, '') в запросах UPDATE/INSERT, чтобы избежать пустых текстовых…
Совет дня (Bubble — SQL-запрос):
Используйте NULLIF($1, '') в запросах UPDATE/INSERT, чтобы избежать пустых текстовых…