iOS Makes Me Hate
3.94K subscribers
1.17K photos
167 videos
15 files
1.33K links
Авторский канал про iOS разработку. Путь продуктовых самураев в MAANG.

Самое больше iOS сообщество практиков: https://boosty.to/lionbond/

Автор: @lvbond Senior iOS Yandex, ex-Avito, VK
Download Telegram
Unit-тестирование здорового человека ч.1

Спустя более года написал еще одну статью на хабре. Это первая часть из запланированных, где в первой статье будет основной упор на философии и необходимости.

1️⃣Зачем нужны тесты?
2️⃣Свойства хороших тестов
3️⃣Антипаттерны
4️⃣Почему хороший разработчик не только пишет код
5️⃣Когда не нужны юнит-тесты
6️⃣Почему хороший код не напишешь без тестов

Суммарно эти советы и техники я юзал почти во всех компаниях. Материала много и везде юнит-тесты были очень полезны, вопреки мнению, что клиентам они не нужны
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍3
365 дней богу Алгоритмов

Этот год я стартую с новым челенджем. Каждый день я буду решать задачи с литкода и выкладывать их на канал.

Для меня уже не первый вызов себе. С 2018 по 2019 устраивал «365 дней Хемингуэю». Тогда у меня был литературный запой. Я прочитал за год около 100 книг и ежедневно писал небольшие рассказы, качая навык сторитейлинга.

Собственно, в честь этого челленджа назван и этот. Если бы не он, то я бы не ввёл этот канал с такой легкостью и почти не испытывая сложности с генерацией ежедневного контента, а только повышая нагрузки и увеличивая ставки

Такие челленджи дают уверенность, что побеждает не сильнейший. Побеждает самый стойкий. Проверю же свою
🔥245👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Copilot для Xcode — расширение для редактора

Это расширение Xcode Source Editor с помощью которого, можно настроить Github Copilot для Xcode. CopilotForXcode использует LSP, предоставляемого через Copilot.vim для генерации предложений и отображения их в виде комментариев.

Репозиторий: https://github.com/intitni/CopilotForXcode

#ios
Как решать алгоритмы?

Точного ответа никто не может дать. Изучая советы по подготовке к изучению алгоритмов выявил для себя такую стратегию:

Не стоит сразу брать и решать литкод. Эту тактику я взял у создателя комьюнити фаанг-интервью, который попал вроде в гугл. Эти стратегии транслируют в книге “cracking the coding interview”.

Слепая практика ничем не отличается от чтения теории. Все должно быть сбалансированно. Нужно наметить цели и планы. Стратегии. Изучать чужие практики и смотреть на решения других

Этому меня научил и Стивен Кинг. Нет, он не решал алгоритмы. Он написал книгу «как писать книги». Ее я брал за основу к своему прошлому челенджц. Где для написания хороших книг нужно уметь много читать и уметь много писать.

Свой путь я начну с разминки. Опыт бега на дальние дистанции научил меня не бежать старт с высоким темпом. Это чаще приводит к истощению уже на середине.

Пишу это, чтоб никого не разочаровать. Я не буду решать ежедневный контест или тупо готовиться будто к собесам. Пока еще рано.

Для меня важно получить навыки, а не пройти интенсив молодого бойца к собесу
👍1
Бинарный поиск

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

В чем его идея?

Мы делим пополам заранее отсортированный массив, чтобы обнаружить нужный элемент. Вот и всё.

Алгоритм такой:
1. Сортируем массив данных
2. Делим его пополам и находим середину.
3. Сравниваем средний элемент с заданным искомым элементом.
4. Если искомое число больше среднего — продолжаем поиск в правой части массива (если он отсортирован по возрастанию): делим ее пополам, повторяя пункт 3. Если же заданное число меньше — алгоритм продолжит поиск в левой части массива, снова возвращаясь к пункту 3.

Задача в литкоде

сложность: logn (без сортировки)

#365_дней_богу_Алгоритмов #1
👍18
Swift Learning Roadmap 2023

Снова роадмапы. Но тут очень лаконично и хорошо. Очень нравится, что емко раставлены акценты на базовых вещах:

- Знание языка
- IDE
- GIT
- UI

Когда я был джуном, то часто изучал всякие бесполезные вещи, которые нужны только похвастаться на собесах. А игнорировал most common штуки, которые куда чаще встречаются на боевых проектах.

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

Тут я взялся за дейли контест.

Алгоритм такой:
1. Ищем родительскую ноду
2. Идем по левой
3. Доходим до конца
4. Идем вправо

- Литкод задача

- Хорошее объяснение бинарных деревьев

#365_дней_богу_алгоритмов #2
Мода на решение задач в литкоде становится все популярнее.

Думаю, через какое-то время условные 200-300 задач будут в снг обязательным показателем для мидла. Ведь все реже удивишь кого-то таким количеством решенных задач.

В статье автор высказывает мнение о пользе.

Я же считаю, что ежедневное нарешевание задач равно улучшению общих физических показателей.

Как в спорте. Спортсмены 70-80% бегают, прыгают, развивают тело. Увеличивая базовые показатели скорости, силы и выносливости. А потом остальные 20-30% тренируют в зале технику: играют в игры, борятся, спарингуют.

Условно алгоритмическая секция — это что-то вроде оценки твоих базовых показателей.

https://habr.com/ru/post/709550/
👍5
Сравнение дерева

Снова дейлик литкода. Изначально я взял вчерашний код и просто добавил двойной обход 🤬 А потом сравнил результаты двух проходов.

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

Подумав можно заюзать рекурсию, где код лаконичней и правильнее

Задача на литкоде

#365_дней_богу_алгоритмов #3
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥2👍21
Паттерн: Фабричный метод

lvl: jun

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

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

Тут мы скрываем инициализацию нашей марки за абстракцию (протокол) и определяем метод, который будет создавать нужный класс.

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

В книге банды четерых этот паттерн описывается так:

Определяет интерфейс для создания объекта, но оставляет подклассам реше ние о том, какой класс инстанцировать. Фабричный метод позволяет классу де легировать инстанцирование подклассам.

Создание фабричного метода упростит расширение и поддержку новых типов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Неупорядоченный обход бинарного дерева

Задание дейлика было не изи, а медиум. Даже пробовать не стал. 😬 Поэтому возвращаемся к повторению основ.

В позапрошлом задании проходил отсортированное дерево. Теперь идем по неупорядоченному.

Здесь заюзал алгоритм обхода Морриса

Задача в литкоде

#365_дней_богу_алгоритмов #4
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Продолжаем страшилки для джунов

Чел сделал тестовое с помощью chatGPT

Какие же навыки обесценятся, а какие наберут актуальность?

Обесценится любой бойлерплейт код. Условно кнопку верстать сможет будет и человек без знания программирования.

Наберут в цене же знания проектирования. Куда положить кнопку, чтоб она ничего не сломала и была полезна бизнесу — это знает только погруженные в бизнес-процессы и предметную область разрабы.

Как заметили в нашем чате:
- тестовые задания будут отменяться чаще (спустя пару недель вышел пост на хабре)
- разрабы будут больше бизнес-аналитиками и манагерами
- усилится акцент на дизайн системе. Но это пока нейросеть наши фотки генерит и не научилась в миро блок-схемы
- завуалированные алгоритмические задачи нейросеть еще не научилась решать
- по-настоящему глубокие штуки она не умеет

Бот стал супер хайповой штукой. Скоро будут чат боты в телеграме, подключенные к апи чатГПТ, которые будут делать по скриптам простенькие апки
Please open Telegram to view this post
VIEW IN TELEGRAM
🗿5👌1
Обратный обход бинарного дерева

Последний из основных способов обхода дерева. Решил через очередь.

Наудивлении у отуса отличная статья про деревья без лишней херни. Максимальная лаконичная выдержка.

Задача на литкоде

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

Не знаю стоит ли делать отдельные посты про полезные ссылки и объяснять деревья без задач. Ибо это пост ради поста, а без практики это все из головы ветром сдует.

Ставь 💅 если делать отдельные посты про техники. Или 🗿 если публиковать только ссылки с задачами. А там сами уже разберутся

