thestrikemch | Unsorted

Telegram-канал thestrikemch - Даниил Динько - IT & Nomads

1576

Senior Backend Engineer, ex. TechLead tier-3 world cybercrime, ex. Senior Go в Ozon, ex. Ситидрайв, @thestrikem - автор канал

Subscribe to a channel

Даниил Динько - IT & Nomads

Надоело видеть, как разработчики становятся инфобизами про "Как вкатиться в IT и зарабатывать 300к".

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


Почему, по моему мнению, так происходит? (внутрянка)
+ Гайд, как это сделать у себя в гараже

По сути - это самый простой способ вне найма заработать денег. Вот вам готовая стратегия успеха: снимаете бесплатные обучающие ролики, закупаете рекламу в телеграм каналах (посевы) на 150к, делаете какой-то свой продукт (менторство/курс/менторство+курс).

Как сделать курс? Берете и проводите ресерч открытых материалов, все это мерджите в своей интерпретации со своими лицом в курс и готово. Думаете авторы добавляют что-то свое сверхкрутое? Нет, все это уже точно есть в интернете, просто не всегда удается сразу найти - нужно потратить >1 минуты на поиск. Автор придумать что-то свое авторское - это как "авторские курсы английского" - взял, добавил себя - получил авторское. Ну просто такое невозможно, зачем автору, имея что-то оригинальное => имея особые компетенции, занимать инфобизнесом? Его на рынке за секунду с компетенциями такими раскупят. Так что просто взял, переделал под себя - готово, такое всегда и у всех было и будет). Итак, курс есть, рекламу закупили, привели всех в канал. Теперь начинаем прогревать, как это происходит: вкидываем технические посты, посты с "искренностью" и параллельно с ними посты с прогревом.

Как делать прогревы? На это есть даже эксперты, вот основные форматы, которые я видел: показываешь, как старательно ты делаешь курс и подбираешь материалы - чистый прогрев, чтобы ты вдохновился и отдал деньги (уровень low), рассказываешь про какую-то технологию (сложно или не понятно), а потом говоришь - на курсе разобрал подробно, вот ссылка (уровень low+), пишешь искренний пост, вызывая доверие, и в конце прогреваешь на курс (уровень mid - через эмоции продажа), просто наглый прогрев с "ВОТ ЩАС СКИДКА, 1 МЕСТО ОСТАЛОСЬ, БЫСТРЕЕ, БЫСТРЕЕ, ПОКУПАЙ!" или давление на слабости человека (силу воли, ответственность, что называется низменные желания обогатиться через IT) (уровень - high scum). И, что интересно, люди на это ведутся, важную мысль осознал: Курс покупают не за его качество, а за то, как про это качество рассказала и как прогрели, надавив на слабость и завладев доверием. Так что вы можете сделать любой курс и прогреть его, действуя по стратегиям выше, и вложить в рекламу, как писал выше - окупитесь.

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

Рассрочки, кредиты, дроби и так далее? Обязательно всеми подключаются, вы не представляете, но большая часть людей почти у всех инфобизнесменов покупают курсы в кредит. И это я не придумал, я говорю статистику, потому что, как говорил ранее, частично причастен к этой теме, но потом решил пойти в другую сторону. В момент причастности я успел пообщаться с разного рода по крупности блогерами и EdTech организациями. Почему так? Еще раз повторюсь, люди покупают не курс, а то как он выглядит в качественно проделанных прогревах. В начале вы делаете прогревы один, а по росту продаж нанимаете целый штат людей: SMMщики, Reels-мейкеры, маркетологи и продажники - их главная цель улучшить представление курса в прогревах.

Читать полностью…

Даниил Динько - IT & Nomads

Всем привет! 🪿

Я вообще в последнее время не менторю ребят, поскольку по основной работе есть, чем заняться.

Но сейчас появилось желание немного поменторить ребят, итак, что я могу? ↗️

- провести мок-собес и понять ваш примерный уровень + составить индивидуальный план и скинуть материалы для изучения
- объяснить какую-нибудь тему, я хорош: в System Design, в многопоточности, в гошке и в базах данных
- составить вам карьерный план роста именно в вашем кейсе

Занятие длится один час - за него оплата фиксированна, обсуждаем в лс. 🟦

@thestrikem - пишите сюда

Читать полностью…

Даниил Динько - IT & Nomads

↗️ Куда двигаться из языка Go, чтобы повысить свои компетенции?

🦫Go на хайпе, но почему бы не добавить к классическому стэку аля микросервисы + колоночная + реляционная + брокер + Go что-то новое?

- Почему тебе надо стать лидом? Как это понять?
- Зачем вообще тебе раст?
- А вдруг нас ML заменит?
Об этом ниже

➡️ Куда же можно дальше двигаться? Как мне кажется, путей несколько:
- Rust - язык потихоньку хайпует, российского рынка по-прежнему еще, можно сказать, нет. Но на международном рынке на Rust написан блокчейн Solana => т.е. Solana + Rust + Go + все остальное из дефолтного стэка = вполне неплохой вариант. Таким образом можно повысить свою зарплату и, как мне кажется, решать более содержательные задачи
- В руководство - тут по настроению, многие хотят просто писать код и не брать на себя ответственность. Но даже если вы такой, то не спешите отбрасывать этот вариант. Рекомендую посмотреть пару топовых докладов с TeamleadConf, чтобы понять, как лиды думают - если это вас заинтересует, то может все-таки стоит подумать в эту сферу? Здесь по сути как в программирование - строишь системы, но на уровне выше => больше влияешь на продукт.
- ML - кого как, но меня, честно говоря, в глубине души немного напрягает рост нейронных моделей, способных писать код. Сейчас еще это в зачаточном состоянии, да и мы - гоферы - одни из самых сложнозаменяемых специалистов - все-таки сомневаюсь, что AI сможет по функциональным и нефункциональным требованиям, общаясь с бизнесом, сначала спроектировать высоконагруженную систему, а потом ее написать полностью, и в процессе принимать решения о итеративном улучшении. Но все равно, в будущем, я думаю, такой шанс есть, поэтому так или иначе все мы свитчнемся в ML

(мы сейчас рассматриваем только найм) Если есть что добавить - пишите, пообсуждаем!

Ставьте ❤️ - если было интересно

Читать полностью…

Даниил Динько - IT & Nomads

🔔 У меня недавно прошла трансляция (переходи смотреть, если не смотрел)

Что я успел разобрать?
- Полное решение LRU Cache
- Интересная задача, связанная с рассуждениями про построение клона Redis
- Задача на платежи и проблемы вокруг них

✨ Я обещал народу скинуть статьи, я сейчас прикреплю все, что помню, но если что-то забыл - пишите в комментарии, докину:
- Алгоритм консенсуса в leader election с визуализацией - https://raft.github.io/
- Про шардирование на достаточно углубленный уровень - https://habr.com/ru/companies/oleg-bunin/articles/313366/
- Достаточный уровень в рамках эффективного хэширования с вытеснением - https://habr.com/ru/companies/surfingbird/articles/306252/

➡️ Точно что-то забыл, или если даже я в видео не ссылался на какую-то статью, а вам просто интересно что-то еще узнать из баз данных или сисдиза, пишите - поделюсь накопленными материалами

👍 - полезная тема, давай еще

Читать полностью…

Даниил Динько - IT & Nomads

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

Читать полностью…

Даниил Динько - IT & Nomads

➡️ Итоговый вариант решения задачи с трансляции

package main

import (
"context"
"fmt"
"sync"
)

func main() {
ctx, cancel := context.WithCancel(context.Background())

genVals := func() <-chan <-chan interface{} {
out := make(chan (<-chan interface{}))
go func() {
defer close(out)
for i := 0; i < 300; i++ {
stream := make(chan interface{}, 1)
stream <- i
out <- stream
close(stream)
if i == 10 {
cancel()
}
}
}()
return out
}

var res []interface{}

for v := range bridge(ctx, genVals()) {
res = append(res, v)
}

fmt.Println(res)
}

func bridge(ctx context.Context, ins <-chan <-chan interface{}) <-chan interface{} {
out := make(chan interface{})

go func() {
wg := sync.WaitGroup{}

for {
select {
case <-ctx.Done():
wg.Wait()
close(out)
return
case c, ok := <-ins:
if !ok {
wg.Wait()
close(out)
return
}

wg.Add(1)
go func() {
defer wg.Done()
for num := range c {
select {
case <-ctx.Done():
return
default:
select {
case <-ctx.Done():
return
case outCh <- v:
}
}
}
}()
}
}
}()

return out
}


Исправлено:
- переместил вэйтгруппу с закрытием канала в место, по достижению которого мы точно уверены в том, что хотя бы один wg.Add был. В прошлом варианте был риск того, что wg.Wait сработает раньше, чем первый wg.Add - а так нельзя, у нас wg.Wait пропустит через себя
- и интересный момент с select тоже поправил

Это хорошо, что выявились такие корнер кейсы и мы на них обратили внимание. Всем спасибо за то, что пришли на трансляцию!

Читать полностью…

Даниил Динько - IT & Nomads

Чет говорил на трансляции про какой-то экспресс-курс, который мы делали с Эйч Навыки

🔥Посмотреть про него подробнее можно здесь

Запись трансляции сюда скину попозже) А пока оцените, как вам? Что понравилось, а что нет?

реакция ❤️ - было полезно, продолжай

Читать полностью…

Даниил Динько - IT & Nomads

Очередная взрывная трансляция по многопоточности в 💙

➡️ Как делать миграцию из канала каналов в один канал с контекстом? (усложненный вариант этой задачи)
➡️ Пишем свою структуру для оптимизации параллельных вычислений с учетом ошибок

💣 Многопоточность - интересная и сложная тема, которую часто спрашивают на собесах и менее часто, но все же на работе. Залетайте про нее смотреть сегодня в 18:00

Проведу ее я, конечно)

Смотреть на платформе Эйч или YouTube

Читать полностью…

Даниил Динько - IT & Nomads

🪿 Что такое MVCС? Кратко 🟦

Представьте: вы приходите в магазин, у вас есть полка с бананами и много покупателей, которые хотят купить бананы, как детерминировано организовать очередь за бананами?

Рассмотрим варианты:
1️⃣. Выстроить всех синхронно, каждый подходит по очереди - такое себе, слишком медленно
2️⃣. Построить параллельную вселенную для каждого покупателя, чтобы он мог выбрать подходящий банан с полки, после того, как человек выберет банан, нужно понять, не выбрал ли ранее кто-то его в других параллельных вселенных, если выбрал, то здесь нужно ставить менеджера, который будет определять, кому идет банан - наш вариант, это про MVCC

😜 А что за менеджер такой? Это механизмы уровней изоляции транзакций. Транзакция в этом случае - это проверить, что банан X есть на полке и взять этот банан с полки

😨 А зачем это надо? MVCC - это более оптимальный вариант реализации уровней изоляции транзакций при конкурентных операциях (необязательно параллельных, можно асинхронных)

Если понравилось, то ставь ❤️

Читать полностью…

Даниил Динько - IT & Nomads

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

Читать полностью…

Даниил Динько - IT & Nomads

🔫 Возвращаемся к рабочему настроению потихоньку

☃️ Какие материалы можно почитать в этом году, чтобы повысить свой грейд?
- Прекрасная книга про канкаренси, в которой можно очень много узнать про планировщик, многотопочность и т.д. - гошка
- Крутая книжка про постгрю - помогает вгрузиться в базы данных и высокую производительность в них в целом - базы данных
- Статья о крутой книге про сисдиз интервью, если вы хотите расти выше мидла+ - сисдиз
- Курс по Kubernetes от Слерма (бесплатный), для Go-разработчиков там максимум знаний, которые только нужны. Более бессмысленно - инфра
- Мой авторский курс по собеседованиям - разбираем все задачи и вопросы с собеседований - практика собесов

🌻 Также, если вы еще не взяли за привычку, то рекомендую:
- В день решать одну задачу (или две) с литкода, можно одну медиум утром, а под вечер можно решить какую-нибудь легкую - алгоритмы и структуры данных (тут может помочь только такой вариант обучения)
- Будьте в теме новых технологий и подходов в хайлоаде, смотрите следующие каналы крутых конференций:
HighLoadChannel">Highload channel - интересно про хайлоад
GolangChannel">Golang channel - интересно про гошку
PodlodkaShow">Podlodka - просто интересно поговорить за айтишку

