Оказывается, некоторые опытные разработчики сознательно скручивают свой опыт в резюме и устраиваются на несколько мидл-позиций вместо одной сеньорской. Вот главные причины этого тренда:
Две мидл-зарплаты часто превышают доход сеньора, особенно если работать на западные компании. Финансовая выгода очевидна.
🔹 Притвориться мидлом на собеседовании.
🔹 Взять задачи под мидла, но делай их со скоростью сеньора.
🔹 Избегать лишних созвонов — говорить что «погружаешься в проект».
🔹 Автоматизировать рутину, использовать ИИ, оценивать задачи в 1.5-2 раза больше по срокам.
На мидл-позициях от тебя не ждут:
🔸 Архитектурных решений.
🔸 Участия в бесконечных созвонах.
🔸 Менторства.
🔸 Высокой ответственности за продукт.
Можно просто брать таски и закрывать их в 2 раза быстрее благодаря реальному опыту.
🔸 Придется работать по 10-12 часов в день.
🔸 Риск пересекающихся митингов.
🔸 Постоянное напряжение от двойной игры.
🔸 Возможность выгорания.
Схема работы «сеньор под прикрытием» может принести краткосрочную финансовую выгоду, но требует постоянного стресса, многозадачности и грозит выгоранием. Это тактический ход, а не стратегия карьеры — подходит только тем, кто готов платить за двойную зарплату своим временем и ментальным здоровьем.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👀18🔥11❤2👍2😁2🗿1
Происходит историческое событие: компания Apple начала переговоры с российскими властями о возможном размещении отечественного магазина приложений RuStore в App Store. Вот что известно на данный момент:
🔸 Неформальные договорённости уже достигнуты: Apple пообещала не блокировать размещение RuStore.
🔸 Переговоры ведутся при участии Минцифры и главы РФПИ Кирилла Дмитриева.
🔸 Технически это реализуемо: опыт ЕС показал, что альтернативные магазины могут работать на iOS.
🔸 Комиссии за установки: как Apple будет получать свою долю за скачивания через RuStore.
🔸 Геоограничения: вероятно, RuStore будет доступен только на территории РФ.
🔸 Техническая интеграция: как будет организован процесс предустановки, установки и обновления приложений.
1 сентября 2025 года — крайний срок для выполнения требований о предустановке российских магазинов приложений на всех смартфонах и планшетах, продаваемых в России.
🔹 В ЕС с марта 2024 года Apple уже позволяет устанавливать альтернативные магазины приложений.
🔹 Российские банки активно заинтересованы в возвращении своих приложений в iOS, так как сейчас они недоступны из-за санкций.
🔹 Технических преград нет, остались юридические и финансовые нюансы.
Я надеюсь, что RuStore скоро появится на iOS, ведь это откроет новые вакансии для разработчиков и даст пользователям долгожданный доступ к банковским и другим приложениям, которые исчезли из App Store из-за санкций.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🔥10👍5🙏2👏1👀1
Если вы когда-то спорили с коллегами о том, стоит ли помечать классы final для оптимизации производительности, сохраните эту статью. Она разложит все по полочкам.
Swift использует два принципиально разных подхода:
🔸 Статическая диспетчеризация: быстрая, но менее гибкая.
🔸 Динамическая диспетчеризация: медленнее, зато поддерживает полиморфизм.
Динамическая диспетчеризация может негативно влиять на производительность из-за:
🔸 Потери возможности оптимизации кода.
🔸 Увеличения вероятности кэш-промахов CPU.
🔸 Накладных расходов на поиск метода в таблицах.
Ключевой момент: если компилятор может определить адрес метода на этапе компиляции — используется статическая диспетчеризация. Иначе динамическая.
Встраивание (Inlining):
Компилятор может заменить вызов функции ее телом, чтобы избежать накладных расходов.
func square(_ x: Int) -> Int {
return x * x
}
let result = square(5)
// После оптимизации компилятор может превратить это в:
let result = 5 * 5 // 25 (вычислено на этапе компиляции!)
Прямая диспетчеризация (Direct Dispatch):
Используется для:
🔹 Структур.
🔹 Перечислений.
🔹 final классов.
🔹 static и private методов.
Почему это быстро?
Адрес метода известен заранее: CPU выполняет его за одну инструкцию.
Табличная (Virtual Table):
Каждый класс хранит таблицу методов. При вызове:
🔹 CPU ищет адрес метода в таблице.
🔹 Переходит по нему.
class Animal {
func sound() {
}
}
class Dog: Animal {
override func sound() {
}
}
let pet: Animal = Dog()
pet.sound() // Динамически выбирается Dog.sound()
Протокольная (Witness Table):
Аналогично табличной, но для протоколов:
protocol Drawable {
func draw()
}
struct Circle: Drawable {
func draw() {
}
}
let shape: Drawable = Circle()
shape.draw() // Вызов через witness table
Самая гибкая, но медленная диспетчеризация через Objective-C runtime:
class MyClass: NSObject {
@objc dynamic func message() {
}
}
// Вызов через objc_msgSend
Особенности:
🔹 Позволяет модифицировать поведение методов в runtime (swizzling).
🔹 Используется для KVO, Core Data и совместимости с Objective-C.
🔸 Проблема 1:
protocol P {
}
extension P {
func foo() {
print("Protocol")
}
}
class A: P {
func foo() {
print("Class")
}
}
let instance = A()
instance.foo() // Выведет: Class, динамическая диспетчеризация
let instance2: P = A()
instance2.foo() // Выведет: Protocol, статическая диспетчеризация
Решение проблемы:
protocol P {
func foo() // Добавили метод в протокол
}
extension P {
func foo() {
print("Protocol")
}
}
class A: P {
func foo() {
print("Class")
}
}
let instance = A()
instance.foo() // Выведет: Class, динамическая диспетчеризация
let instance2: P = A()
instance2.foo() // Выведет: Class, динамическая диспетчеризация
🔸 Проблема 2:
protocol P {
func foo()
}
extension P {
func foo() {
print("Protocol")
}
}
class A: P {
}
class B: A {
func foo() {
print("Class")
}
}
let instance = B()
instance.foo() // Выведет: Class
let instance2: A = B()
instance2.foo() // Выведет: Protocol
Решение проблемы:
protocol P {
func foo()
}
extension P {
func foo() {
print("Protocol")
}
}
class A: P {
func foo() { // Нужно реализовать метод
}
}
class B: A {
override func foo() {
print("Class")
}
}
let instance = B()
instance.foo() // Выведет: Class
let instance2: A = B()
instance2.foo() // Выведет: Class
Используйте final и private там, где это возможно, чтобы компилятор мог оптимизировать код. Динамическая диспетчеризация — мощный инструмент, но не всегда нужен. Баланс между гибкостью и производительностью — ключ к эффективному коду.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
❤20🔥16👍2🙏1🫡1 1
Новые Foundation Models от Apple — это не просто ещё один ИИ, а специально обученная модель для работы со Swift и SwiftUI. Рассказываю, как правильно с ней общаться.
🔸 Очень маленький контекст: всего 4096 токенов на всё (и вход и выход).
🔸 Жесткие ограничения безопасности: много ложных срабатываний.
🔸 Заточена под генерацию Swift-структур через Generable.
🔸 Работает полностью на устройстве: не нужен интернет.
Просто создайте Playgrounds.swift в проекте и экспериментируйте:
import Playgrounds
#Playground {
// Тестируйте промты здесь
let prompt = "Напиши функцию на Swift"
}
🔹 Guided Generation: используйте макрос Generable для чёткой структуры ответа.
🔹 Порядок свойств: ИИ генерирует последовательно, поэтому важные поля ставьте первыми.
🔹 Указание длины: пишите «подробно», «кратко», «три предложения» для контроля объёма.
🔹 temperature: 0.8 — более креативные ответы.
🔹 sampling: .greedy — детерминированные и предсказуемые.
🔹 maxTokens: 1000 — ограничение длины ответа.
🔹 Всегда обрабатывайте ошибки LanguageModelError.
🔹 Пользовательский ввод может триггерить защитные механизмы.
🔹 Имейте fallback-стратегии на случай блокировок.
🔹 Нативная интеграция со Swift.
🔹 Не нужно парсить JSON: работаете напрямую с объектами.
🔹 Мгновенное тестирование без API-вызовов.
🔹 Полная конфиденциальность: всё на устройстве.
Apple Foundation Models — это не просто ещё один инструмент ИИ, а качественно новый подход к разработке. Модель, специально обученная для работы со Swift и SwiftUI, позволяет интегрировать интеллектуальные функции напрямую в код — без сложных API, JSON-парсинга и внешних зависимостей. Всё работает локально, безопасно и с полной интеграцией в экосистему Apple.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍13 4❤1👀1
Опытные разработчики чаще принимают ИИ-инструменты, чем новички. Возможно, дело в уверенности: сеньоры не боятся что их заменят, а видят в ИИ помощника.
Как работает:
Бросаешь задачу в ChatGPT (или другие ИИ), получаешь готовый код и слегка его правишь.
Проблема:
Нет глубокого понимания кода, ментальная модель не строится.
Когда использовать:
Только для быстрых прототипов и экспериментов.
Риски:
Код может быть неоптимальным и со скытыми багами.
Как работает:
Тщательно проектируешь запросы, задаешь контекст, формат и ограничения, получаешь точный результат.
Преимущество:
Полный контроль над процессом, понимание каждой строки кода.
Идеально для:
Рутинных задач, шаблонного кода и документации.
Аналогия:
Как менторить джуна: даешь четкие инструкции и проверяешь результат.
Vibe-coding: эмоциональный подход «сгенерируй что-нибудь».
Prompt-engineering: инженерный подход «дай мне конкретное решение под мои требования».
🔹 Всегда включать голову: не важно откуда код: из ИИ, Stack Overflow или из статьи.
🔹 Дробить задачи: давать ИИ конкретные мелкие задания вместо «сделай все».
🔹 Тестировать и проверять: любой сгенерированный код требует ревью и тестов.
🔹 Учиться формулировать: прокачивать навык написания четких промтов.
ИИ не замена разработчику, а мощный инструмент. Как молоток: можно собрать мебель, а можно разбить палец. Все зависит от того, кто и как его использует.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤15 12🔥3🤔1🙏1
Шокирующая статистика из США: каждый 15-й молодой IT-специалист сейчас без работы. Среди программистов уровень безработицы достигает 7.5% — это выше, чем у гуманитариев и биологов!
🔸 Массовые сокращения в гигантах типа Amazon, Microsoft и Intel.
🔸 Вакансий для джунов стало на 21% меньше.
🔸 Нейросети забирают задачи новичков: код-ревью, тестирование, шаблонный код.
🔸 Переизбыток выпускников: 170K дипломов за год (вдвое больше чем 10 лет назад).
🔸 Индустрия повзрослела: меньше стартапов, больше поддержки легаси.
🔸 Смещение фокуса на senior-специалистов вместо массового найма джунов.
🔸 ИИ-революция: ChatGPT и Copilot заменяют начинающих разработчиков.
🔸 Постковидная коррекция: переоценка штата после бума удалёнки.
🔹 Прокачивать уникальные навыки, а не только один язык программирования и фреймворк.
🔹 Собирать портфолио: пет-проекты, фриланс с реальными кейсами.
🔹 Рассматривать смежные области, которые пока еще не заменит искусственный интеллект.
Рынок труда для новичков в IT серьёзно изменился. Теперь недостаточно просто закончить курсы, нужно предлагать реальную ценность и адаптироваться к новым реалиям.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16👀10🤯5 2🤔1🙏1🗿1
⏰ Работаем с таймерами через AlarmKit: новый фреймворк Apple.
На WWDC 2025 представили AlarmKit — фреймворк для создания будильников и таймеров, которые работают даже в беззвучном режиме и при активном Focus. В отличие от обычных уведомлений, AlarmKit всегда показывает баннер и воспроизводит звук!
1️⃣ Запрос разрешения.
Добавим в Info.plist ключ NSAlarmKitUsageDescription с описанием, зачем приложению нужны таймеры. Затем запросим авторизацию:
2️⃣ Настройка таймера.
Создадим кастомизированный алерт и атрибуты:
3️⃣ Live Activity и Dynamic Island.
Добавим виджет для отображения обратного отсчета на экране блокировки и в Dynamic Island:
4️⃣ Список активных таймеров.
Использование alarmUpdates для отслеживания состояния:
⚠️ Практические советы.
🔹 Всегда проверяйте статус авторизации authorizationState перед планированием.
🔹 Используйте кастомные метаданные через AlarmMetadata для передачи дополнительной информации.
🔹 Для паузы/возобновления используйте методы pause() и resume().
🔹 Обрабатывайте ошибки отмены через try-catch.
❌ Важные ограничения.
🔸 Максимальное количество активных будильников: 50 на устройство.
🔸 Минимальная длительность таймера: 1 секунда.
🔸 Максимальная длительность: 23 часа 59 минут 59 секунд.
💡 Вывод:
AlarmKit — мощный инструмент для создания надежных таймеров, но требует настройки нескольких компонентов. Идеально для кулинарных таймеров, напоминаний и любых приложений, где важно точное время.
➡️ Подписаться на канал
Мобильный трудоголик
На WWDC 2025 представили AlarmKit — фреймворк для создания будильников и таймеров, которые работают даже в беззвучном режиме и при активном Focus. В отличие от обычных уведомлений, AlarmKit всегда показывает баннер и воспроизводит звук!
Добавим в Info.plist ключ NSAlarmKitUsageDescription с описанием, зачем приложению нужны таймеры. Затем запросим авторизацию:
import AlarmKit
let manager = AlarmManager.shared
let state = try await manager.requestAuthorization()
Создадим кастомизированный алерт и атрибуты:
let alert = AlarmPresentation.Alert(
title: "Готово!",
stopButton: AlarmButton(text: "Готово", systemImageName: "checkmark")
)
let attributes = AlarmAttributes<TimerData>(
presentation: AlarmPresentation(alert: alert),
tintColor: .blue
)
let timer = try await manager.schedule(
id: UUID(),
configuration: .timer(duration: 30, attributes: attributes)
)
Добавим виджет для отображения обратного отсчета на экране блокировки и в Dynamic Island:
// В виджете:
Text(timerInterval: Date.now...countdown.fireDate)
.monospacedDigit()
Использование alarmUpdates для отслеживания состояния:
for await alarms in AlarmManager.shared.alarmUpdates {
// Обновляем список таймеров
}
🔹 Всегда проверяйте статус авторизации authorizationState перед планированием.
🔹 Используйте кастомные метаданные через AlarmMetadata для передачи дополнительной информации.
🔹 Для паузы/возобновления используйте методы pause() и resume().
🔹 Обрабатывайте ошибки отмены через try-catch.
🔸 Максимальное количество активных будильников: 50 на устройство.
🔸 Минимальная длительность таймера: 1 секунда.
🔸 Максимальная длительность: 23 часа 59 минут 59 секунд.
AlarmKit — мощный инструмент для создания надежных таймеров, но требует настройки нескольких компонентов. Идеально для кулинарных таймеров, напоминаний и любых приложений, где важно точное время.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20 7❤5🔥2🙏1
Знаете ли вы, что можно ускорить модерацию приложения в App Store? Рассказываю про официальный способ от Apple - Expedited App Review.
🔸 Заполняете форму на сайте Apple Developer.
🔸 Уже через 15 минут приложение переходит в статус «На проверке» (вместо стандартных 1-3 дней!).
🔸 В среднем за 25-30 минут проверка завершается и приложение готово к релизу.
🔹 Автоповтор: если билд отклонили, следующий билд с исправлением проблемы автоматически пройдет ускоренную проверку.
🔹 Без лишних вопросов: не нужно объяснять причину (но лучше иметь вескую).
🔹 Работает для обновлений: не только для новых приложений, но и для апдейтов.
🔹 Срочные фиксы: идеально подходит для критических багов или срочных юридических требований.
🔹 Только для отправленных билдов: ускоренной обработке подлежат только те заявки, которые уже были отправлены на обычную проверку в App Store Connect.
🔸 Не для частого использования: Apple рекомендует использовать не более 1-2 раз в год.
🔸 Могут отказать: если сочтут причину недостаточно веской (письмо придет на почту).
🔸 Не для всех случаев: не подходит для обычных обновлений без срочности.
🔸 Риск израсходовать возможность: при злоупотреблении могут временно заблокировать доступ к данной функциональности.
🔹 Перейдите на страницу связи с поддержкой Apple Developer.
🔹 Выберите App Review, затем Expedited App Review Request.
🔹 Заполните форму.
🔹 Отправьте и ждите результата.
Так же, можно сразу перейти на страницу Expedited App Review по ссылке.
Expedited App Review - отличный инструмент для критических ситуаций, но не стоит использовать его для каждого обновления.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍8 2🔥1🙏1
Многие думают, что программисты целый день пьют кофе и иногда пишут код. На самом деле всё сложнее и я расскажу, как сохранить продуктивность и не выгореть.
⏰ Утро: запускаем мозг правильно.
Не стоит сразу садиться за ноутбук, сначала нужно правильно настроиться на работу. Вот что может помочь:
🔹 Контрастный душ или хотя бы обычный, это поможет проснуться лучше чем кофе.
🔹 Стакан воды и легкая зарядка.
🔹 Свежий воздух (открытое окно или короткая прогулка).
🔹 Спокойный завтрак без смартфона (без ленты новостей и рабочих чатов).
🏢 Офис vs удаленка: где лучше?
В офисе:
Дома:
🗓 Как организовать рабочий день:
🔹 Программирование занимает только ~50% времени.
🔹 Остальное: созвоны, обсуждения, планирование.
🔹 Делайте перерывы каждые 1.5-2 часа.
🔹 Вставайте из-за стола, пройдитесь, разомнитесь.
Работа ночью кажется продуктивной, но это иллюзия:
🔸 Критическое мышление отключается первым.
🔸 Код получается сложным и запутанным.
🔸 На исправление ошибок уходит в 3 раза больше времени.
🏃♂️ Баланс и хобби:
🔸 Обязательно занимайтесь спортом или физической активностью.
🔸 Выбирайте хобби, не связанные с компьютером.
🔸 Живое общение с друзьями лучше соцсетей.
🔸 Не работайте в выходные — это путь к выгоранию.
🔹 Работайте в рабочее время.
🔹 Отдыхайте без чувства вины.
🔹 Двигайтесь, сидячий образ жизни убивает.
🔹 Находите время для себя и близких.
Успешный айтишник не тот, кто кодит 24/7, а тот кто умеет грамотно организовать свой день, отдыхать и сохранять баланс.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤4👍2 1
С появлением нейросетей в программировании возник неожиданный тренд — всё чаще требуется не просто сгенерировать код, а довести его до ума. Так родилась новая роль: Vibe code cleanup specialist — специалист, который превращает сырой ИИ-код в чистый, поддерживаемый и эффективный код.
Эти эксперты уже активно предлагают свои услуги на фриланс-биржах и даже добавляют этот навык в резюме. Их задача — не просто исправить ошибки, но и улучшить читаемость, оптимизировать производительность и адаптировать код под стандарты проекта.
По сути, ИИ не заменяет разработчиков, а создаёт новые ниши: кто-то учится писать промпты, кто-то делает инструменты для работы с нейросетями, а кто-то специализируется на «чистке» кода.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14 3❤2🔥1🙏1👀1
Разберем ключевые компоненты AVFoundation для работы с камерой: от подключения устройств до преобразования сырых данных в готовое изображение. Поймем разницу между AVCapturePhoto, CGImage и SwiftUI Image
🧩 Основные компоненты:
🔸 Input: устройство, которое может передавать видео, фото или аудио. Например задняя камера, фронтальная камера или встроенный микрофон.
🔸 Output: фактический вывод устройства. Это может быть фото или видео сохраненные на диске. Либо обработанный вами объект. Например: обнаруженные лица, отсканированные штрихкоды или примененные фильтры.
🔸 Preview: вывод изображения с камеры.
🔸 Stream: непрерывный поток кадров. Обычно вы снимаете один кадр как фотографию или серию кадров как видео. Хотя современные камеры часто объединяют кадры из-за слабого освещения, уменьшения шума и т. д. Поток также доступен для предварительного просмотра.
🔸 Session: объект, предоставляющий интерфейс для добавления/удаления входов и выходов, а также настройки конфигурации сеанса. Позволяет начинать и завершать сеанс.
🔸 Захват фото: асинхронный: метод capturePhoto не возвращает фото сразу — камере нужно время на фокусировку, экспозицию и, возможно, вспышку.
🔸 Разное качество: фото захватываются в максимальном разрешении, а превью — в низком для плавности.
Камера -> AVCapturePhoto -> Декодирование -> CGImage -> Image (SwiftUI) -> отображение на экране
Либо сохранение в Фото -> PHAsset (ссылка на медиатеке).
🔹 AVCapturePhoto: сырые данные с камеры (ещё не отображенные).
🔹 PHAsset: ссылка на фото/видео в медиатеке (не содержит пиксели).
🔹 CGImage: растровое изображение (можно рисовать).
🔹 Image (SwiftUI): view для отображения.
💻 Тестирование:
🔹 На iOS-симуляторе камера не работает, поэтому лучше тестировать на реальном устройстве.
🔹 На macOS можно тестировать через встроенную камеру Mac.
AVFoundation — мощный, но сложный фреймворк. Главное — понять роль каждого компонента и их взаимодействие.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15 4❤3👍1👏1👀1🤝1
В iOS 26 UIKit получил множество обновлений, которые упрощают разработку и добавляют новые возможности. Вот основные изменения:
🎨 UIGlassEffect.
Liquid Glass — главная фишка iOS 26:
🔹 UIGlassEffect: стильные стеклянные эффекты Liquid Glass с настройкой цвета и интерактивности.
🔹 UICornerConfiguration: гибкое управление скруглением углов (вплоть до адаптивных под форму экрана).
🔹 Обновлённые UIBarButtonItem: новые стили, бейджи и улучшенная анимация между навигационными панелями.
📝 UITextField и UITextView.
🔹 В UITextField появились новые методы для поддержки функции Natural Selection:
— textField(_:shouldChangeCharactersInRanges:replacementString:) заменяет старый метод.
— textField(_:editMenuForCharactersInRanges:suggestedActions:) также обновлён.
🔹 UITextView теперь использует selectedRanges вместо selectedRange, что улучшает работу с текстом, содержащим смешение направлений (LTR и RTL).
🖼️ Работа с цветом.
🔹 HDR-цвета в UIColor: поддержка высокого динамического диапазона с контролем экспозиции.
🔹 Обновлённый UIColorPickerViewController: слайдер для настройки HDR и опция отключения пипетки.
📱 Навигация и интерфейс.
🔹 UINavigationItem теперь поддерживает:
— Attributed-заголовки и подзаголовки.
— Кастомные subtitleView и largeSubtitleView.
— Гибкое размещение searchController (в навигационной панели или тулбаре).
🔹 Интерактивное закрытие: свайп для возврата (работает даже со скрытой кнопкой назад).
🔹 Новая колонка Inspector в UISplitViewController: для боковых панелей в стиле macOS.
🔹 Гибкая настройка ширины: минимальные/максимальные значения для secondary и inspector колонок.
🔄 UIAction и UIApplicationDelegate.
Добавлены новые идентификаторы действий, а также постепенно происходит переход от UIApplicationDelegate к UISceneDelegate и UIWindowSceneDelegate.
🔹 UISlider: новые стили (включая бесползунковый) и гибкая настройка трека с тиками.
🔹 UITabBarController: bottomAccessory для плавающих панелей (как в Music).
🔹 Свертывание таббара: автоматическое скрытие при прокрутке.
🔹 Наблюдение за свойствами: автоматический трекинг изменений в
@Observable объектах.🔹 Анимации: новый параметр .flushUpdates для автоматического обновления констрейнтов.
🔹 Безопасная область: новый LayoutRegion с учётом скруглений экрана и системных элементов.
🔸 Многие deprecated-методы UIApplicationDelegate перенесены на UISceneDelegate.
🔸 Улучшена поддержка правого-налево и смешанного текста (Natural Selection).
🔸 VisionOS: сохранение окон в пространстве и опции их автоматического удаления.
Это лишь часть изменений, но уже очевидно, что iOS 26 делает UIKit мощнее и удобнее для разработчиков.
UIKit всё ещё жив и активно развивается, особенно в области кастомизации, HDR и адаптации под новые форм-факторы.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🔥4 4👍1🤝1
Знакомо чувство, когда кажется, что твоя работа просто писать код, а все остальное (бизнес-логика, коммуникация, командная работа) должно волновать кого-то другого? Давайте разберемся, почему это опасное заблуждение.
🔸 Компаниям нужны команды, а не гении-одиночки. 90% проектов требуют слаженной работы, а не гениального кода одного человека.
🔸 Токсичных спецов терпят только до первого кризиса. Да, есть в ИТ «вундеркинды», которые тянут весь проект самостоятельно, но их карьера коротка и непредсказуема.
🔸 Без софт-скилов вас просто не возьмут. Даже джунам теперь нужны базовые навыки коммуникации.
🔸 Понимание бизнеса = более верные решения, меньше багов и переделок.
🔸 Коммуникация = умение вовремя донести проблему и правильно понять суть задач.
🔸 Спокойствие и адекватность = меньше конфликтов и токсичности, больше продуктивности.
🔹 Учитесь слушать. Часто проблема не в том, что вы не умеете говорить, а в том, что не слышите других.
🔹 Задавайте вопросы. Лучше уточнить, чем неделями чинить неправильную задачу.
🔹 Обратная связь. Учитесь давать ее корректно и принимать без обид.
🔹 Минимум токсичности. Даже простое «спасибо» в чатах улучшает атмосферу в команде.
🔹 Практикуйте простое объяснение. Если вы можете объяснить задачу так, чтобы понял стажер, значит вы ее и сами хорошо понимаете.
Хороший разработчик нужен всегда, но хороший программист с софт-скилами ценится в разы выше. Такой разработчик быстрее растет, чаще получает интересные задачи и становится тем, кого зовут в проекты снова и снова.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14 6👍4🔥1🤯1👀1
Официально в Xcode 26 нельзя просто добавить Gemini, но есть лайфхак с прокси! Рассказываю, как заставить их работать вместе.
Xcode ожидает API с классической структурой URL (/v1/...), а у Gemini путь другой — /v1beta/openai/. Но это решаемо!
Открываем настройки (Settings), Intelligence, Add Model Provider:
Type: Internet Hosted
URL: https://generativelanguage.googleapis.com/
API Key: Bearer YOUR_API_KEY
API Key Header: Authorization
Description: Gemini (или как хотите)
Сохраняем и закрываем Xcode.
Скачиваем Proxyman (или другой) и настраиваем перехват запросов от Xcode. После чего добавляем скрипт для подмены URL:
function onRequest(context, url, request) {
request.path = request.path.replace("/v1/", "/v1beta/openai/");
return request;
}
Этот скрипт автоматически исправит пути запросов на лету.
Запускаем Proxyman, затем открываем Xcode, настройки, Intelligence. Видим список моделей Gemini (если всё настроено верно).
Пишем как обычно, Xcode будет отправлять запросы через прокси к Gemini. Например: «Добавь кнопку и переведи интерфейс на английский» и код генерируется!
🔸 Proxyman должен быть запущен во время работы с Xcode.
🔸 Цена вопроса: Gemini дешевле многих аналогов ($0.125 за 1M токенов).
🔸 Качество: Gemini 2.5 Flash показывает отличные результаты в код-генерации.
Теперь можно использовать Gemini прямо в Xcode
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤2 2🔥1👀1🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
Отличные новости для тех, кто пишет тесты, в Swift 6.2 появилась возможность использовать сырые идентификаторы (Raw Identifiers) для названий функций!
Просто заключаете название функции в обратные кавычки:
// Было:
func testUserLoginWithInvalidCredentials()
// Стало:
func `Test user login with invalid credentials`()
🔹 Тесты: читаемые названия с пробелами вместо camelCase.
🔹 DSL и библиотеки: специальные символы в названиях методов.
🔹 Эксперименты: временные функции с описательными названиями.
🔹 Миграция: совместимость с кодом из других языков.
🔸 Работает только с обратными кавычками, без них компилятор ругнется.
🔸 Не злоупотребляйте, для продакшн-кода лучше использовать традиционные имена.
🔸 Отлично сочетается с XCTest, делает названия тестов самодокументируемыми.
Интересная фича, которая особенно порадует авторов тестов и создателей DSL. Теперь можно писать по-человечески, с понятные названиями.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥5 4❤3🤯1
Последнее время всё чаще слышу этот вопрос. Давайте разберёмся: что на самом деле происходит с мобилкой?
🔸 Найм замер – компании берут только сеньоров, джунам пробиться почти нереально.
🔸 Технологический застой – ничего революционного (после SwiftUI, async/await, Flutter, KMM, Jetpack Compose).
🔸 Смартфоны перестали удивлять – Apple и Samsung 5 лет выпускают «одно и то же».
🔸 Конференции скукожились – где тот размах Mobile World Congress или Mobius?
Мобильная разработка не умирает – она перестала быть хайповой.
🔹 Mobile-First умер? Да, теперь все говорят про AI-First.
🔹 Значит ли это, что мобилки больше нет? Нет – просто она стала стандартной индустрией, как веб-разработка.
🔸 Сильные разработчики останутся: спрос на опытных iOS/Android разрабов никуда не денется.
🔸 Новичкам будет сложнее: входной барьер вырос в разы.
🔸 Фокус сместится на интеграцию: AI, AR, кроссплатформа (Flutter, KMM).
Мобильная разработка больше не «золотая лихорадка», но остаётся стабильной областью для профессионалов.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👀16🫡7🗿4❤1🤔1🤯1
Работа с памятью — одна из самых сложных тем в разработке мобильных приложений. Если не уделять этому внимание, приложение начнёт тормозить, вылетать или даже «съедать» всю память устройства.
Существует два подхода к управлению памятью:
🔹 Реактивный: решаем проблемы по мере их появления. Подходит для небольших проектов с жёсткими дедлайнами, но может привести к серьёзному техдолгу.
🔹 Проактивный: заранее оптимизируем код, используем правильные инструменты и следим за потреблением памяти. Это сложнее, но экономит время в долгосрочной перспективе.
Загрузка больших изображений — частая причина утечек. Что делать?
🔹 Используйте Image I/O для создания миниатюр.
🔹 Загружайте картинки лениво (например, через AsyncImage или Kingfisher).
🔹 Храните ассеты в каталогах — они автоматически оптимизируются под разные устройства.
Core Data хранит изменения в памяти до сохранения (save()). Если откладывать сохранение слишком долго — память заполнится. Если сохранять слишком часто — нагрузка на диск возрастёт. Нужен баланс.
Этот класс позволяет системе автоматически освобождать память при нехватке. Просто оберните в него данные и вызывайте beginContentAccess() при необходимости.
🔹 В SwiftUI используйте LazyVStack и LazyHStack, чтобы загружать элементы только при появлении на экране.
🔹 В коде применяйте lazy var для редко используемых свойств (например, кэшированных изображений).
Они проще в управлении памятью, так как не создают retain-циклов и освобождаются сразу после выхода из области видимости.
🔹 Используйте NSCache — он автоматически очищается при нехватке памяти.
🔹 Избегайте сильных ссылок на большие объекты.
🔹 Реализуйте свою стратегию очистки (например, по времени или частоте использования).
Если данные больше не нужны (например, пользователь ушёл в другой раздел приложения), освобождайте память: останавливайте таймеры, отменяйте запросы, выгружайте тяжелые ресурсы.
🔹 Используйте Memory Graph Debugger в Xcode.
🔹 Проверяйте retain-циклы в замыканиях ([weak self]), делегатах и связях View-ViewController.
🔹 Регулярно запускайте Instruments (Leaks) во время тестирования.
Управление памятью — это баланс между производительностью и потреблением ресурсов. Чем раньше вы начнёте следить за этим, тем стабильнее будет ваше приложение.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤18👍4🙏3🔥2 1
Компания Apple представила новый API SpeechAnalyzer — мощный инструмент для работы с аудио в iOS 26. Рассказываю, как интегрировать его в ваше приложение для преобразования речи в текст.
AudioManager:
Управляет доступом к микрофону и аудиосессией. Обрабатывает разрешения и потоковую передачу аудиобуферов в реальном времени.
BufferConverter:
Преобразует аудиобуферы между форматами — критично для совместимости с SpeechAnalyzer.
TranscriptionManager:
Координирует весь процесс: запрос разрешений, запуск транскрипции и обработку результатов.
// Пример обработки аудиобуфера
func processAudioBuffer(_ buffer: AVAudioPCMBuffer) throws {
guard let inputBuilder, let analyzerFormat else { return }
let converted = try converter.convertBuffer(buffer, to: analyzerFormat)
inputBuilder.yield(AnalyzerInput(buffer: converted))
}
🔸 Требуются разрешения Microphone и Speech Recognition.
🔸 Оптимизирован для длинных аудиозаписей.
🔸 Лучше работает с голосом на расстоянии.
🔹 Голосовые заметки.
🔹 Субтитры в реальном времени.
🔹 Голосовые сообщения в мессенджерах.
🔹 Голосовое управление приложением.
🔹 Анализ аудиоконтента.
SpeechAnalyzer открывает новые возможности для голосовых интерфейсов. Хотя API ещё сыроват, его уже можно использовать в проектах — главное не забывать про обработку ошибок и проверку разрешений.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16 4👍3❤1👏1
В Xcode 26 появился революционный подход к работе с многозадачностью: Approachable Concurrency. Это не просто одно изменение, а целый набор фич, которые делают конкурентный код проще и предсказуемее.
🔸 nonisolated(nonsending) By Default: неизолированные async-функции теперь выполняются на исполнителе вызывающего актора.
🔸 Infer Sendable for Methods: автоматическое определение Sendable для методов и key-path.
🔸 Infer Isolated Conformances: автоматическая изоляция протокольных конформянсов под актор типа.
🔸 Глобальная изоляция типов: умное определение безопасного использования неизолированных свойств.
🔸 Отключение неявной изоляции: больше не нужно бороться с неожиданной изоляцией через property wrappers.
В Xcode:
🔹 Идем в Build Settings, затем ищем «Approachable Concurrency».
🔹 Устанавливаем значение: Yes.
В Swift Package:
swift
// swift-tools-version: 6.2
.target(
name: "MyFeature",
swiftSettings: [
.defaultIsolation(MainActor.self),
.enableUpcomingFeature("NonisolatedNonsendingByDefault"),
.enableUpcomingFeature("InferIsolatedConformances")
]
)
🔸 Меньше неожиданностей: компилятор стал умнее определять реальные data races.
🔸 Более понятные ошибки: никаких загадочных сообщений о проблемах изоляции.
🔸 Естественный прогресс: начинаете с main actor, переходите на фоновые потоки только когда нужно.
🔹 В Swift 6 некоторые фичи включены по умолчанию.
🔹 Для Swift 5 нужно явное включение через настройки.
🔹 Пока есть некоторые баги (например, с CodingKey), но они исправляются.
Approachable Concurrency — это большой шаг к тому, чтобы многозадачность в Swift стала более понятной и удобной для всех разработчиков.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16 8❤4🔥2🙏1👀1🫡1
Получили шаблонное письмо с отказом? Первая реакция — разочарование и самокритика. Но в 80% случаев причина не в вас лично.
🔸 Внутренний трансфер: вакансию создали под конкретного сотрудника.
🔸 Скрытый фриз: нанимают только senior-специалистов или приостановили найм.
🔸 Изменился портрет кандидата: ищут человека с опытом в другой индустрии.
🔸 Психологическая несовместимость: руководитель ощутил «не тот vibe».
🔸 Другой кандидат согласился на меньшую зарплату.
🔸 Вы были «запасным вариантом».
🔸 HR перегружен и не провел полноценный скрининг.
🔸 Вакансию закрыли из-за реорганизации.
🔹 Запросите конструктивный фидбек, спросите: «Какие конкретно навыки мне стоит прокачать?».
🔹 Сохраните контакт: добавьте HR в контакты LinkedIn или сохраните контакт в Telegram.
🔹 Предложите остаться в кадровом резерве: 37% компаний возвращаются к отказавшим кандидатам.
🔹 Проанализируйте этапы: если отказ после скрининга — работайте над резюме, после технического собеседования — над технические-скиллы.
Важный момент: создайте таблицу для отслеживания откликов с колонками:
🔹 Компания
🔹 Этап отказа
🔹 Полученный фидбек
🔹 Дата повторного контакта
Через 3 месяца напишите обновление: «Прошёл курс по X, добавил в портфолио Y. Хотел бы попробоваться на вашу позицию».
Помните:
🔸 Средний специалист получает 7 отказов перед оффером.
🔸 20% предложений поступают от компаний, которые ранее отказывали.
🔸 Каждый отказ это тренировка переговорных навыков.
Не сжигайте мосты, мир IT тесен. Вежливость и профессиональное поведение после отказа часто вознаграждаются.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤8 5🔥2👀1🫡1
В современных приложениях часто возникает необходимость скрывать конфиденциальную информацию от случайного попадания в скриншоты. SwiftUI предоставляет элегантное решение этой проблемы через комбинацию UIViewRepresentable и системных механизмов защиты.
Основная идея заключается в использовании Secure TextField, который iOS автоматически размывает при попытке захвата экрана. Вот как это можно реализовать:
struct SecureContentWrapper<Content: View>: UIViewRepresentable {
let content: Content
func makeUIView(context: Context) -> UIView {
let hostingController = UIHostingController(rootView: content)
let secureField = UITextField()
secureField.isSecureTextEntry = true
secureField.addSubview(hostingController.view)
return secureField
}
func updateUIView(_ uiView: UIView, context: Context) {}
}
struct ContentProtector: ViewModifier {
@State private var contentSize: CGSize = .zero
func body(content: Content) -> some View {
SecureContentWrapper(content: content)
.frame(width: contentSize.width, height: contentSize.height)
.background(
GeometryReader { proxy in
Color.clear
.preference(key: ContentSizePreference.self, value: proxy.size)
}
)
.onPreferenceChange(ContentSizePreference.self) { size in
self.contentSize = size
}
}
}
struct ContentSizePreference: PreferenceKey {
static var defaultValue: CGSize = .zero
static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
value = nextValue()
}
}
extension View {
func protectContent() -> some View {
self.modifier(ContentProtector())
}
}
struct PrivateDataView: View {
var body: some View {
VStack {
Text("Номер карты: 1234 **** **** 5678")
.font(.title)
Text("Срок действия: 12/34")
Text("CVV: 123")
}
.padding()
.background(Color.gray.opacity(0.1))
.cornerRadius(12)
.protectContent()
}
}
🔸 Защита работает только при активном захвате экрана.
🔸 Не предотвращает фотографирование экрана другим устройством.
🔸 Для максимальной безопасности комбинируйте с другими методами.
Данное решение весьма актуально для банковских, медицинских и других приложений, работающих с персональными данными.
Главное преимущество подхода: его простота и отсутствие необходимости в сложных вычислениях или дополнительных разрешениях.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤8 5🔥2🙏2🤝1🫡1