Когда я забеременела вторым ребенком в 2022-ом, продемонстрировала, счастливая, мужу тест с двумя яркими красными полосками, муж сказал:
- Мне нужен психолог!
А дочь из комнаты крикнула:
- Ноги его в моей комнате не будет!
- Ну что ж, у меня самое чуткое и понимающее семейство в мире! - восторженно сказала я и стала обнимать собаку. - Скуленька, а ты-то рада?!
Но на одном понимании Скули не выедешь - необходимо было расширяться. И стала я проектировать пристройку к дому со стороны входа.
Пристройка состоит из открытой веранды на первом этаже (потому что там уже вход в дом и окно из кухни, и застраивать все это крытыми помещениями было не вариантом), и на ней два помещения: детская для нового члена семьи и санузел.
Идея построить санузел на втором этаже у нас у всех вообще была уже давно. Потому что было две спальни на втором, и ночью спускаться вниз каждый раз по нужде (да и в душ тоже) было крайне неудобно. Только куда его пихать?
Были у меня мысли встроить унитаз на лестничном проеме аккуратно, чтоб не мешал проходу, и чтоб открытию-закрытию дверей тоже не мешал, но это было не реально! Он бы все равно встал так, чтоб через него надо было бы перешагивать, выходя и заходя как из нашей комнаты, так и из комнаты дочери. Сооружали мы временно подвесной рукомойник в спальне, но все это было не то! Я мечтала о большой ванной комнате с зеркалом, ванной, часами, подсветками и прочими радостями. И беременность подтолкнула к мечте решительно!
Только где проектировать вход в санузел? Второй этаж получается весь трамвайного типа! Поднимаешься по лестнице: направо к дочери, налево к нам. Все! Иных проходов нет. Пристройку для санузла и детской я разделила ровно на две части, детская примыкает к нашей спальне, санузел - формально к дочериной, но наша комната шире дочериной, поэтому стена санузла захватывает обе спальни. И получается, что оба входа - и в новую детскую, и в санузел - будут из нашей спальни! А если б даже и были бы наши две спальни по ширине одинаковые, и санузел строго примыкал бы только к дочериной комнате, все равно не удобно было бы нам всем ходить в санузел через дочь! Это издевательство было бы над ней. А так дочери бегать через нас? Ага!... А потом сын подрастет и тоже будет бегать через нас в туалет! (Мало того, что просто проход в его комнату через нас) Никакой личной жизни?!
Вот поэтому я и не стала мелочиться: я спроектировала вход в санузел из КАЖДОЙ спальни! И из нашей, и из дочериной, и из новостроеной комнаты сына!
Когда я все это рисовала и показывала строителям, они удивились:
- Это что вы все вот так здесь по кругу ходить будете, что ли?!
Ага. Зашли в дочерину комнату, прошли в санузел, зашли из него к сыночку, вышли к нам в спальню и пошли обратно к дочери. Все взялись за руки и ходим! Делать нам больше нечего... Как же они не поняли мою гениальную задумку?! Мой СУПЕР-ПРОЕКТ!... Недооцененный.
А дочь с мужем до сих пор ржут надо мной! Потому что это наглядная демонстрация data race: точку доступа открыли трем потокам, а мьютексы на чтение и запись поставить забыли! Тут или пул бюрократии, чтобы сходить поссать: сначала надо постучать и запросить разрешение на транзакцию (не ссыт ли кто в данный момент?), затем отправить всем трем потокам пуш-уведомление (шпингалеты или таблички) о том, что в данный момент идет активная транзакция, потом не забыть отправить обратные пуш-уведомления (три таблички снять или разблокировать шпингалеты), что транзакция завершена, можно заходить другому потоку, или будут дед-локи (например дочь три шпингалета закрыла, а потом открыла только свой, и в туалет, кроме как через ее комнату, больше никому не попасть), или та самая дата-рейс!
Тут доработать-то... Что два пальца об асфальт!
Варианты решения
Общий мьютекс. mutex.lock(), mutex.unlock(). Ну просто шпингалетики ставим и троссиками их соединяем! Делов-то? Закрываешь один шпингалет, троссики натягиваются, шестеренки шуршат, и закрываются остальные! А Ганс Форальберг нервно курит в сторонке.
Обернуть наш сортир в std::atomic. Ну унитаз и так атомарен по определению, в него не могут физически посрать два человека одновременно. Осталось разобраться с ванной, с раковиной... Как-то сделать их неделимыми вместе с унитазом! Например тройной клапан подачи воды и слива: перекрывает все так, что слив и вода свободны либо только для унитаза, либо только для раковины, либо только для ванны. Тогда нарушить атомарность не будет ни для кого никакого стимула! Все будут об этом помнить... Делов-то?
Спинлок в виде закольцованых датчиков под ковриками, которые подают сигнал и зажигают индикаторы красным в каждой комнате! (Желательно бы еще блокировать магнитными полями все двери).
std::queque. Вывесить табло электронной очереди перед пристройкой. Автоинформатор на весь этаж: «Талон с номером А4, пройдите к унитазу!»
И так как нам бюрократией заниматься лень, то у нас конечно же дата-рейс! Все двери открыты, ни шпингалетов, ни табличек, ни красно-зеленых световых индикаторов "занято\свободно", ни талонов МФЦ нет. Поэтому периодически у нас (если все дома) раздается или мужнино "Я сру! Сюда идти не надо!", или дочерин визг из ванны, а за ним визг домработницы, которая зашла помыть помещение, не постучав, или мое грозное "Ну кто опять убрал пандус?!"
Странно, и почему же надо мной вся семья ржет? Ведь я гениальный архитектор!
Всем доброго времени суток! На канале Лекторий ФПМИ (YouTube) был прекрасный курс Concurrency с лекциями и семинарами за авторством Липовского Р. Г. 2022 г, в котором прекрасно объяснялись темы по использованию возможностей C++ для многопоточного и асинхронного исполнения программ. Хотел на новогодних каникулах подтятуть знания, но к сожалению видео с канала были удалены. Возможно, у кого-то есть резервные копии видео, прошу поделиться. Всем полезных новогодних праздников!
Параллельность - выполнение задач в один момент времени на разных логических ядрах.
Конкурентность - выполнение задач последовательно, но со сменой контекста на другую задачу в ожидание завершения иной задачи. У пользователя может возникнуть иллюзия многозадачности даже в однопроцессорной системе, поскольку смена контекста происходит быстро (микросекунды).
Процессы:
Раздельная память
Раздельные ресурсы
Раздельные регистры
Потоки:
Общая память
Общие ресурсы
Раздельные стэк и регистры
Горутины:
Общая память
Общие ресурсы
Общий системный стэк
Общие регистры
Go runtime представляет модель P:M:G.
P - представляет логическое ядро процессора.
M - поток ОС по числу процессоров P.
G - структура, которая выполняет переданную функцию, создаётся по необходимости, минимум одна на старте программы (main). Стэк всего 2кб, может расширятся до 1гб для 64x и до 250кб для 32х систем.
Управление горутинами осуществляется планировщиком Go, а не ОС. Планировщик Go работает в пользовательском пространстве. Мы не можем напрямую управлять на каком процессоре будет исполняться горутина, за это отвечает планировщик.
Канал - очередь сообщений, которая умеет работать в многопоточной среде, работает по принципу FIFO.
Есть два типа каналов: буферизованный и небуферизованный.
Первый может хранить несколько сообщений, второй только одно.
Синхронизация
sync.WaitGroup - счётчик, который позволяет подождать завершения горутин.
sync.Mutex - блокирует доступ к ресурсу.
sync.RwMutex - разделяемая блокировка на чтение и запись. Читать могут несколько горутин, но мутировать данные только одна.
sync.Atomic - атомарная операция чтения и записи. Работает только с простыми значениями.
sync.Map - lock-free структура. Работает так же, как и обычная map, но потокобезопасная, можно использовать в многопоточной среде. Хорошо подходит для случаев, где надо много читать и мало писать. Если надо много писать, то лучше использовать обычную map и sync.RwMutex.
Небуферизованный канал
Буферизованный канал
Ограничения канала
Важные правила
Закрывает канал тот, кто в него пишет.
Если пишет несколько продюсеров, то закрывает тот, кто создал продюсеров.
Не закрытый канал держит ресурсы. Закрывать надо явно.
Паттерны
Generator
Микропаттерн, который наполняет канал. Закрываем канал, чтобы не было проблем.
func generator() <- chan int {
ch := make(chant int)
go func(){
for i := 0; i <= 12; i++ {
ch <- i + 1
}
close(ch)
}()
return ch
}
Wrapper
Оборачиваем функцию, добавляя функциональность. Если вам что-то говорит слово декоратор, то это тот самый паттерн.
time.Sleep(1 * time.Second) // время на завершение
}
2. WithTimeout
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) // спустя 2 секунды воркер перестанет работать
3. WithDeadline. Можно указать точное время остановки.
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(2*time.Second)) // прибавляем к текущему времени две секунды
Worker Pool
Каждый воркер берёт задачу, делает работу и отправляет результат в канал, другая горутина, в нашем случае main, читает результат из канала.
func worker(jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
for j := range jobs {
time.Sleep(1 * time.Second)
fmt.Println("job", j)
results <- j * j
}
}
func main() {
jobs := make(chan int)
results := make(chan int)
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go worker(jobs, results, &wg)
}
go func() {
for i := 0; i < 10; i++ {
jobs <- i
}
close(jobs)
}()
go func() {
wg.Wait()
close(results)
}()
for result := range results {
fmt.Println(result)
}
}
Actor model
Паттерн, при котором акторы общаются только через каналы, и меняют данные только через каналы.
type message struct {
amount int
response chan int
}
func counter(messages chan message) {
for m := range messages {
m.response <- m.amount + 1
close(m.response)
}
}
func main() {
messages := make(chan message)
var wg sync.WaitGroup
go counter(messages)
wg.Add(3)
for i := 0; i < 3; i++ {
go func(i int) {
defer wg.Done()
response := make(chan int)
messages <- message{amount: i, response: response}
fmt.Println(<-response)
}(i)
}
wg.Wait()
close(messages)
}
Это не все паттерны, их целая куча, но уже с этими можно делать интересные вещи, такие как балансировщики нагрузки, pub/sub системы, очереди задач, rate limiter и много всего другого.
В апреле 2023 года мы запустили необычный для нас проект - ремонтный сервис нового формата. Первого клиента нашли только в начале лета, но уже с первого проекта удалось достичь запланированной прибыли. Расскажу, как мы создали современную компанию для поколения "новых денег", которые не готовы к тому, что прораб будет класть половину стоимости ремонта себе в карман, а сроки растягиваются без ограничений и почему это оказалось прибыльным бизнесом.
Как всё начиналось
Конец 2022 года. Я работал менеджером проектов в крупной IT-компании, мой друг Антон - тимлидом в другой известной технологической компании, а Дима занимал позицию backend-разработчика в третьей. У всех стабильные зарплаты, интересные проекты - жизнь шла своим чередом, пока Антон не решил купить квартиру в новостройке.
После долгих поисков он остановился на 85-метровой квартире в ЖК около метро Саларьево - современный комплекс с подземным паркингом и зелёным двором. Как типичный программист, к поиску ремонтников он подошёл педантично: изучил десятки предложений, провёл собеседования с кандидатами. В итоге выбрал бригаду с Авито с "15-летним опытом работы".
Денис (это я:) - один из создателей сервиса
За время ремонта у Антона мы с Димой часто приезжали к нему - помочь, посоветовать, и просто поржать над очередными косяками строителей. У нас обоих за плечами был серьёзный опыт управления командами, внедрения процессов, автоматизации и контроля качества. И знаете что? Нам казалось, что главное в ремонтном бизнесе - это грамотный менеджмент и организация процессов. И на самом деле, все примерно так и есть.
День когда мы решились
Если честно, мысли о собственной ремонтной компании появились у нас задолго до этого случая. В IT-тусовке часто шутят, что в России есть три верных пути: вебкам, айти и стройка. И мы, насмотревшись на хаос в ремонтной сфере, не раз обсуждали возможность открытия своей “фирмы”.
Мы выделили основные проблемы, которые должны были исправить с помощью своего сервиса
Первое - это постоянно растущие сметы и "задранная стоимость" на работы. Ну вы серьезно? Почему для меня ремонт в квартире должен чем-то отличаться от заказа носков на Вайлдберриз? Почему-то там нет такого, что цена носков может вырасти в 2 раза за время доставки. А тут начальная смета в 1 миллион превратилась почти в 1,7! И каждый раз это "ой, тут стены кривые", "ой, а тут придется докупить", "ой, а это мы не учли".
Второе - это бесконечно растущие сроки. Это еще хуже. Как люди с опытом в менеджменте, мы прекрасно знали, что растущие сроки – это всегда раздолбайство управления и ленивые рабочие. Но тут было чуть посложнее, об этом чуть позже. У Антона обещали сделать за 4 месяца, а в итоге растянули на 8.
Третье - хитрые прорабы. Это вообще отдельная история. Когда прораб говорит "давайте я сам закуплю материалы, у меня скидки", знайте - он накинет сверху процентов 30-40. А еще есть "срочные работы", которые почему-то не были учтены в смете. И конечно, вечная классика - экономия на материалах: заказываешь одно, а привозят что-то попроще, но по той же цене.
Целевая аудитория
А параллельно с этим мы определили нашу целевую аудиторию. Чтобы выделиться на конкурентном рынке, мы решили ориентироваться на молодых IT-специалистов и представителей “современных” профессий, живущих в Москве в возрасте 30-40 лет. Тех, кто покупает квартиру в новостройке и привыкших к хорошему сервису. Кто не готов, что его будут водить за нос и разводить на деньги.
Что с ценой?
При этом очень важно было держать цены НИЖЕ, чем у других компаний, иначе на рынке просто не выжить. В премиум сегмент нужен "пропуск" в виде большого количества работ для определенного типа клиентов, поэтому нам было понятно, что "брать" много - пока что, непозволительно. Но мы нашли способ: автоматизация процессов, прямые поставки материалов, четкое планирование работ и никаких скрытых накруток. Но несбыточной мечтой это покажется только обывателю: на самом деле сервис и правда должен быть таким, вообще любой.
История первого заказа летом 2023 года
А теперь самое интересное - наш первый заказ. Это была отдельная эпопея. Начало лета 2023, звонок от потенциального клиента.
Первый клиент оказался прямо "в яблочко" - тоже айтишник (пришедший из первой контекстной рекламы в яндексе запущенной на 20 тыс.), работал в крупной компании, купил двушку в панельке 80-х годов. Причем достаточно убитую - стены местами с дырками, старый паркет, трубы помнящие еще Горбачева... Но нам, если честно, даже повезло что первый объект был не новостройкой. На старом фонде учиться легче - там хотя бы есть на что посмотреть, в отличие от новостроек, где все "сюрпризы" спрятаны в голых стенах.
Дырка в стене была ДО демонтажа. Клиент купил квартиру с "убитым" ремонтом подешевле, в надежде сэкономить
Как мы мастеров искали
Начали с поиска бригады. Вот тут был первый холодный душ - оказалось, что найти классных специалистов без своей наработанной базы очень сложно. Мастера хорошего уровня либо уже при деле, либо просят космос. А те, кто сразу соглашается - ну, вы понимаете. За две недели провели больше 10 собеседований (назовем их так😊). Причем процесс собеседования мы сразу сделали "как в айти" - тестовые задания, проверка портфолио, разбор технологий работы. Бригадиры были в шоке - некоторые прямо уходили с собеседований, когда мы начинали распрашивать про технологии укладки плитки и показывали фотографии косяков с объектов с форумов.
В итоге нашли бригаду - два брата, которые до этого работали в крупной ремонтной компании, но ушли потому что устали от "серых" схем – по отношению К НИМ ЖЕ. В основном - задержки з/п и прорабы.
В том же санузле, но уже после демонтажных и некоторых черновых работ. Братья очень помогли нам с первым ремонтом, кроме этого, они дали нам контакты проверенных рабочих, которые впоследствии делали ремонт вместе с ними
Купили первый комплект инструмента - это отдельная история на 100 тысяч рублей. Ещё сразу купили свою тепловую пушку - это из необычного. Большинство компаний привлекают "потолочников" на субподряд. Мы захотели сразу начать формировать свой инструментарий для будущих сотрудников. Зато потом эта закупка очень помогла - не зависели от того, что принесет с собой бригада. Позже, когда начали расширяться купили свою штукатурную станцию. Это, на удивление, было самой выгодной покупкой.
Первые сложности
Начали ремонт. И тут поехало... Первый сюрприз - когда начали снимать старую штукатурку, оказалось что стены буквально рассыпались. Плюс под старым линолеумом в коридоре нашли деревянный пол с насыпью под ним.
Тут был первый серьезный разговор с заказчиком. Объяснили ситуацию, показали все фотки, рассказали что сколько будет стоит в соответствии с прайс-листом. Тут очень помогло то, что мы сразу взяли за правило - фотографировать вообще все. Каждый этап, каждый слой, каждую трубу.
С материалами тоже было весело. Первый месяц я лично объездил все крупные строительные магазины в радиусе 30 км. Искал поставщиков, договаривался о скидках. Помню, как чуть не купили партию плитки по "супер-выгодной" цене, а потом выяснилось что это условно "второй сорт" - брак, который продают через "серые" схемы.
Cделали систему закупок: (Первый заказ полностью сделан из материалов, купленных в Петровиче и на маркетплейсах). Бригада присылает список - мы проверяем цены у 3-4 поставщиков и заказываем где дешевле.
Мы сразу внедрили систему ежедневных фото-отчетов и еженедельных созвонов. Плюс сделали чат в телеграме, куда скидывали все чеки, все накладные, все фотки. Такая прозрачность очень помогла - клиент видел, что мы не химичим с ценами и не пытаемся на нем нажиться.
В итоге сделали.
Братья советовали нам недостающих специалистов по ходу ремонта и постепенно, укладываясь в срок мы сдавали клиенту новый и новый этап. Честно, это было не так сложно как казалось в начале, но нужно понимать, что на самом деле, проблем по ходу ремонта и мелких трудностей было ОЧЕНЬ много, просто мы как люди привыкшие, понимали что сейчас это и есть наша работа , за которую нам платит клиент - взять на себя все заботы по ремонту. Но серьезных форс-мажоров не возникало, максимум понервничали, когда внесли предоплату потолочникам, которых нашли по объявлению, после чего они явно начали задерживать сроки, но в итоге, все обошлось. Нам и до этого было ясно, что чем быстрее мы соберем свой , хотя бы, небольшой штат, тем лучше и выгоднее. Но для этого надо быть уверенным в постоянном потоке заказов, что мы на тот момент, не могли себе позволить.
Главное - мы поняли как надо и как не надо. Все закупки только через нас. Все договоренности - только в письменном виде.
По деньгам первый проект получился условно в ноль - не считая наших вложений в инструмент и рекламу. Но мы получили бесценный опыт, наработали связи с поставщиками (если это можно назвать так пафосно) и главное - поняли, что наша модель рабочая, хотя на тот момент не были в этом до конца уверены. Наши сомнения развеяло лето 2023 года.
1/5
Наша первая работа, которую нам помогли закончить "братья", советуя недостающих мастеров на каждый этап работ. Цена работ для заказчика вышла 750 000 рублей. Летом 2023 года, за аналогичный объём работ авитовские бригады просили до миллиона(!)
Сайт и маркетинг или как мы общаемся с клиентами ещё до первого звонка
Кстати, про сайт. Первую версию мы сделали за пару вечеров на Тильде - максимально простую: фотки, цены, контакты. Знаете что? Он у нас до сих пор такой – но с значительно изменённым UI/UX. Я иногда ловлю себя на мысли - вот мы же, можем сделать что-то крутое, с личным кабинетом, онлайн-сметами... Но потом смотрю вордстат, статистику и думаю - а зачем? Клиенты находят нас, звонят, все работает. Иногда лучшее решение - самое простое.
1/2
На главной странице "в лоб" о том кто мы, наши конкурентные преимущества, специализация и примеры работ
1/2
Сразу "ярко" заявляем о действующих скидках. Кроме этого, простым текстом пытаемся общаться с клиентом и убедить его в нашем сервисе, пока что, не общаясь с ним лично - конверсия в лиды увеличилась значительно, но важно, чтобы все предложения были реальны
А вот ворд стат. За последний месяц нас искали 680 раз не считая статистики переходов по прямой ссылке. Доказательство того, что дорогой сайт не нужен. Наш стоит 6 000 рублей в год, а сделан за 20 часов
Примеры лучших работ как маркетинговый инструмент
1/4
Оставляли подобные фото с примерами работ и вотермаркой в отзывах к жилым комплексам. Отличный маркетинговый инструмент - сразу определяем нужную ЦА и бесплатно заявляем о себе. Точно знаем, что минимум один клиент был из отзывов яндекс - поэтому работает
Как мы масштабировались и разбирались в проблемах ремонта
Теперь про то, как мы начали разбираться в проблемах ремонта и потихоньку расти. Знаете, за этот год мы много думали - почему вообще ремонтные компании задерживают сроки и не могут сделать работу по первоначальной цене? И нашли несколько интересных моментов.
Первое - сроки. Тут даже копать глубоко не пришлось - сам рынок сформирован так, что клиенты просто привыкли к задержкам. "А, ну это ремонт, тут всегда так" - классическая фраза. Благо тут нам помог опыт организации процессов из айти. Четкие спринты, ежедневные отчеты, календарный план. Работает как часы, если не филонить.
Второе - вечно растущая цена. Вот это было сложнее. В новостройках еще можно точно посчитать, а во вторичке... Но благодаря наработкам этот вопрос стал гораздо яснее. При правильно организации процессов, непредвиденные работы лучше оплатить из своих средств, чем терять клиента. Только так и делается сервис.
Третье - больная тема - воровство на материалах. Тут мы конкретно закрутили гайки. Завели строгий учет, до последнего мешка штукатурки. Прорабам сразу сказали - любая жалоба от клиента на нечестность - это конец сотрудничества. Знаете что самое смешное? Когда начали работать честно, оказалось что маржа все равно хорошая. Просто многие привыкли что надо обязательно накручивать еще и еще.
Неприятные особенности прозрачного сервиса
Большинство компаний, которые начинают работать честно, быстро сдуваются. Потому что сам потребитель привык к плохому сервису. Приходишь к клиенту, говоришь "мы все сделаем четко по смете и в срок", а он смотрит с недоверием - "да ладно, так не бывает". Сейчас в 2024-м ситуация получше, но рынок все еще очень консервативный.
Продвижение или как мы брали “Новую Москву”
Наш любимый Прокшино в Новой Москве - в 2024 году, это самый перспективный район в котором покупатели - наши потенциальные клиенты
Расти начали потихоньку. Сначала сделали специальные цены для новой Москвы - там как раз много новостроек, где мы хорошо научились работать. Потом пошли заказы по рекомендациям. Когда я говорю “пошли” заказы нужно понимать, что это 1-3 заказа в месяц стабильно, что на самом деле, тогда казалось не мало. С рекламой экспериментировали забавно - оставляли визитки в подъездах (да, просто старые добрые визитки!), ставили рекламные ящики у офисов продаж в дни выдачи ключей.
Был случай, когда на одном ЖК поставили такую стойку, а через неделю риелтор оттуда сам позвонил и предложил взять себе процент, если клиент пойдет к нам.
Сейчас берем 2-5 заказов в месяц, (летом было 5 в месяц, если разделить). Большинство клиентов приходят по рекомендациям. Штат за год работы постепенно собрали свой. Трудоустроено 14 сотрудников. Если их не хватало (как летом), привлекали мастеров с которым уже работали раньше, по договору ГПХ. Просили всех регистрировать самозанятость или ИП – это было тяжело, но зато честно платим налоги по Доходы – расходы.
Как устроен процесс
Знаете, что самое сложное в ремонтном бизнесе? Нет, не поиск клиентов и не работа с материалами. Самое сложное - это выстроить систему, которая будет удовлетворять запросы клиента и при этом позволит компании зарабатывать. Мы долго думали над этим и придумали несколько интересных решений.
Начнем с оплаты. Если посмотреть на московский рынок, там забавная система - вроде бы без предоплаты, но это только за первый, самый дешевый этап. А потом - бац, и клиент должен внести 50% от всей суммы. И попробуй не внеси - бригада уйдет на другой объект. Мы сделали иначе: разбили весь ремонт на этапы (их получилось 12 для капитального ремонта), и берем предоплату только за текущий этап. То есть клиент всегда понимает, за что именно платит, и может контролировать процесс.
С договорами тоже интересно получилось. Сначала делали один стандартный, а потом поняли - люди разные, запросы разные. Сейчас у нас три варианта: просто на работы (для тех, кто сам хочет закупать материалы), на работы плюс материалы (самый популярный), и полный пакет с дизайн-проектом. Кстати, про дизайн - мы не держим штатных дизайнеров, работаем с фрилансерами. Так получается и дешевле для клиента, и качество выше - каждый дизайнер специализируется на своем стиле.
Первый образец договора, который ставили на сайт
Расчёт стоимости
Расчет стоимости работ - отдельная история. Когда начинали, было очень сложно. На рынке нет четких цен - один мастер берет 3 тысячи за квадрат стяжки, другой - тысячу, третий вообще говорит "ну давайте посмотрим по факту". Сначала работали по среднему прайсу, но часто уходили в минус по отдельным этапам - то бригада дороже встанет, то материала больше уйдет. Сейчас, когда появились постоянные сотрудники, стало проще - мы точно знаем их расценки и можем давать фиксированную цену.
Материалы
Выяснилось, что в крупных магазинах часто дешевле в сравнении с рынками стройматериалов, особенно если ловить акции. Плюс появились маркетплейсы - там вообще красота по ценам. И главное - полная прозрачность, клиент сам видит все позиции. Если находим материал дешевле - возвращаем разницу. Был случай, когда на керамограните сэкономили клиенту почти 30 тысяч - просто потому что, нашли ту же плитку в другом магазине по акции.
Как работаем сейчас
Сейчас берем 2-5 заказов в месяц, зависит от сезона и сложности объектов.
Процесс обкатан до мелочей: сначала выезд на замер, потом предварительная смета. Если клиента все устраивает - детальный расчет и договор. Дальше начинается самое интересное - согласование материалов, закупки, работа.
Особенности продвижения и подводные камни
С продвижением интересно получилось. Сначала, как все, полезли на Авито. И знаете что? Не зашло. Там своя специфическая аудитория и конкретно у нас, с Авито “ не пошло”.
Свежий пример страницы с авито в категории "Ремонт квартир". Как клиенты определяются с подрядчиком среди тысяч однотипных объявлений - хороший маркетинговый вопрос, который мы решаем, после чего полноценно "зайдём" на авито
Пробовали контекстную рекламу яндекс - тоже так себе результат. Клики дорогие, конверсия низкая. Зато отлично зашла таргетированная реклама в Instagram* (*запрещен в РФ) и реклама в районных пабликах ВКонтакте. Особенно в группах новостроек в ТГ - там как раз наша целевая аудитория.
Но главный канал - сарафанное радио. Причем работает оно интересно. Всегда знаешь , от кого пришли заказчики и проще выстраивать коммуникацию. Есть клиент - он доволен, рассказал коллегам - и понеслось. За три месяца получили еще два заказа от сотрудников той же компании. Выходит такой “корпоративный ремонт”)))
Были, конечно, и провалы в продвижении. Пытались работать с риелторами - предлагали им комиссию за клиентов. Не пошло - у них свои схемы, свои бригады. Пробовали давать рекламу в лифтах, входных группах - тоже мимо, ни одного обращения, но тут скорее из-за того что эта реклама буквально на день.
ИТОГ
Сейчас мы существуем уже чуть больше года и в целом смотрим на ремонтный рынок не так, как раньше. За это время мы сделали несколько важных заметок для себя:
Оказывается, большинство проблем в ремонте - это не технические сложности, а банальная организация процессов. Когда все четко спланировано и каждый знает что делать - даже самый сложный ремонт идет как по маслу.
Мы поняли, почему многие компании "химичат" с ценами и сроками - просто потому что не умеют нормально считать и планировать. Когда все процессы выстроены правильно, можно работать честно и все равно оставаться в плюсе.
Самое сложное - это не найти клиентов или научиться делать ремонт. Самое сложное - это переломить привычку рынка работать "по-серому". И заказчики, и исполнители настолько привыкли к непрозрачным схемам, что честный подход вызывает удивление.
Мы до сих пор учимся. Каждый объект - это новый опыт и новые вызовы (особенно по части коммуникаций с клиентами). Но главное - мы видим, что наша модель работает и пока что, нам удается держать ценник немного ниже рыночного, за счёт того что до сих пор не имеем в найме маркетологов, IT, отдела продаж и менеджеров по продажам. Стараемся нанимать именно рабочих, все остальное можно отдать на аутсорс.
Уважаемые пикабушники, были рады составить для вас эту статью! С любовью, СК Комната
Перед тем, как разобрать, что такое live lock, вспомним, что такое dead lock.
Deadlock bug на простейшем примере Два потока захватывают мьютексы в разном порядке. Это может привести к ситуации, что планировщик запустит на выполнение поток 1, поток 1 захватит мьютекс 1, после чего планировщик приостановит выполнение потока 1 и запустит на выполнение поток 2. Поток 2 захватит мьютекс 2. Независимо от того, какой поток будет выполняться дальше, программа зависнет, т.к. потоки будут ждать разблокировки мьютексов (поток 1 - мьютека 2, поток 2 - мьютека 1), которая никогда не произойдет.
Программирование — это область, где всегда есть чему научиться, даже если ты опытный разработчик. Вот несколько идей для гайда, которые удивят даже бывалых программистов:
Гайд: "Неизвестные фишки управления памятью в высокоуровневых языках"
1. Ленивые вычисления (Lazy Evaluation) в неожиданных местах
Некоторые языки, такие как Haskell или Python (с функцией generator), используют ленивые вычисления, когда результат не вычисляется, пока он не станет необходим. Однако это можно внедрить в повседневные задачи в других языках, таких как JavaScript или даже Java. Как использовать ленивые вычисления для оптимизации кода, который работает с большими массивами данных?
Пример для Python:
def lazy_range(n):
i = 0
while i < n:
yield i
i += 1
Где применить: Для задач, где ты работаешь с большими последовательностями данных, но хочешь минимизировать использование памяти.
2. Эффективное использование кэширования с WeakRef
Мало кто знает, что можно кэшировать объекты в памяти, но при этом освобождать память автоматически, если они больше не нужны. Это позволяет существенно снизить потребление памяти при работе с большими данными.
Python:
import weakref
class MyClass:
pass
obj = MyClass()
weak_obj = weakref.ref(obj)
Где применить: В местах, где требуется держать ссылки на объекты, но не перегружать память.
3. Аллокация памяти под многопоточность
В языках, как C++ и Rust, можно контролировать не только, как выделяется память, но и как она освобождается в многопоточном окружении. Даже в высокоуровневых языках, например, в Go или Kotlin, есть инструменты управления аллокацией памяти, о которых мало кто задумывается.
Ключевой инсайт: Как правильно распределять память между потоками, чтобы минимизировать блокировки и ускорить многопоточные программы.
4. Принципы оптимизации памяти для асинхронного программирования
Асинхронность может вызвать утечку памяти, если неправильно управлять контекстами выполнения. Как избежать типичных ошибок в управлении памятью при использовании async/await в JavaScript или Python.
Где применить: Например, при работе с веб-серверами, обрабатывающими десятки тысяч запросов, важно управлять контекстами так, чтобы они не забивали память, особенно при медленных сетевых соединениях.
5. Функции с разбором мусора (Garbage Collection) в недокументированных языках
Например, Go предоставляет довольно глубокую настройку сборщика мусора, которая редко используется даже опытными разработчиками. Что, если ты можешь вручную настроить его для повышения производительности своих программ?
Инсайт: Тонкая настройка алгоритма Garbage Collection, оптимизированная под типы задач.
6. Контроль за аллокацией стека и кучи на уровне сборки
Даже в языках высокого уровня можно управлять памятью низкого уровня. Например, с помощью встроенных функций компилятора можно контролировать стек и кучу в приложениях на уровне программной архитектуры.
Где применить: В сложных многопоточных системах, где важна точная настройка производительности.
Важность:
Эти фишки покажут, что можно достичь значительного повышения производительности даже в высокоуровневых языках. Такой гайд удивит даже опытных разработчиков, которые привыкли работать с инструментами "по умолчанию" и не вникают в глубинные процессы управления памятью.
Создаю задачи TTask в цикле. Всего должно быть 56, но создаются 23. Почему так может быть? При этом чем меньше кода в потоке, тем больше потоков удаётся создать. К примеру, если все потоки пустые и просто ждут (while true sleep...), то все создаются без проблем.
Для начала немного истории, все программы автоматизированного проектирования в том или ином виде берут свое начало с конца прошлого тысячелетия, а именно:
Autocad - 1982 г.
Revit - 1997 г.
Tekla - 1966 г.
Компас - 1997 г.
Allplan - 1982 г.
ArchiCad - 1986 г.
Solidworks - 1993 г.
И многие иные, даже сложные комплексы для расчетов такие как ANSYS и ABAQUS созданы в конце прошлого столетия.
Из отечественных можно еще выделить Renga , но она создается на старом ядре C3D компании АСКОН, а они в свою очередь создатели Компаса, поэтому это одно и тоже решение в разных обёртках.
Все данные САПР программы объединены одним общим принципом, они все создавались на основе одного принципа обработки информации - последовательного, это было следствием реалий тех времён, не существовало аппаратных устройств многопоточной обработки информации. Но времена идут, всё меняется , но не меняются геометрические ядра. В среднем на создание полноценной САПР программы уходит от 5 до 7 лет и довольного большого числа сотрудников - разработчики, тестировщики, консультанты и т.д. и в текущих реалиях ни одна из компаний разработчиков не пойдет на полноценную перепись с нуля своих геометрических ядер под многопоточные CPU и GPU. Конечно, программы обновляются с каждым годом, но все данные нововведения по сути косметические без глубокой оптимизации.
В прошлом году я разместил пост в котором продемонстрировал возможности Unreal Engine 5 при отображении многомиллиардно полигональной геометрии. В течении последнего года я вел разработку геометрического ядра которое сможет использовать многопоточную обработку на CPU - процессов требующих двойной точности, а на GPU - процессов где хватает и одинарной точности. Новые видео карты Nvidia - 3070, 3080, 3090 уже способны находить решения с двойной точностью на тензорных ядрах (они используются при обработки трассировки лучей в играх) , но на данный момент у меня работа с данными ядрами на этапе экспериментов.
По сути получилось решение которое по производительности превышает любую программу выше в списке от 10 до 100 раз и более. И это касается любых действий, отображение графики, копирования, изменений, перемещений, подсчета материалов и т.д.:
В моем решение используется ровно такой же подход как в Unreal Engine 5 в технологии nanite. При удалении камеры пользователя происходит постепенная эрозия геометрии и упрощение геометрии вплоть до отображения одного пикселя, что позволяет отображать многократно больший объем информации по сравнению с программами "пенсионерами". Но у технологии Nanite есть один большой минус, необходимо предварительное кэширование шейдерных текстур на жёсткий диск , в САПР это невозможно , поэтому мне пришлось данную технологию переработать под САПР и особенно под армирование строительных конструкций и впереди еще много работы.