Чем больше из этого вы усвоите в новому году, тем жестче будет ваш взлет к 2026

Если было полезно, то сохраняйте себе и ставьте ❤️!

Читать полностью…

Даниил Динько - IT & Nomads

С новым годом🔥

Читать полностью…

Даниил Динько - IT & Nomads

🥺 По результатам опроса ранее победил System Design - по нему будет ролик на моём ютуб канале и следующая трансляция в Эйч после Нового года

Читать полностью…

Даниил Динько - IT & Nomads

Всем привет!

Есть тут ребята, интересующиеся LangGraph, LangChain, MCP, Function calling и построением AI-агентов в целом? С радостью бы пообщался, сейчас пытаюсь во все это вникнуть, весьма заинтересовало

Взамен на помощь по этим штукам, могу как-то по Go что-нибудь подсказать, если будет интересно)

Пишите в лс - @thestrikem

Читать полностью…

Даниил Динько - IT & Nomads

➡️ Как быстро изучить второй язык - Rust?

- Зачем? Мне надо таски делать
Rust сейчас примерно на уровне с Go по росту, многие его изучают дополнительным языком. Для нас - бэкендеров - этот язык валиден для совсем хайлоудов (где уже ничего не помогает) - дискорд так ускорили - и для свитча в блокчейны - модная нынче тема с неплохой зарплатой. Вполне неплохой шанс начать перекладывать джсоны более элегантно и зарабатывать побольше денег, находясь в интересных или/и модных проектах. Или просто для интереса - как я)

Особенности:
- нет своего GC, как и в целом рантайма (асинхронный рантайм подтягивается отдельно либой)
- быстрый (но не всегда)
- в основном для системного программирования

Дисклеймер: я сам только изучаю его, поэтому если есть что дополнить - пишите в комментарии

Флоу:
- смотрим базовые уроки - кажется лучший автор, понятнее и более всеобъемлюще не нашел + ChatGPT
- параллельно с пунктом выше читаем доку - она простая и понятная
- смотрим первый примитивный проект на Rust - тут объяснение плохое, много воды, поэтому лучше сразу перейти в репозиторий и разбираться самому с ChatGPT (по моему мнению, для некоторых - иначе)
———— Далее криптовалютчикам
- идейно понимаем концепт блокчейна (кажется лучший вариант, понятнее не нашел) + ChatGPT
- Solana - к сожалению, читаем доку на английском и смотрим английские видосы (можно подрубить встроенный голосовой переводчик - есть в Яндекс Браузере, или подрубить экстеншеном)
- и кажется теперь у вас есть базовое осознание того, как писать смарт-контракты на Rust для блокчейна Solana

Ставьте ❤️ - если полезно

Читать полностью…

Даниил Динько - IT & Nomads

Разбавим этот хардовый контент мемом

Ставьте 👍 у кого жиза

Я поставил) Юзаю два мака - один на столе, другой у кровати для ранних созвонов

Читать полностью…

Даниил Динько - IT & Nomads

💣 Нашел самое лучшее объяснение блокчейна от опытного специалиста

Меня скоро вытеснит с рынка новая молодежь

https://www.youtube.com/watch?v=voEiPtoop_0

Читать полностью…

Даниил Динько - IT & Nomads

Есть тимлиды? Нашел для вас интересные материалы - роадмап для тимлида. Почитал - кажется, что весьма полезно.

💎 https://tlroadmap.io/guide.html

Читать полностью…

Даниил Динько - IT & Nomads

😡 Да как же работает select в Go, когда рандомно, а когда не очень?

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

Разберем на примере:
Вот у нас есть такая ситуация

 select { 
case out <- v:
case <-ctx.Done():
return
}


Каким образом здесь селект выберем подходящий кейс? Когда происходит рандом?
Если каждый из группы кейсов удовлетворяет следующим условиям, то среди этой группы выбор кейса будет рандомным:
1️⃣ В случае читателя - если у него сейчас есть писатель подключенный или буфф канал не пустой, т.е. операция неблокирующая
2️⃣ В случае писателя - если у него сейчас есть читатель или буфф канал не переполнен, т.е. операция неблокирующая
3️⃣ Закрытие канала - потому, что это то же, что и чтение из канала, к которому подключен писатель