#365_дней_богу_алгоритмов #5
💅18🗿5
Лучшая архитектура iOS
Anonymous Poll
19%
MVC
38%
MVVM
14%
MVP
5%
TCA
17%
VIPER
32%
PIDOR
8%
REDUX
😁11
Корень числа с бинарным поиском

Еще один наглядный пример использовать бинарный поиск не только в отсортированном массиве, но и обычная числах. Что по сути можно тоже сказать, что

Наглядный пример поиска корня. Изи решается через тот же бинарный поиск

Задача в литкоде

#365_дней_богу_алгоритмов #6
Atomicity (атомарность)

Этот термин часто юзается вместе с многопоточкой.

Вики говорит:
Это операция, которая либо выполняется целиком, либо не выполняется вовсе; операция, которая не может быть частично выполнена и частично не выполнена.

Грубо говоря, атомарная операция не дает другим потокам прочитать участок памяти, пока он изменяется

Пример из исходников аламофайр
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Еще один гайд по алгоритмам.

В отличие от других этот говорит о необходимости базовых алгоритмов и техник:

- Два поинтера с массивами, связанным списком
- Бэктрекинг
- Обходы деревьев
- Кучи и Стэки
- Динамическое программирование

Вообще, считаю очень важно определить для себя приоритеты. В одном из предыдущих постов был спор "А нужно ли задумываться о стайлгайде, когда решаешь алгоритмы?".

Я считаю, что для решения литкода и других алгоритмических задач не стоит задумываться об излишних синтаксических улучшениях.

😔 Стоит опустить многие вещи и сфокусироваться на главном — решении задачи. А остальные вещи по оптимизации и косметической декорации уже после.

Всегда важнее решенная проблема, а ее форма уже на втором или третьем плане.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Онанизм на код ревью

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

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

Одно дело, когда это литкод. Куда страшнее, если погоня за косметикой и соответствие стайлгайду становится первостепенной в продакшене больших компаний. Спойлер. Стайлгайд необходим, но споры о соответствии должны быть в умеренных дозах.

Хороший код — это не косметика, читабельность, соответствие линтер правилам.

Хороший код — быстрый, стабильный и поддерживаемый. В последнюю очередь это про правила линтера

У нас есть заблуждение, подкормленное отделами техпиара, что в больших компаниях делают все правильно.

Не редкость, когда именно там, где нет никого кто может возразить, делается дичь. Культура компетенций нарушена. Ориентиры сбиты.

Люди тратят время на споры о важности чтения, жертвуя стабильностью, быстротой и гибкостью программы. Сроками и деньгами. Говоря о той далекой выгоде в будущем, о которой пишут в книгах. Сомнительная метрика.

Код ревью становится бюрократией стайлгайда, которая только вредит, а не дает пользу.

Никому не будет плохо от лишнего пробела, неочевидного нэйминга, переноса аргумента, неприватных методов.

Совершенный код — миф. На моей практике я видел только пару программистов, кто был доволен чужим кодом. Сотни нет. Единственный вариант его написать — это рефакторинг или TDD. Хорошие процессы и бизнес идеи приводят к хорошему коду на проде.

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

Нет, я не говорю выкинуть стайлгайд. Он нужен как общий ориентир. Но если выбирать между сложной и срочной задачей и спорами на ревью, то последний пункт можно принести в жертву.

Задача программиста решать задачу. А потом учиться решать ее красиво
👍10😐6💯2💅2
Если вы вчера заметили, то не было ежедневных алгоритмов

Хейтеры скажут слился. Но я просто решил, что ежедневные отчеты задают не тот тон каналу.

Поэтому следующие посты я буду публиковать по воскресеньям и сразу с задачами за неделю. Для экономии времени своего и вашего.

Прошлые задачи:

#7. Найти сводной индекс. Решение далеко не оптимальное. На оптимизацию не было времени. Решил тупо в лоб

#8. Обход n-арного дерева в обратном порядке
Здесь посидел. Решил тоже неоптимизировать и тупо двойным проходом

#365_дней_богу_алгоритмов

#7 | #8
👌1