How to measure productivity part 2
Время перфоманс ревью и начало следующего полугодия. Тут есть отличный шанс понять что улучшить за прошлый период и начать планировать следующий.
Мы уже обсуждали очень важную статью про output’ы и outcome’ы. Но правила перфоманс ревью каждую калибровку меняются. Они не стоят на месте.
Вкратце, коммерческая разработка сильно изменилась в оценке инженеров:
- перестали оцениваться только колличественные метрики как пуллреквесты, коммиты и часы
- каждая техническая цель должна аргументироваться с позиции пользы для бизнеса
- разрабы стали более осознанны в следующих шагах
Это очень важно. Помню как в одной компании ребята внедряли KMP и у них вроде было много работы, но ауткамов не было. В итоге их работы чуть ли не приняли за вредную и не поставили «ниже ожиданий». Поэтому нужно понимать ясно туда ли вы гребете.
Я тоже начал планировать следующие полгода. Идей очень много, но фильтровать их помогают разные метрики. Вот интересные статьи:
🌟 Как измерять качество. Очень важная статья про метрики качества. Автор статьи говорит про повышения тимлидам и сеньорам благодаря им:)
🌟 Результаты 25000 перфоманс ревью. Интересные наблюдения и выводы на основе многих данных.
🌟 Perfomance review в Microsoft. Интересный опыт про эксперименты с перфоманс ревью в майкрософт
Время перфоманс ревью и начало следующего полугодия. Тут есть отличный шанс понять что улучшить за прошлый период и начать планировать следующий.
Мы уже обсуждали очень важную статью про output’ы и outcome’ы. Но правила перфоманс ревью каждую калибровку меняются. Они не стоят на месте.
Вкратце, коммерческая разработка сильно изменилась в оценке инженеров:
- перестали оцениваться только колличественные метрики как пуллреквесты, коммиты и часы
- каждая техническая цель должна аргументироваться с позиции пользы для бизнеса
- разрабы стали более осознанны в следующих шагах
Это очень важно. Помню как в одной компании ребята внедряли KMP и у них вроде было много работы, но ауткамов не было. В итоге их работы чуть ли не приняли за вредную и не поставили «ниже ожиданий». Поэтому нужно понимать ясно туда ли вы гребете.
Я тоже начал планировать следующие полгода. Идей очень много, но фильтровать их помогают разные метрики. Вот интересные статьи:
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
iOS Makes Me Hate
How to measure productivity?
Очень советую эту статью.
Те, кто работал в Авито, наверное ловят флешбэки от таких слов как output/outcome. На каждом перфоманс ревью вы с вашим лидом оцениваете свою работу. В итоге, он вам помогает определить что полезно…
Очень советую эту статью.
Те, кто работал в Авито, наверное ловят флешбэки от таких слов как output/outcome. На каждом перфоманс ревью вы с вашим лидом оцениваете свою работу. В итоге, он вам помогает определить что полезно…
Типичные списки 75 задач из Литкода
Нашел в сети пост про список интересных задач.
В интернетах есть куча разных списков задач, которые все ОБЯЗАНЫ прорешать перед тем как идти на интервью. Опять же, решать наугад задачи — не иметь структуры и плана, а значит терять время. Think about it😏
Самые известные из них:
Top Interview 150
Blind 75
LeetCode 75
NeetCode 150
Эти списки охватывают основную часть паттернов, алгоритмов и структур данных необходимых для алгособесов. Считается, что начинать с этих задач — правильная стратегия.
Задачи из списков выше — хорошая база. Можно хорошо их миксовать с курсами и теорией.
Нашел в сети пост про список интересных задач.
В интернетах есть куча разных списков задач, которые все ОБЯЗАНЫ прорешать перед тем как идти на интервью. Опять же, решать наугад задачи — не иметь структуры и плана, а значит терять время. Think about it
Самые известные из них:
Top Interview 150
Blind 75
LeetCode 75
NeetCode 150
Эти списки охватывают основную часть паттернов, алгоритмов и структур данных необходимых для алгособесов. Считается, что начинать с этих задач — правильная стратегия.
Задачи из списков выше — хорошая база. Можно хорошо их миксовать с курсами и теорией.
Please open Telegram to view this post
VIEW IN TELEGRAM
LeetCode
NeetCode 150 - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
Делюсь небольшим спойлером замеров лайаута с доклада Паши НеДурова про его оптимизацию проекта. Мы там не просто разобрали тему хитчей, мейнтреда, герцовка и render server, а прям детально прошлись по практическим инструментам.
Много жирного контекта по PinLayout, Texture, AutoLayout, голыми фреймами и другое. Такое вы нигде не увидите.
Релиз на днях.
Много жирного контекта по PinLayout, Texture, AutoLayout, голыми фреймами и другое. Такое вы нигде не увидите.
Релиз на днях.
Решил перед выпусками наваливать ЛОРа за темы, которые будем обсуждать. Так и весь контекст обсуждений можно понять, и экспозицию доклада сделать шире.
Не секрет, что мессенджеры — это отдельный вид приложений, не похожий ни на что. Модные SwiftUI, SC или CMP туда не запихнешь, тк он требует высокой производительности от очень старых устройств и версий. Здесь нужно уходить глубже, чем документации смузи штук. Обсуждать все сложности можно часами.
Поговорим про забытую многими технологию. Но оставившую свой след в индустрии.
Либа, AsyncDisplayKit aka Texture, знакома многими по исходникам телеграма. Много боли она принесла с конкурсами, когда нужно работать с исходной кодовой базой. Такие конкурсы на понимание и чтение исходников телеграма имели повышенную сложность. Именно в таком участвовал наш гость Паша.
В чем ее плюсы?
1️⃣ Асинхронный рендеринг — Рендеринг и layout происходят в фоновом потоке (да да), что уменьшает нагрузку на мейнтред. Вы думаете почему телеграм такой быстрый? Ну, потому что он эффективно работает с лайаутом.
Фейсбук* (запрещенная организация в РФ) создавала его для приложений с большим количеством контента (Pinterest, Facebook Paper).
2️⃣ Декларативный стиль через ASLayoutSpec еще до SwiftUI
3️⃣ Прерасчет лайаута до отображения.
В чем же минусы?
1️⃣ Сложность. Если вы где либо видите сложность — это плохой дизайн. Будь это текста авторов в телеграме, книги, кино, все что угодно. А уж тем более software engineering. Закон жанра: то, что остается сложным — умрет.
Асинхронный лайаут, при его очевидных плюсов на бумаге, стал мертворожденной идеей. Сами разрабы телеграма говорят, что было ошибкой затаскивать AsyncDisplayKit. А разрабы этой библиотеки давно отказались от поддержки в пользу своих более простых внутренних библиотек.
Советую ознакомиться в любом случае, тк это отличная зарядка для ума и опыт, который поможет понять проблемы UIKit.
Полезные ссылки:
- Using AsyncDisplayKit to Develop Responsive UIs in iOS
- Build Timeline View with AsyncDisplayKit
1/3
Please open Telegram to view this post
VIEW IN TELEGRAM
Texture
A UI Framework for Effortless Responsiveness
1 15 3
Асинхронный рендеринг в AsyncDisplayKit
Продолжаем небольшой обзор либы. На очереди у нас легкое потрошение и чтение исходников.
Асинхронный рендеринг — это когда drawRect, генерация изображений и т.д. не происходят на мейнтреде, а выносится в фон. Это позволяет избежать всяких фризов при сложном лайауте. Но как этого добивается сама либа?
Давайте по порядку. Условно, это полная замена UIKit'а. Где мы работаем с CALayer'ом не через вью (UIView), а нодами (ASDisplayNode). Они умеют: рассчитывать размер, рисовать свой контент и всё это в фоновом потоке. В отличие от UIKit лайаут считается заранее, а не на главном потоке.
Если кратко то как это работает:
1. Каждая нода отмечается флагом
2. С помощью ASDisplayQueue планируется очередь расчета лайаута или изображений с помощью CGContext
3. Дальше вызывается функция displayBlock, которая уже весь готовый контекст передает на главный поток.
4. node.contents безопасно обновляет UI
Примерная схема:
Или по этапам:
- calculateLayoutThatFits — Оптимизирует лайаут в фоне до появления на экране
- displayBlock — генерация вьюх и изображения в CGContext
- layer.contents — обновления готового и расчитанного контента на главном потоке
2/3
Продолжаем небольшой обзор либы. На очереди у нас легкое потрошение и чтение исходников.
Асинхронный рендеринг — это когда drawRect, генерация изображений и т.д. не происходят на мейнтреде, а выносится в фон. Это позволяет избежать всяких фризов при сложном лайауте. Но как этого добивается сама либа?
Давайте по порядку. Условно, это полная замена UIKit'а. Где мы работаем с CALayer'ом не через вью (UIView), а нодами (ASDisplayNode). Они умеют: рассчитывать размер, рисовать свой контент и всё это в фоновом потоке. В отличие от UIKit лайаут считается заранее, а не на главном потоке.
Если кратко то как это работает:
1. Каждая нода отмечается флагом
2. С помощью ASDisplayQueue планируется очередь расчета лайаута или изображений с помощью CGContext
3. Дальше вызывается функция displayBlock, которая уже весь готовый контекст передает на главный поток.
4. node.contents безопасно обновляет UI
Примерная схема:
setNeedsDisplay() →
_setNeedsDisplay() →
_scheduleDisplay() →
displayNode:asynchronously:YES →
dispatch_async(displayQueue) {
image = displayBlock()
dispatch_async(main) {
node.contents = image.CGImage
}
}
Или по этапам:
- calculateLayoutThatFits — Оптимизирует лайаут в фоне до появления на экране
- displayBlock — генерация вьюх и изображения в CGContext
- layer.contents — обновления готового и расчитанного контента на главном потоке
2/3
GitHub
AsyncDisplayKit/Source/ASDisplayNode.h at master · facebookarchive/AsyncDisplayKit
Smooth asynchronous user interfaces for iOS apps. Contribute to facebookarchive/AsyncDisplayKit development by creating an account on GitHub.
Асинхронный layout. Так стоит ли?
Помните, я говорил, что не люблю разбирать чужие либы? Тогда зачем я сделал это щас?
Потому что асинхронный лайаут — это как единорог. Его все пытается поймать, но никто не может. VK, Avito, Yandex — каждый хотел сделать самую быструю ленту и дать ответ рынку. Но почти все забросили эту идею...
В индустрии уже сложилось мнение, что асихнронный лайаут и его расчет в бэкграунд очередях должны быть только в очень, очень, ОЧЕНЬ сложных экранах. Тк проблем по контролю и сайд-эффектам будет в разы больше, чем выхлопа от перфоманса. Это самая крайняя крайность, к которой нужно приходить от безвыходности.
А вы как думаете? Нужен ли асинхронный лайаут, который считает размеры в фоновых очередях? Какие есть альтернативы?
3/3
Помните, я говорил, что не люблю разбирать чужие либы? Тогда зачем я сделал это щас?
Потому что асинхронный лайаут — это как единорог. Его все пытается поймать, но никто не может. VK, Avito, Yandex — каждый хотел сделать самую быструю ленту и дать ответ рынку. Но почти все забросили эту идею...
В индустрии уже сложилось мнение, что асихнронный лайаут и его расчет в бэкграунд очередях должны быть только в очень, очень, ОЧЕНЬ сложных экранах. Тк проблем по контролю и сайд-эффектам будет в разы больше, чем выхлопа от перфоманса. Это самая крайняя крайность, к которой нужно приходить от безвыходности.
А вы как думаете? Нужен ли асинхронный лайаут, который считает размеры в фоновых очередях? Какие есть альтернативы?
3/3
Перфоманс переоценен?
В одной компании (не буду показывать пальцем) провели эксперимент. Они увеличили искусственно скорость загрузки главного экрана на 1.5 секунд и…. Никакие продуктовые метрики не упали. Вообще. Пользователи будто и не заметили.
Мы все привыкли, что приложения должны быть быстрые и отзывчивые. Но этого больше хотят разработчики или юзеры?
какие бы метрики предложили вы?
В одной компании (не буду показывать пальцем) провели эксперимент. Они увеличили искусственно скорость загрузки главного экрана на 1.5 секунд и…. Никакие продуктовые метрики не упали. Вообще. Пользователи будто и не заметили.
Мы все привыкли, что приложения должны быть быстрые и отзывчивые. Но этого больше хотят разработчики или юзеры?
какие бы метрики предложили вы?
Всю неделю я готовил фактуру и контексты для видео. Мы с Пашей, призером телеграм конкурсов и крутым разрабом, собрали плотную лекцию с кодом и замерами перфоманса:
Это первый доклад Паши, сейчас он делает сложный клон телеги и прям из печи принес пирожки.
Please open Telegram to view this post
VIEW IN TELEGRAM
Так, мы определились с форматом первой сходки. Это будут митапы с нетворкингом и играми. Камерный тимбилдинг.
Теперь уже нужна максимальная вовлеченность тех, кто реально хочет поучаствовать. Пройдите опрос для примерного понимания списка гостей, времени и моментов организации.
Всем заинтересованным спасибо!🙏🏻
https://forms.gle/UiciPysajTNBpfTy8
Теперь уже нужна максимальная вовлеченность тех, кто реально хочет поучаствовать. Пройдите опрос для примерного понимания списка гостей, времени и моментов организации.
Всем заинтересованным спасибо!🙏🏻
https://forms.gle/UiciPysajTNBpfTy8
Google Docs
Митап в Москве
С форматом мы определились - это будут технические митапы с нетворкингом и неформальной обстановкой.
Теперь нужно определиться с потенциальным количеством участников. Если ты собираешься участвовать, то ответь на вопросы
Теперь нужно определиться с потенциальным количеством участников. Если ты собираешься участвовать, то ответь на вопросы
Прелести Москвы это понять с переездом насколько же прикольное приложение золотого яблока. Разрабы и дизайнеры - молодцы
Туториал от Antropics по промт-инженерингу
ИИ нас не заменит. Заменят люди, кто эффективно пользуется ИИ. Поэтому эту тему надо развивать и не стоять на месте.
За год вся эта тема из крепкого скептицизма до слепой истерии дошла до +- здоровую позицию. Мертвые сгенерированные текста бросаются сразу, но и сделанные в ручную контенты в умелых руках становятся богаче и продуманнее.
Вот и создатели Claude.ai поделились туториалми как сделать свою работу лучше
ИИ нас не заменит. Заменят люди, кто эффективно пользуется ИИ. Поэтому эту тему надо развивать и не стоять на месте.
За год вся эта тема из крепкого скептицизма до слепой истерии дошла до +- здоровую позицию. Мертвые сгенерированные текста бросаются сразу, но и сделанные в ручную контенты в умелых руках становятся богаче и продуманнее.
Вот и создатели Claude.ai поделились туториалми как сделать свою работу лучше
GitHub
GitHub - anthropics/prompt-eng-interactive-tutorial at dailydev
Anthropic's Interactive Prompt Engineering Tutorial - GitHub - anthropics/prompt-eng-interactive-tutorial at dailydev
Forwarded from Банки, деньги, два офшора
Путин обязал Apple предустанавливать RuStore на все новые iPhone и планшеты в России с 1 сентября. @bankrollo
Об алгоритмах на собеседовании
У меня, на первый взгляд, противоречивое мнение про алгоритмы. С одной стороны, я долго их решал и даже учавствовал в соревнованиях и шел "365 дней Богу Алгоритмов". С другой, я все также не умею проходить алгоритмические собеседования 😄
Опыт долгих тренировок определенно точно помог мне в кодинге, мышлении, какой-то базе. Но вот секции с алгосами для меня отдельный вид спорта 😂 Устно решать вслух != комфортненько молча за столом.
Но эти секции точно не стоит бояться. Мне нравится, как о них расписал наш руководитель отдела разработки Яндекс Еды Дима Александров @vit_ded
У нас во фронтендах часто не понимают зачем алгосы, а автор не редко сравнивает разные точки зрения и может найти сложные алгоритмы даже в нашей практике!
У меня, на первый взгляд, противоречивое мнение про алгоритмы. С одной стороны, я долго их решал и даже учавствовал в соревнованиях и шел "365 дней Богу Алгоритмов". С другой, я все также не умею проходить алгоритмические собеседования 😄
Опыт долгих тренировок определенно точно помог мне в кодинге, мышлении, какой-то базе. Но вот секции с алгосами для меня отдельный вид спорта 😂 Устно решать вслух != комфортненько молча за столом.
Но эти секции точно не стоит бояться. Мне нравится, как о них расписал наш руководитель отдела разработки Яндекс Еды Дима Александров @vit_ded
У нас во фронтендах часто не понимают зачем алгосы, а автор не редко сравнивает разные точки зрения и может найти сложные алгоритмы даже в нашей практике!
Telegram
Ворчливый IT-дед
28. Об алгоритмах на собеседованиях.
Многие не хотят проходить собеседования в Яндекс, потому что там 4 секции гоняют по алгоритмам, которые в работе совершенно не нужны. Миф это или реальность? Давайте разбираться.
Во-первых, уметь в алгоритмы правда…
Многие не хотят проходить собеседования в Яндекс, потому что там 4 секции гоняют по алгоритмам, которые в работе совершенно не нужны. Миф это или реальность? Давайте разбираться.
Во-первых, уметь в алгоритмы правда…
Действительно ли вы хорошо знаете SwiftUI?
Нашел супер крутую статью, о которой преступно умалчивают другие авторы.
В этой статье автор задает вопрос "А действительно ли вы хорошо знаете SwiftUI?".
Взяв самую популярную демо-задачу с Counter'ом он начинает подсвечивать самые частые заблуждения: начиная от использования незадокументированного _printChanges() заканчивая причинами зависаний экрана.
Ну и как бы очевидно другие могут сказать, что эту проблему можно решить разными манипуляциями LazyVStack. Но чтобы понять почему же у нас вообще возникает эта проблема, то нужно погрузиться глубже.
Автор круто подчеркивает, что SwiftUI лишь обманчив простотой. Чтобы сделать хороший по перфомансу лайаут нужно приложить много ресурсов и изучить много вещей, которые плохо задокументированы и требуют собрать мозаику знаний. Ну и главное, чтобы это все не сломал Apple со след версией iOS 🙂
Многие советы вам известные, но дают чуть контекста на проблему. Например, тема про POD vs Non-POD чуть лучше расскрывается.
P.S. Говорят, что одна из ключевых черт зрелого инженера — умение выбирать правильные инструменты. Ну и одно из моих любимых правил: Если слишком сложно, то возможно не ты тупой, а плохой дизайн и проектирование инструмента для этих задач. Попробуй взять или придумать другой инструмент.
Нашел супер крутую статью, о которой преступно умалчивают другие авторы.
В этой статье автор задает вопрос "А действительно ли вы хорошо знаете SwiftUI?".
Взяв самую популярную демо-задачу с Counter'ом он начинает подсвечивать самые частые заблуждения: начиная от использования незадокументированного _printChanges() заканчивая причинами зависаний экрана.
As you can see by adding .debugBackground() to every Text cell we can observe updating each cell whenever we click on theCounter +1 button. And as you remember we have 100_000 values🤯. That causes lagging! To be more precise — lagging is caused by the List cell creation behavior. Whenever List is created, it has to create all its inside items first because it needs to know how many items are on the screen. By clicking on the button we change the view state, and SwiftUI detects the state change and starts rebuilding the view, and because of the large number of values — this view rebuilds long.
Ну и как бы очевидно другие могут сказать, что эту проблему можно решить разными манипуляциями LazyVStack. Но чтобы понять почему же у нас вообще возникает эта проблема, то нужно погрузиться глубже.
Автор круто подчеркивает, что SwiftUI лишь обманчив простотой. Чтобы сделать хороший по перфомансу лайаут нужно приложить много ресурсов и изучить много вещей, которые плохо задокументированы и требуют собрать мозаику знаний. Ну и главное, чтобы это все не сломал Apple со след версией iOS 🙂
Многие советы вам известные, но дают чуть контекста на проблему. Например, тема про POD vs Non-POD чуть лучше расскрывается.
P.S. Говорят, что одна из ключевых черт зрелого инженера — умение выбирать правильные инструменты. Ну и одно из моих любимых правил: Если слишком сложно, то возможно не ты тупой, а плохой дизайн и проектирование инструмента для этих задач. Попробуй взять или придумать другой инструмент.
Medium
Mastering SwiftUI: Are You Really as Good as You Think?
How deep do you think you know what SwiftUI is and how it works? Have you ever wondered why…
Где бы вы использовали UIKit vs SwiftUI?
Anonymous Poll
17%
Пишу все на UIKit, не вижу пользы от SwiftUI
15%
Пишу все на SwiftUI, не вижу пользы от UIKit
34%
Пишу обычные коллекции на SwiftUI, а сложные на UIKit
2%
Пишу обычные коллекции на UIKit, а сложные на SwiftUI
22%
Писал только на UIKit, не знаю SwiftUI
5%
Писал только на SwiftUI, не знаю UIKit
16%
Другое
Swift Concurrency: что делает компилятор?
Я не считаю, что обучение по чужим статьям и твиторам — эффективно. Чаще это инфошум. Поэтому продолжаю структурировать и делым понятным то, что разбросано по кускам. Мы уже немного познакомились с Swift Concurrency по первоисточникам. Выяснили какие proposals почитать и какие wwdc посмотреть.
Теперь перейдем к кратким формулировкам и структурированию мозаик. Все абстракции и примерные мыслительные модели бесполезны, если мы не поймем как работает код.
Давайте по порядку. В теории, можно разделить все на такие ключевые слова:
- Компилятор ->
- State Machine ->
- suspension points ->
- Continuation ->
- Executor ->
- Co-operative thread pool
🟣 Компилятор и State Machine. Каждый раз, когда компилятор видит await, то он режет функцию на структуру с полем resumePoint. Разбивает код на блоки и вставляет переходы между ними.
🟣 Suspension points. Каждое await — это место приостановки. В интернете нет явной инфы, но общая формулировка такая: Функция приостанавливается и текущий стэк с переменными и позицией сохраняются в кучу. Создаётся continuation.
🟣 Continuation. Это объект, который хранит что делать дальше, после await. Он хранит в каком месте приостановилось выполнение, какие переменные были в контексте, что делать, когда результат будет готов.
🟣 Executor. Это условный планировщик, который решает, на каком потоке и когда выполнять async-код. Если continuation — это инструкция, то Executor — исполнитель. Сontinuation возобновляется и передаётся в executor, который решает где и когда продолжить выполнение.
🟣 Co-operative thread pool. Если Executor — это манагер задач, то Co-operative thread pool — это рабочие потоки, на которых Executor исполняет эти задачи. Это общий пул потоков, управляемый Swift Runtime. Потоки не создаются на каждую задачу, вместо этого задачи добровольно уступают выполнение, когда достигают await. Потоки переключаются на другие задачи, пока первая ждёт. Executor получает задачу, ставит ее в очередь и запускает на одном из потоков пулла.
Полезные ссылки:
- Apple Docs
- 0392-custom-actor-executors
- Swift concurrency: Behind the scenes
1/5
Я не считаю, что обучение по чужим статьям и твиторам — эффективно. Чаще это инфошум. Поэтому продолжаю структурировать и делым понятным то, что разбросано по кускам. Мы уже немного познакомились с Swift Concurrency по первоисточникам. Выяснили какие proposals почитать и какие wwdc посмотреть.
Теперь перейдем к кратким формулировкам и структурированию мозаик. Все абстракции и примерные мыслительные модели бесполезны, если мы не поймем как работает код.
Давайте по порядку. В теории, можно разделить все на такие ключевые слова:
- Компилятор ->
- State Machine ->
- suspension points ->
- Continuation ->
- Executor ->
- Co-operative thread pool
Swift implements asynchronous functions by transforming them into state machines. Each call to an asynchronous function and each await is a suspension point, where the function can suspend execution
“Continuations are the fundamental building block for suspending and resuming execution in Swift’s concurrency model.”
“The continuation resumes execution via an executor, which may be the same as the original or different, depending on actor context.”
Полезные ссылки:
- Apple Docs
- 0392-custom-actor-executors
- Swift concurrency: Behind the scenes
1/5
Please open Telegram to view this post
VIEW IN TELEGRAM
Swift Concurrency: Cooperative thread pool
Если затрагивать SC, то нельзя не остановиться отдельно на этой теме.
Для чего это придумали? GCD и DispatchQueue.global().async мог создавать на каждую задачу отдельный поток. Это приводит ко многим пролемам оптимизации, но главная — это thread explosion. Это когда создается слишком много потоков одновременно и врызваетсяжопа ОС.
Cooperative Thread Pool — это ключевая часть архитектуры Swift Concurrency. Если простыми словами, то это пул с потоками, которые делят CPU по договорённости. Swift Concurrency использует ограниченный пул потоков — примерно от 4 до 8, в зависимости от устройства и от кол-ва ядер в устройстве. Они уступают управление когда задача "приостанавливается" (await и Suspension points).
Swift runtime использует global concurrent executor. Этот executor основан на libdispatch (GCD), но с отдельной очередью с флагом COOPERATIVE. Это concurrent dispatch queue с названием com.apple.root.default-qos.cooperative. Даже если ты создашь тысячу Task { ... }, они не запустятся параллельно. Они будут ставиться в очередь и по очереди исполняться на тех же 8 потоках.
Чуть позже разберем пару НО и как Swift 6 помогает их избежать.
Полезные ссылки:
- How is the Cooperative Thread Pool integrated in Swift?
- Swift concurrency: Behind the scenes
- How does cooperative thread pool work?
- Limit Swift Concurrency's cooperative pool
2/5
Если затрагивать SC, то нельзя не остановиться отдельно на этой теме.
Для чего это придумали? GCD и DispatchQueue.global().async мог создавать на каждую задачу отдельный поток. Это приводит ко многим пролемам оптимизации, но главная — это thread explosion. Это когда создается слишком много потоков одновременно и врызвается
for _ in 0..<10_000 {
DispatchQueue.global().async {
// что-то делает
}
}
Cooperative Thread Pool — это ключевая часть архитектуры Swift Concurrency. Если простыми словами, то это пул с потоками, которые делят CPU по договорённости. Swift Concurrency использует ограниченный пул потоков — примерно от 4 до 8, в зависимости от устройства и от кол-ва ядер в устройстве. Они уступают управление когда задача "приостанавливается" (await и Suspension points).
Swift runtime использует global concurrent executor. Этот executor основан на libdispatch (GCD), но с отдельной очередью с флагом COOPERATIVE. Это concurrent dispatch queue с названием com.apple.root.default-qos.cooperative. Даже если ты создашь тысячу Task { ... }, они не запустятся параллельно. Они будут ставиться в очередь и по очереди исполняться на тех же 8 потоках.
Чуть позже разберем пару НО и как Swift 6 помогает их избежать.
Полезные ссылки:
- How is the Cooperative Thread Pool integrated in Swift?
- Swift concurrency: Behind the scenes
- How does cooperative thread pool work?
- Limit Swift Concurrency's cooperative pool
2/5
GitHub
swift/stdlib/public/Concurrency/GlobalExecutor.cpp at main · swiftlang/swift
The Swift Programming Language. Contribute to swiftlang/swift development by creating an account on GitHub.
Эстетика сырого текста в эпоху AI
Поговорим о важном культурном сдвиге. Я заметил, что в эпоху, когда ИИ умеет делать красиво, правильно и гладко это тупо перестаёт быть ценностью. Люди начинают искать неидеальность, трушность, эмоцию.
Очередной пересказ статьи, факт из доки, спор про интерпретации — перестали быть интересными. Люди начали искать живой опыт. Грубый, без ретуши и спецэффектов. Домашний, знакомый и понятный.
80% контента стало стерильным. Все утомились от «слишком правильного», которое не отличаешь от сотен других. Сырые же текста и контент стали более живыми.
Даже с играми и фильмами. Мне стали нравятся твердые четверки, кто не идеален. The Alters, expedition 33, tainted grail. Эти игры имеют уйму минусов, багов, но в них есть много плюсов, которые перевешивают. Они пахнут потом и любовью, а не пугающе белыми стенами больниц.
Я стал любить простоту. Ходить в самые обычные места. Есть самую обычную еду. Пить просто воду.
Мы стали будто жить по правилу «слишком идеально, чтобы быть настоящим».
Возможно, скоро неотредактированный текст станет новым жанром. Как raw photo в инсте или живой звук в музыке.
Люди захотят читать не идеальные тексты, а тексты с дыханием.
Поговорим о важном культурном сдвиге. Я заметил, что в эпоху, когда ИИ умеет делать красиво, правильно и гладко это тупо перестаёт быть ценностью. Люди начинают искать неидеальность, трушность, эмоцию.
Очередной пересказ статьи, факт из доки, спор про интерпретации — перестали быть интересными. Люди начали искать живой опыт. Грубый, без ретуши и спецэффектов. Домашний, знакомый и понятный.
80% контента стало стерильным. Все утомились от «слишком правильного», которое не отличаешь от сотен других. Сырые же текста и контент стали более живыми.
Даже с играми и фильмами. Мне стали нравятся твердые четверки, кто не идеален. The Alters, expedition 33, tainted grail. Эти игры имеют уйму минусов, багов, но в них есть много плюсов, которые перевешивают. Они пахнут потом и любовью, а не пугающе белыми стенами больниц.
Я стал любить простоту. Ходить в самые обычные места. Есть самую обычную еду. Пить просто воду.
Мы стали будто жить по правилу «слишком идеально, чтобы быть настоящим».
Возможно, скоро неотредактированный текст станет новым жанром. Как raw photo в инсте или живой звук в музыке.
Люди захотят читать не идеальные тексты, а тексты с дыханием.