🔵 В ином случае кейс не будет выбираться в пользу другого

В задаче из трансляции валидно будет поправить кусок кода выше на такой:
 select { 
case <-ctx.Done():
return
default:
out <- v
}

Читать полностью…

Даниил Динько - IT & Nomads

Начинаем уже через 10 минут

Читать полностью…

Даниил Динько - IT & Nomads

🪿 Что такое MVCС? Кратко 🟦 Методы реализации

Предыдущий пост выше

😡 А удобно ли нам каждый раз создавать параллельные вселенные? Зависит от ситуации. Копировать оригинальную вселенную - это надежный, понятный механизм, при котором мы тратим минимум вычислительных мощностей CPU, но на каждую транзакцию мы копируем целый блок данных. А если строка, которую мы меняем еще под индексом, к примеру, b-tree, то нам нужно копировать и менять целую ветку дерева

👾 А что если мы будем вести историю изменений, а не копировать каждый раз? Вместо изменения данных - информация об изменениях. Кажется, мы сильно экономим по памяти, но делаем чтение длиннее, поскольку нам придется делать какие-то вычисления и получать последнее актуальное состояние строки.
* Этот метод хорошо мэтчится с lsm-деревьями, о которых позже

☃️ Мы познакомились с вами с базовой идеей и идейными методами решения, далее поговорим о том, как это реализовано в PostgreSQL

Если понравилось и хочешь продолжения - ставь ❤️

Читать полностью…

Даниил Динько - IT & Nomads

☃️ Социальный опрос перед ликбезом

Слышали ли вы когда-нибудь про эффект bloat индексов и MVCC в постгре?

Пишите в комментариях)

Читать полностью…

Даниил Динько - IT & Nomads

🔔Как перекачать данные из одного канала в другой с контекстом в Go?

Разбираем условие задачки:
- Есть функция, сигнатура такая


func orDone(ctx context.Context, in <-chan any, out chan<- any)
, нужно с учетом контекста перекидывать данные из in в out. Функция продолжает работу, пока канал ins открыт и контекст не отменен

Решаем:

func orDone(ctx context.Context, in <-chan any, out chan<- any) {
go func() { // создаем горутину, чтобы перекладывать все асинхронно и не стопить основной флоу программы
defer close(out) // не забываем закрыть канал
for { // бесконечный цикл, который завершается при return
select {
case <-ctx.Done(): // в селекте прописываем два кейса: если настал кэнсел контекста - ретерним
return
case v, ok := <-in:
if !ok {
return
}
select { // тут мы тоже делаем селект, потому что если контекст закенселен на этой милисекунде, нам тоже не нужно пушить в канал что-то
case out <- v:
case <-ctx.Done():
return
}
}
}
}()
}


🌸 Таким образом мы добиваемся того, что у нас пуш в канал идёт только после проверки того, что контекст еще незакенселен.

Это из моего авторского курса по собеседованиям задачка, кликай, если интересно. И ставь ❤️, если хочешь продолжение таких мини-разборов

Читать полностью…

Даниил Динько - IT & Nomads

Давайте разрушать мифы!

Ставьте ❤️ те, кто не прогал в Новый год и его окрестности хотя бы в один день. Посмотрим, сколько нас таких😊

Читать полностью…

Даниил Динько - IT & Nomads

Автор этого канала ушел праздновать Новый год, ставьте ❤️ те, кто тоже сейчас уже не работает

Читать полностью…

Даниил Динько - IT & Nomads

🔥А вы знаете, как под капотом устроен кэнселлинг контекста в Go?

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

☃️ Я считаю, этот год должен вам запомниться полным познанием темы многопоточности, поэтому залетайте с вопросами на трансляцию сегодня, мы все разберем)

🎈 - ссылка на платформу Эйч, если ютуб не работает
📺 - ссылка на трансляцию в ютубе

❤️ - приду, потому что тема актуальна

Читать полностью…
Subscribe to a channel