«Стартап-атмосфера» = хаос и переработки, «возможность профессионального роста» = будете работать за четверых. Составили словарь корпоративного новояза и список неудобных вопросов, которые стоит задать на собеседовании, чтобы не попасть в ловушку.
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
💻 ВАЖНО: макбук ещё не забрали!
Proglib.academy продолжает розыгрыш MacBook Pro 14» (M3 Pro, 36 Гб, 1 Тб SSD).
Что нужно для участия?
— Берёшь любой курс Академии до 15 ноября.
— Проходишь хотя бы 2 недели обучения (можно за два дня ).
— Пишешь куратору #розыгрыш. Всё — ты в игре!
Что за курсы?
▫️Алгоритмы и структуры данных — если хочешь готовиться к собесам в Яндекс, FAANG и не сидеть на джуне вечно.
▫️Архитектуры и шаблоны проектирования — учат думать как senior, а не просто писать код.
▫️ Python, математика для DS, основы IT и другие темы — можно стартовать с нуля или усилить то, что уже знаешь.
👉 Влетай, не думай!
Proglib.academy продолжает розыгрыш MacBook Pro 14» (M3 Pro, 36 Гб, 1 Тб SSD).
Что нужно для участия?
— Берёшь любой курс Академии до 15 ноября.
— Проходишь хотя бы 2 недели обучения (
— Пишешь куратору #розыгрыш. Всё — ты в игре!
Что за курсы?
▫️Алгоритмы и структуры данных — если хочешь готовиться к собесам в Яндекс, FAANG и не сидеть на джуне вечно.
▫️Архитектуры и шаблоны проектирования — учат думать как senior, а не просто писать код.
▫️ Python, математика для DS, основы IT и другие темы — можно стартовать с нуля или усилить то, что уже знаешь.
👉 Влетай, не думай!
❤2
Приготовили для вас дайджест по актуальному из мира iOS, Android.
В этой статье автор поделиться опытом использования snapshot-тестов, начиная с этапа внедрения. Статья будет полезна для QA и iOS-разработчиков разных уровней. Обсудит не только теорию, но и напишет реальный snapshot-тест — как в практике hh.
Надеюсь, когда придёт время, вы вспомните представленные здесь решения и сочтёте их полезными.
В этой статье автор рассмотрит настройку автоматической сборки Flutter-приложения для iOS с использованием Fastlane на macOS.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
По своей задумке, функция расширения Kotlin — это дополнительный метод для любого объекта, даже для потенциально несуществующего (нуллабельного). Этот инструмент является прямой реализацией переопределения методов паттерна проектирования Декоратор.
ВАЖНО: В функциях расширения мы можем обращаться к любым общедоступным свойствам и методам объекта, однако не можем обращаться к свойствам и методам с модификаторами
private и protected.ВАЖНО: Функции расширения не переопределяют функции, которые уже определены в классе. Если функция расширения имеет ту же сигнатуру, что и уже имеющаяся функция класса, то компилятор просто будет игнорировать подобную функцию расширения.
Определение аналогично определению обычной функции за тем исключением, что после слова
fun идет название типа, для которого определяется функция, и через точку название функции. Определим пару функций расширения к типам Int и String:fun main() {
val hello: String = "hello world"
println(hello.wordCount('l')) // 3
println(hello.wordCount('o')) // 2
println(4.square()) // 16
println(6.square()) // 36
}
fun String.wordCount(c: Char) : Int {
var count = 0
for(n in this) {
if(n == c) count++
}
return count
}
fun Int.square(): Int {
return this * this
}Для типа Int определена функция возведения в квадрат. В каждой функции расширения через ключевое слово
this мы можем ссылаться на текущий объект того типа, для которого создается функция. Например, в функции:fun Int.square(): Int {
return this * this
}Через
this обращаемся к тому объекту, для которого будет вызываться функция. И затем вы можем вызвать ее следующим образом:4.square() // 16
Для типа
String определена функция wordCount, которая подсчитывает, сколько встречается определенный символ в строке.#буст #JuniorKit #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
ToolbarContent и @ToolbarContentBuilderПо мере роста проектов SwiftUI одна из частых проблем — управление сложными иерархиями представлений. Даже простой экран может быстро превратиться в десятки вложенных модификаторов. После снятия лимита в 10 вложенных представлений стало проще писать глубоко вложенные
body, но код стал труднее читать и сопровождать.🔹 Разбираем крупные реализации body
Когда
body растягивается на десятки строк, страдает читаемость. Лучше разбивать большие представления SwiftUI на мелкие подпредставления или выделять повторно используемые части в вычисляемые свойства или функции. Это сохраняет лаконичность и упрощает понимание, тестирование и повторное использование.Тот же принцип применим к невизуальным элементам, например панелям инструментов, которые быстро разрастаются при добавлении множества кнопок и пунктов меню.
🔹 Проблема с панелями инструментов
Модификатор
.toolbar позволяет создавать кнопки, меню и элементы управления, адаптируемые под разные платформы. Но если элементов становится много, код внутри .toolbar { ... } быстро теряет читаемость.Перенести логику в вычисляемое свойство нельзя —
.toolbar ожидает содержимое, соответствующее ToolbarContent.🔹
ToolbarContent и @ToolbarContentBuilderSwiftUI решает это с помощью:
•
ToolbarContent — протокола для элементов панели инструментов;•
@ToolbarContentBuilder — билдера, создающего набор элементов панели.Объединив их, можно вынести содержимое панели инструментов в отдельный блок, сделав
body чище и понятнее.Пример
struct DemoView: View {
@State private var message = "Hello, world!"
var body: some View {
NavigationStack {
Text(message)
.font(.noscript2)
.padding()
.navigationTitle("Home")
.toolbar { toolbarContent }
}
}
@ToolbarContentBuilder
private var toolbarContent: some ToolbarContent {
ToolbarItem(placement: .navigationBarLeading) {
Button { message = "Left tapped" } label: {
Label("Left", systemImage: "line.3.horizontal")
}
}
ToolbarItem(placement: .navigationBarTrailing) {
Button { message = "Right tapped" } label: {
Label("Right", systemImage: "star")
}
}
}
}🔹 Заключение
Использование
@ToolbarContentBuilder для отделения содержимого панели инструментов от основного окна имеет ряд преимуществ:• Улучшена читаемость: Ваш
body текст по-прежнему сосредоточен на вёрстке, а логика панели инструментов реализована в другом месте.• Лучшая организация: Группировка элементов панели инструментов в отдельном блоке позволяет с первого взгляда оценить их структуру и расположение.
• Масштабируемость: Когда на панели инструментов появляется несколько кнопок, меню или условная логика, поддерживать её в рабочем состоянии становится намного проще.
#PixelPerfect #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
💻 Хочешь MacBook Pro? Просто начни учиться!
Да-да, вы не ослышались: Proglib.academy дарит макбук за учёбу!
Всё просто:
— купи любой курс Академии до 15 ноября;
— пройди 2 недели обучения (можно за два дня);
— напиши куратору в чате курса хэштег #розыгрыш.
📚 Выбирай свой курс:
▫️ «Математика для DS» — для тех, кто хочет уверенно работать с данными;
▫️ «Основы Python» — чтобы начать писать код с нуля;
▫️ «Алгоритмы и структуры данных» — для будущих инженеров;
▫️ «AI-агенты» или «Машинное обучение» — для тех, кто хочет прокачаться в ИИ.
👉 Участвовать в розыгрыше
Да-да, вы не ослышались: Proglib.academy дарит макбук за учёбу!
Всё просто:
— купи любой курс Академии до 15 ноября;
— пройди 2 недели обучения (можно за два дня);
— напиши куратору в чате курса хэштег #розыгрыш.
📚 Выбирай свой курс:
▫️ «Математика для DS» — для тех, кто хочет уверенно работать с данными;
▫️ «Основы Python» — чтобы начать писать код с нуля;
▫️ «Алгоритмы и структуры данных» — для будущих инженеров;
▫️ «AI-агенты» или «Машинное обучение» — для тех, кто хочет прокачаться в ИИ.
👉 Участвовать в розыгрыше
😁2
📱 Стоит ли гнаться за новыми SDK?
Каждый релиз iOS или Android — праздник для продактов и кошмар для разработчиков.
Новые API, новые фичи, новые баги.
Одни обновляют проект в первый же день: «мы должны быть на передовой!» Другие тянут до последнего: «зачем ломать то, что работает?»
А ты как поступаешь?💬
❤️ — Обновляюсь сразу, я не боюсь боли
👍 — Жду, пока все детские болезни пройдут
🤝 — Всё ещё на старом SDK, и всё прекрасно
🐸 Библиотека мобильного разработчика
#междусобойчик
Каждый релиз iOS или Android — праздник для продактов и кошмар для разработчиков.
Новые API, новые фичи, новые баги.
Одни обновляют проект в первый же день: «мы должны быть на передовой!» Другие тянут до последнего: «зачем ломать то, что работает?»
А ты как поступаешь?
❤️ — Обновляюсь сразу, я не боюсь боли
👍 — Жду, пока все детские болезни пройдут
🤝 — Всё ещё на старом SDK, и всё прекрасно
#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤5
Android Developer | Middle+ - Senior — до 350 000 ₽, удалёнка
Senior Android-разработчик — от 350 000 ₽, удалёнка
iOS-разработчик международного сервиса (Middle) — от 253 000 ₽, удалёнка
Техлид iOS (Почта) — 350 000 — 450 000 ₽, гибрид (Москва, Санкт-Петербург)
Android Developer — от 250 000 до 400 000 ₽, гибрид (Москва)
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🛒 Black Friday от Proglib.academy!
Только до 30 ноября — скидка 40% на ВСЕ курсы.
Пора добавить в корзину не носки, а новые скиллы: Python, математика для Data Science, AI, алгоритмы и структуры данных, ML.
🎓 Выбирай курс, который реально двинет тебя в карьере, и учись со скидкой.
👉 Учиться со скидкой
Только до 30 ноября — скидка 40% на ВСЕ курсы.
Пора добавить в корзину не носки, а новые скиллы: Python, математика для Data Science, AI, алгоритмы и структуры данных, ML.
🎓 Выбирай курс, который реально двинет тебя в карьере, и учись со скидкой.
👉 Учиться со скидкой
Уровень предметной области определяет бизнес-логику и сценарии использования. Он не зависит от какой-либо платформы или внешней библиотеки, что делает его наиболее стабильной частью приложения.
interface UserRepository {
suspend fun getUserById(id: String): User
}class GetUserByIdUseCase(private val userRepository: UserRepository) {
suspend operator fun invoke(id: String): User {
return userRepository.getUserById(id)
}
}Уровень данных предоставляет конкретные реализации интерфейсов репозитория. Он взаимодействует с API, базами данных или локальным хранилищем.
interface UserRemoteDataSource {
suspend fun fetchUserById(id: String): User
}
class UserRemoteDataSourceImpl(private val api: UserApi) : UserRemoteDataSource {
override suspend fun fetchUserById(id: String): User {
return api.fetchUserById(id)
}
}class UserRepositoryImpl(private val remoteDataSource: UserRemoteDataSource) : UserRepository {
override suspend fun getUserById(id: String): User {
return remoteDataSource.fetchUserById(id)
}
}Представление слоя отвечает за логику пользовательского интерфейса и государственного управления. Это зависит от слой домена но напрямую не взаимодействует с уровень данных .
class UserViewModel(private val getUserByIdUseCase: GetUserByIdUseCase) : ViewModel() {
private val _user = MutableStateFlow<User?>(null)
val user: StateFlow<User?> get() = _user.asStateFlow()
fun loadUser(id: String) {
viewModelScope.launch {
_user.value = getUserByIdUseCase(id)
}
}
}#АрхитектурныйКод #SeniorView #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👏1🥱1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7💯5
Tachikoma — современный Swift AI SDK, который делает интеграцию с ИИ простой и естественной. Tachikoma предоставляет интеллектуальный, адаптивный интерфейс для ИИ-сервисов с полностью современным API на Swift.
Пример:
import Tachikoma // Single unified module
// Simple text generation
let answer = try await generate("What is 2+2?", using: .openai(.gpt4o))
print(answer) // "4"
// With different models
let response1 = try await generate("Hello", using: .anthropic(.opus4))
let response2 = try await generate("Hello", using: .grok(.grok4))
let response3 = try await generate("Hello", using: .ollama(.llama33))
#буст #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
В этой статье мы расскажем, как с помощью булевого поиска можно искать вакансии на LinkedIn и hh.ru (обходя кривые фильтры); на GitHub, где компании и эйчары выкладывают позиции в репозиториях и issues; а также через Google, находя карьерные страницы компаний, которые плохо индексируются.
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
👾 Kotlin и контекстно-ориентированное мышление
Еще одно ?-ориентированное программирование. На этот раз контекстно. Александр рассказал, что такое контекстно-ориентированное программирование, как оно работает (да!) в разных языках. Разумеется, затронули контекстные ресиверы и контекстные параметры в Kotlin (параметры выходят в 2.2) и зачем они нужны.
👀 Cмотреть видео
🐸 Библиотека мобильного разработчика
#свежак
Еще одно ?-ориентированное программирование. На этот раз контекстно. Александр рассказал, что такое контекстно-ориентированное программирование, как оно работает (да!) в разных языках. Разумеется, затронули контекстные ресиверы и контекстные параметры в Kotlin (параметры выходят в 2.2) и зачем они нужны.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему данные теряются при повороте экрана?
Anonymous Quiz
2%
Неправильное использование CoroutineScope
35%
Отсутствие сохранения состояния в savedInstanceState
50%
Activity пересоздается, а переменная temperature обнуляется
7%
Проблема с жизненным циклом корутины
6%
Посмотреть ответ
Разработчик Мэтт Тиссен (Matt Thiessen) выпустил библиотеку Any Language Model для Swift. Она полностью совместима со стандартной Foundation Models, и с ней можно использовать любые LLM, а не только решения от Apple.
В 2025 году Apple представила библиотеку Foundation Models. С её помощью в приложения можно интегрировать модели от Apple: локальную LLM с 3 млрд параметров или облачную VLM. Разработчики в сообществе оценили удобный синтаксис адаптера и оптимизацию под устройства экосистемы, но привязка к определённым нейросетями разрушила потенциальную универсальность.
Проблему решил Мэтт Тиссен. В его API-совместимой библиотеке Any Language Model разработчики могут сами выбирать бэкенд для запуска моделей. Например, можно использовать Apple Foundation Models, CoreML, MLX, llama.cpp (GGUF), OpenAI API, Anthropic API или Google Gemini API. При этом не надо создавать отдельный адаптер для каждого LLM-провайдера.
Для установки Any Language Model в файле
Package.swift надо указать следующую зависимость:dependencies: [
.package(url: "https://github.com/mattt/AnyLanguageModel.git", from: "0.3.0")
]
Для снижения размера готового приложения можно импортировать только нужные провайдеры. Например, код импорта адаптеров для CoreML и MLX выглядит так:
dependencies: [
.package(
url: "https://github.com/mattt/AnyLanguageModel.git",
branch: "main",
traits: ["CoreML", "MLX"] // Enable CoreML and MLX support
)
]
Пример использования Any Language Model выглядит следующим образом:
import AnyLanguageModel
struct WeatherTool: Tool {
let name = "getWeather"
let denoscription = "Retrieve the latest weather information for a city"
@Generable
struct Arguments {
@Guide(denoscription: "The city to fetch the weather for")
var city: String
}
func call(arguments: Arguments) async throws -> String {
"The weather in \(arguments.city) is sunny and 72°F / 23°C"
}
}
let model = SystemLanguageModel.default
let session = LanguageModelSession(model: model, tools: [WeatherTool()])
let response = try await session.respond {
Prompt("How's the weather in Cupertino?")
}
print(response.content)
#свежак #iOS #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Хотите, чтобы ваше приложение работало даже без интернета? Этот промпт поможет реализовать надежный офлайн-режим и синхронизацию данных.
Implement offline-first approach for a mobile app that includes:
— Set up local database (Room/SQLite/CoreData)
— Implement data synchronization strategy
— Handle conflict resolution for concurrent modifications
— Manage offline queue for pending operations
— Add network connectivity detection
— Implement cache management and expiration policies
— Provide user feedback for sync status
— Добавьте
Implement reactive UI updates using observables для автоматического обновления интерфейса— Добавьте
Add retry mechanisms with exponential backoff для надежной синхронизации— Добавьте
Support large file caching with storage management для работы с медиа в офлайне#буст #MiddlePath
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2🔥1🤔1
📘 Хочешь в Data Science, но есть пробелы в знаниях математики?
Мы сделали экспресс-курс «Математика для Data Science», который за 2 месяца даст тебе фундамент, без которого ни одна ML-модель не взлетит 🚀
Что тебя ждёт:
🔹 живые вебинары с экспертами (НИУ ВШЭ, SberAI, Wildberries&Russ);
🔹 практика в Python, квизы и проверка заданий экспертами;
🔹 матрицы, регрессии, вероятности и статистика: всё на примерах из реальных задач;
🔹 старт — 4 декабря.
🔥 Не упусти халяву: сейчас 40% до 30 ноября
👉 Записаться на курс
Мы сделали экспресс-курс «Математика для Data Science», который за 2 месяца даст тебе фундамент, без которого ни одна ML-модель не взлетит 🚀
Что тебя ждёт:
🔹 живые вебинары с экспертами (НИУ ВШЭ, SberAI, Wildberries&Russ);
🔹 практика в Python, квизы и проверка заданий экспертами;
🔹 матрицы, регрессии, вероятности и статистика: всё на примерах из реальных задач;
🔹 старт — 4 декабря.
🔥 Не упусти халяву: сейчас 40% до 30 ноября
👉 Записаться на курс
❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩3
🔹 TECH WEEK 2025 — 17-19 ноября, Москва. Это крупная IT-конференция с различными направлениями — будет интересно и мобильным разработчикам, особенно в части трендов и инфраструктуры.
🔹 Enterprise Agile Russia 2025 — 17 ноября, Москва. Конференция об agile-практиках, гибкой разработке и трансформации команд.
🔹 Mobius 2025 Autumn — 18-19 ноября, Санкт-Петербург + онлайн. Профильная конференция именно по мобильной разработке: iOS, Android, кроссплатформенные технологии.
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM