Сейчас смотрю всякие видое с болями, трудностями джунов. Они допом помогают с бэклогом фич. Основная задача — принести ценность продуктом.
Основная проблема при поиске работы — это падающая в бесконечную пустоту самооценка. В симуляторе иосника хочется сделать также симулятор собеса. И пока непонятно, делать его максимально легким, настраивать под стрессовую ситуацию или делать с выбором сложности
А пока поделюсь прикольным видео. Тут мужик, будто за бокалом виски из нуарных депрессивных детективах, рассказывает про боли и унижения всех нас в начале пути
https://www.youtube.com/watch?v=WUpPg6JcBWc
Основная проблема при поиске работы — это падающая в бесконечную пустоту самооценка. В симуляторе иосника хочется сделать также симулятор собеса. И пока непонятно, делать его максимально легким, настраивать под стрессовую ситуацию или делать с выбором сложности
А пока поделюсь прикольным видео. Тут мужик, будто за бокалом виски из нуарных депрессивных детективах, рассказывает про боли и унижения всех нас в начале пути
https://www.youtube.com/watch?v=WUpPg6JcBWc
YouTube
Отказы на отклики, провалы на собесах и высоченная конкуренция — как это пережить — Доктор Кот
Смотреть вакансии в финтех компании Точка Банк https://tchk.me/ygomzF
МойСклад — облачный сервис для бизнеса. Основная задача компании - это помощь в развитии малого и среднего предпринимательства в РФ. Перед МоимСкладом стоят сложные задачи по расширению…
МойСклад — облачный сервис для бизнеса. Основная задача компании - это помощь в развитии малого и среднего предпринимательства в РФ. Перед МоимСкладом стоят сложные задачи по расширению…
👍3🔥3🏆1
Частый вопрос на собесах в тинек — как массив хранит ссылки? Сильно или слабо?
Правильный ответ — сильно.
А как сделать слабо? Использовать NSPointerArray
Подробнее тут
Правильный ответ — сильно.
А как сделать слабо? Использовать NSPointerArray
Подробнее тут
Marcosantadev
Swift Arrays Holding Elements With Weak References
In iOS development there are moments where you ask yourself: “To weak, or not to weak, that is the question”. Let’s see how “to weak” with the arrays.
👍14
Какой ответ выведется в консоли?
Anonymous Quiz
11%
Все крашнится
20%
"It's pronounced /dʒɪf/" -> "It's pronounced /ɡɪf/"
55%
"It's pronounced /dʒɪf/" -> "It's pronounced /dʒɪf/"
11%
"It's pronounced /ɡɪf/" -> "It's pronounced /ɡɪf/"
2%
null
👍1
Короче, пока разрывает от того, что не хватает времени на интересные посты, симулятор иосника, дрочку литкода (да да снова начал) и сторонних зависимостей.
Поэтому я использую функцию "звонок другу". Нужен друг, или друзья, которые будут кидать классные статьи, видосы или книги по разным темам: архитектуры, покраска кнопок, многопоточка и тп
Этот материал также пойдет в основу симулятора иосника
контакт тот же. Ну или в чат кидайте https://t.iss.one/+rNag9KqMoo1kNzli
Поэтому я использую функцию "звонок другу". Нужен друг, или друзья, которые будут кидать классные статьи, видосы или книги по разным темам: архитектуры, покраска кнопок, многопоточка и тп
Этот материал также пойдет в основу симулятора иосника
контакт тот же. Ну или в чат кидайте https://t.iss.one/+rNag9KqMoo1kNzli
👍1
iOS Makes Me Hate pinned «Короче, пока разрывает от того, что не хватает времени на интересные посты, симулятор иосника, дрочку литкода (да да снова начал) и сторонних зависимостей. Поэтому я использую функцию "звонок другу". Нужен друг, или друзья, которые будут кидать классные…»
Defer
🟢 lvl: mid-
defer — это ключевое слово, которое позволяет выполнить код при выходе из текущей области видимости.
Не самый редкий и не самый частый гость в разных проектах. Часто юзается, чтобы сделать потокобезопасный код, если вы блочите объект, перед его выполнением внутри функции.
Или же, когда вы заалокейтили какую-то инфу в память, но после выполнения нужно все почистить.
Копания в кишки через дизассемблер
Хорошее объяснение с разными практическими примерами
🟢 lvl: mid-
defer — это ключевое слово, которое позволяет выполнить код при выходе из текущей области видимости.
Не самый редкий и не самый частый гость в разных проектах. Часто юзается, чтобы сделать потокобезопасный код, если вы блочите объект, перед его выполнением внутри функции.
Или же, когда вы заалокейтили какую-то инфу в память, но после выполнения нужно все почистить.
Копания в кишки через дизассемблер
Хорошее объяснение с разными практическими примерами
👍6🔥1
Что произойдет?
Anonymous Quiz
22%
Произойдет креш из-за форс-анпрапа
16%
Функция вернет nil
56%
“Hello world”
6%
Проект не соберется
🤔12👍5🎉2
Вообще у меня уже пару лет стоит пунктик покопать в сторону реверс инжениринга иос. Хочется обвалиться парой книг в будущем и пописать сюда выжимки, но пока читаем статью и думаем, как сделать свой ответ Appstore
https://habr.com/ru/company/dsec/blog/676094/
https://habr.com/ru/company/dsec/blog/676094/
Хабр
Обход средств защиты в iOS-приложениях
В прошлой статье мы рассмотрели базовые уязвимости и способы их обнаружения. Но что делать, если в приложении используются дополнительные средства защиты (например, Jailbreak Detection или...
⚡5💯1
Коллизия хэш-мапы
🟠 lvl: mid+
👆 В предыдущих сериях мы узнали о Hashable и для чего он нужен. Сейчас же поговорим о коллизиях хэша.
Напомню, хэш-функция - это математический алгоритм, который отображает данные произвольного размера в битовый массив фиксированного размера. В иос за это отвечает Hasher
До этого стандарта разработчики страдали частой коллизией, особенно работая с цветами.
ℹ️ Коллизия происходит, когда разные входные данные производят одинаковый хэш, но значения не равны
Хэш-функция считается устойчивой к коллизиям до того момента, пока не будет обнаружена пара сообщений, дающая одинаковый выход. Стоит отметить, что коллизии всегда будут существовать для любой хэш-функции по той причине, что возможные входы бесконечны, а количество выходов конечно
С хорошей хэш-функцией простые поиски, вставки и удаления занимают в среднем постоянное время. Однако если хеш-функция выбрана недостаточно точно для соответствия данным, ожидаемое время таких операций может стать пропорциональным количеству элементов, хранящихся в таблице.
Детальнее можно познакомиться отличном материале SE-0206
✅ Итого: По умолчанию Swift использует универсальную хэш-функцию, которая сводит последовательность байтов к одному целому числу.
Однако мы можем улучшить её, адаптировав хэш-функцию к своему домену.
- Почитать о производительности Hasher в треде с сеньором-помидором из яблока
- Мощненькое чтиво про приемы хэширования
🟠 lvl: mid+
Напомню, хэш-функция - это математический алгоритм, который отображает данные произвольного размера в битовый массив фиксированного размера. В иос за это отвечает Hasher
До этого стандарта разработчики страдали частой коллизией, особенно работая с цветами.
ℹ️ Коллизия происходит, когда разные входные данные производят одинаковый хэш, но значения не равны
Хэш-функция считается устойчивой к коллизиям до того момента, пока не будет обнаружена пара сообщений, дающая одинаковый выход. Стоит отметить, что коллизии всегда будут существовать для любой хэш-функции по той причине, что возможные входы бесконечны, а количество выходов конечно
С хорошей хэш-функцией простые поиски, вставки и удаления занимают в среднем постоянное время. Однако если хеш-функция выбрана недостаточно точно для соответствия данным, ожидаемое время таких операций может стать пропорциональным количеству элементов, хранящихся в таблице.
Детальнее можно познакомиться отличном материале SE-0206
✅ Итого: По умолчанию Swift использует универсальную хэш-функцию, которая сводит последовательность байтов к одному целому числу.
Однако мы можем улучшить её, адаптировав хэш-функцию к своему домену.
- Почитать о производительности Hasher в треде с сеньором-помидором из яблока
- Мощненькое чтиво про приемы хэширования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3
Чем отличается настоящий программист от кодера?
В снг (а может не только) почему-то считатается, что настоящий программист — это не только кодер, но и чел, кому можно доверить фичу.
Но что такое "доверить"? Хорошо координировать процесс разработки или быть уверенным в качестве продукта, в дедлайнах? Развиваться по менеджерской ветки или инженерной?
И то, и другое. Только вот в снг по инженерной у нас малый уровень. На мой взгляд эта проблема и приводит к быстрому упору потолка по инженерной ветки и бегством в менеджерскую.
В книге сразу дается ответ на вопрос "Кто такой настоящий программист?"
💬 Если программирование — это искусство написания кода, то разработка программного обеспечения — это искусство обеспечения того, чтобы этот код продолжал работать в будущем.
Это сразу же подчеркивает, что окружает программирование в повседневной жизни инженера-программиста. Как и в более «традиционных» инженерных областях, когда вы строите что-то на века, вы хотите планировать заранее. Именно здесь в игру вступают встречи, проектная документация, интеграционные тесты и т. д.
А вы программируете или разрабатываете?
P.S. второй раз пришел к книге. Буду иногда вбрасывать вижимки
В снг (а может не только) почему-то считатается, что настоящий программист — это не только кодер, но и чел, кому можно доверить фичу.
Но что такое "доверить"? Хорошо координировать процесс разработки или быть уверенным в качестве продукта, в дедлайнах? Развиваться по менеджерской ветки или инженерной?
И то, и другое. Только вот в снг по инженерной у нас малый уровень. На мой взгляд эта проблема и приводит к быстрому упору потолка по инженерной ветки и бегством в менеджерскую.
В книге сразу дается ответ на вопрос "Кто такой настоящий программист?"
💬 Если программирование — это искусство написания кода, то разработка программного обеспечения — это искусство обеспечения того, чтобы этот код продолжал работать в будущем.
Это сразу же подчеркивает, что окружает программирование в повседневной жизни инженера-программиста. Как и в более «традиционных» инженерных областях, когда вы строите что-то на века, вы хотите планировать заранее. Именно здесь в игру вступают встречи, проектная документация, интеграционные тесты и т. д.
А вы программируете или разрабатываете?
P.S. второй раз пришел к книге. Буду иногда вбрасывать вижимки
👍10😐4👎3
Закон Хайрама по сути это не про обесценивание интерфейса, а про то, что не стоит расчитывать только на него.
Только не стоит прикрывать нежелание написания доки, интерфейса и других вспомогательных штук — большими масштабами команды из 2,5 человека
Кстати, гуглил про закон и наткнулся на прикольный репо
https://solarrust.github.io/hacker-laws/
Только не стоит прикрывать нежелание написания доки, интерфейса и других вспомогательных штук — большими масштабами команды из 2,5 человека
Кстати, гуглил про закон и наткнулся на прикольный репо
https://solarrust.github.io/hacker-laws/
❤4👍3
Символьный брекпоинт
🟢 lvl: jun+
Символьный брекпоинт — это одна из прикольных фич, которую я сам долго не знал. Вам не нужно протыкивать самим точку остановки в коде, а достаточно написать условия и программа сама остановится при их выполнении
https://medium.com/swlh/symbolic-breakpoint-xcode-in-2-minutes-5ca86f257b51
🟢 lvl: jun+
Символьный брекпоинт — это одна из прикольных фич, которую я сам долго не знал. Вам не нужно протыкивать самим точку остановки в коде, а достаточно написать условия и программа сама остановится при их выполнении
https://medium.com/swlh/symbolic-breakpoint-xcode-in-2-minutes-5ca86f257b51
Medium
Symbolic Breakpoint Xcode in 2 Minutes
Once upon a time, while I was debugging my code, I found out an annoying warning comes up like below
❤🔥7🥱3
Рубрика "офигенные подгоны".
Смотрите че нашел, целая куча книг просто так бесплатно в гите
Спасибо бэтмену за чистый Готэм🤡
https://github.com/wuzhouhui/misc
Смотрите че нашел, целая куча книг просто так бесплатно в гите
Спасибо бэтмену за чистый Готэм
https://github.com/wuzhouhui/misc
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥8👍2
Зачем нужны юнит-тесты?
Частое заблуждение, что на мобилке юнит-тесты не нужны. Достаточно лишь е2е и UI.
На практике же е2е покрывает только пару успешных кейсов, забывая про остальные состояния флоу или функциональности. Он не выходит за границы UI и не погружается на уровни бизнес-логики. Его выполнение дорогое и долгое. Например, часто он не смотрит подгрузилась ли модель, закэширована ли сессия, правильны ли входящие/исходящие данные. Но он идеально подходит для проверки нескольких модулей.
Обычно е2е проходят по самому простому пути:
1. Выполняю флоу
2. Смотрю, есть ли текст, кнопка, вьюха в иерархии вьюх, которые видит пользователь.
А что там под копотом никто не хочет тестировать.
Любые тесты экономят вам время, документируют код, удешевляют разработку, помогают стабильно расти продукту. Все это ощущается на долгосрочной дистанции, когда вы устали протыкивать сложнейшие кейсы в тысячный раз. И самые дешевые — это юнит
Какова же цель юнит-тестирования?❓
Его цель — обеспечение стабильного роста программного проекта. Ключевым словом здесь является «стабильный». В начале жизни проекта развивать его довольно просто. Намного сложнее поддерживать это
развитие с прошествием времени.
❓Чем же хороши юнит тесты?
Документация тест-кейсов
Когда вся команда уходит и вместо нее приходит новая, или мы возвращаемся к коду, забытому несколько тысяч лет насад, тесты отлично помогают максимально точно описать поведение. Не выкапывая из памяти или тысяч устаревших документаций
Удешевление разработки
Стандартная тема, что после нескольких месяцев, лет разработки всех кейсов уже никто не помнит, часть людей меняется, требования противоречат коду. Ручных проверок слишком много. Тест позволяет найти баги на этапе разработки. Зафиксировать поведение и гарантировать, что этот кейс был проверен.
Ускорение разработки
Ну и понятно, что ручной кейс намного медленней, чем пару сотен миников
Но различия между хорошими и плохими тестами не ограничиваются вкусами. Далее разберемся в отличиях хорошего и плохого теста.
Частое заблуждение, что на мобилке юнит-тесты не нужны. Достаточно лишь е2е и UI.
На практике же е2е покрывает только пару успешных кейсов, забывая про остальные состояния флоу или функциональности. Он не выходит за границы UI и не погружается на уровни бизнес-логики. Его выполнение дорогое и долгое. Например, часто он не смотрит подгрузилась ли модель, закэширована ли сессия, правильны ли входящие/исходящие данные. Но он идеально подходит для проверки нескольких модулей.
Обычно е2е проходят по самому простому пути:
1. Выполняю флоу
2. Смотрю, есть ли текст, кнопка, вьюха в иерархии вьюх, которые видит пользователь.
А что там под копотом никто не хочет тестировать.
Любые тесты экономят вам время, документируют код, удешевляют разработку, помогают стабильно расти продукту. Все это ощущается на долгосрочной дистанции, когда вы устали протыкивать сложнейшие кейсы в тысячный раз. И самые дешевые — это юнит
Какова же цель юнит-тестирования?
Его цель — обеспечение стабильного роста программного проекта. Ключевым словом здесь является «стабильный». В начале жизни проекта развивать его довольно просто. Намного сложнее поддерживать это
развитие с прошествием времени.
❓Чем же хороши юнит тесты?
Документация тест-кейсов
Когда вся команда уходит и вместо нее приходит новая, или мы возвращаемся к коду, забытому несколько тысяч лет насад, тесты отлично помогают максимально точно описать поведение. Не выкапывая из памяти или тысяч устаревших документаций
Удешевление разработки
Стандартная тема, что после нескольких месяцев, лет разработки всех кейсов уже никто не помнит, часть людей меняется, требования противоречат коду. Ручных проверок слишком много. Тест позволяет найти баги на этапе разработки. Зафиксировать поведение и гарантировать, что этот кейс был проверен.
Ускорение разработки
Ну и понятно, что ручной кейс намного медленней, чем пару сотен миников
Но различия между хорошими и плохими тестами не ограничиваются вкусами. Далее разберемся в отличиях хорошего и плохого теста.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Оценки качества тестов
Существует несколько проверок качества юнит тестов. Первая и самая распространенная — code coverage
⚪️Code Coverage: наиболее часто используемая метрика покрытия, также известная как test coverage. Эта метрика равна отношению количества строк кода, выполняемых по крайней мере одним тестом, к общему количеству строк в основном коде проекта.
🕹Code coverage (test coverage) = Количество выполненных строк кода / Общее количество строк кода
Покрытие в примере (см скрин 1) вычисляется легко. Общее количество строк в методе равно 5. Количество строк, выполняемых в тесте, равно 4 — тест проходит все строки кода, кроме команды return true. Таким образом, покрытие равно 4/5 = 0,8 = 80 %.
Что будет, если отрефакторить этот метод и убрать избыточную команду if? Посмотрим скрин 2
Изменился ли процент покрытия? Да, изменился. Покрытие кода увеличилось до 100 %. Но улучшилось ли качество тестов с таким рефакторингом? Конечно же, нет. Тест по-прежнему проверяет то же количество ветвлений в коде. Этот простой пример показывает, как легко подтасовать процент покрытия.
⚠️Процент покрытия служит хорошим негативным признаком, но плохим позитивным.
➡️🔀Branch coverage:
Другая метрика покрытия называется branch coverage (покрытием ветвей).
Branch coverage показывает более точные результаты, чем code coverage. Вместо того чтобы использовать количество строк кода, эта метрика смотрит на if и switch.
Branch coverage = Количество покрытых ветвей / Общее количество ветвей
Чтобы вычислить метрику branch coverage, необходимо подсчитать все возможные ветви (branches) в коде и посмотреть, сколько из них выполняются тестами. Вернемся к предыдущему примеру со строкой.
ℹ️ Метод IsStringLong содержит две ветви: одна для ситуации, в которой длина строкового аргумента превышает пять символов, и другая для строк, длина которых менее или равна 5 символам. Тест покрывает только одну из этих ветвей, поэтому метрика покрытия составляет 1/2 = 0,5 = 50 %.
Существует несколько проверок качества юнит тестов. Первая и самая распространенная — code coverage
⚪️Code Coverage: наиболее часто используемая метрика покрытия, также известная как test coverage. Эта метрика равна отношению количества строк кода, выполняемых по крайней мере одним тестом, к общему количеству строк в основном коде проекта.
🕹Code coverage (test coverage) = Количество выполненных строк кода / Общее количество строк кода
Покрытие в примере (см скрин 1) вычисляется легко. Общее количество строк в методе равно 5. Количество строк, выполняемых в тесте, равно 4 — тест проходит все строки кода, кроме команды return true. Таким образом, покрытие равно 4/5 = 0,8 = 80 %.
Что будет, если отрефакторить этот метод и убрать избыточную команду if? Посмотрим скрин 2
Изменился ли процент покрытия? Да, изменился. Покрытие кода увеличилось до 100 %. Но улучшилось ли качество тестов с таким рефакторингом? Конечно же, нет. Тест по-прежнему проверяет то же количество ветвлений в коде. Этот простой пример показывает, как легко подтасовать процент покрытия.
⚠️Процент покрытия служит хорошим негативным признаком, но плохим позитивным.
➡️🔀Branch coverage:
Другая метрика покрытия называется branch coverage (покрытием ветвей).
Branch coverage показывает более точные результаты, чем code coverage. Вместо того чтобы использовать количество строк кода, эта метрика смотрит на if и switch.
Branch coverage = Количество покрытых ветвей / Общее количество ветвей
Чтобы вычислить метрику branch coverage, необходимо подсчитать все возможные ветви (branches) в коде и посмотреть, сколько из них выполняются тестами. Вернемся к предыдущему примеру со строкой.
ℹ️ Метод IsStringLong содержит две ветви: одна для ситуации, в которой длина строкового аргумента превышает пять символов, и другая для строк, длина которых менее или равна 5 символам. Тест покрывает только одну из этих ветвей, поэтому метрика покрытия составляет 1/2 = 0,5 = 50 %.
⚡4❤1
Crash Budget
Тесты — лишь инструмент. Не стоит думать, что любой тест сразу улучшает метрики качества. Плохой тест даже хуже отсутствующего. Он выполняется медленнее ручных или еще хуже дает неправильную инфу о причинах.
В авито есть множество метрик, которые отвечают за качество. Все они работают исключительно в рамках своего юнита. Подробнее можно почитать тут. Но есть проблема, что отсутствует сквозная объективная метрика стабильности приложения на основе данных пользователей, позволяющая отслеживать состояние и принимать решения. Поэтому придумана к уже существующим метрикам добавить сквозную автоматизированную метрику Crash Budget.
Метрика будет учитывать влияние каждого отдельного юнита на Crash-free users и подсвечивать проблемы.
Начальный порог на 1 юнит - 0.0179%
формула = целевой crash-free/число юнитов
Мониторинг работает автоматически + уведомляет юниты в случае привышения бюджета по крешам. В случае игнорирования юниту выдаются санкции.
Crash-free users — процент пользователей, у которых не было крэшей в приложении за выбранный период.
Crash Budget — допустимый процент крэшей у пользователей в расчете на 1 юнит за выбранный период.
Таким образом команда задумывается не просто о написании тестов, как об отчетности. Она сплочена общей проблемой и использует инструменты тестов, как повышение стабильности этих показателей.
Тесты — лишь инструмент. Не стоит думать, что любой тест сразу улучшает метрики качества. Плохой тест даже хуже отсутствующего. Он выполняется медленнее ручных или еще хуже дает неправильную инфу о причинах.
В авито есть множество метрик, которые отвечают за качество. Все они работают исключительно в рамках своего юнита. Подробнее можно почитать тут. Но есть проблема, что отсутствует сквозная объективная метрика стабильности приложения на основе данных пользователей, позволяющая отслеживать состояние и принимать решения. Поэтому придумана к уже существующим метрикам добавить сквозную автоматизированную метрику Crash Budget.
Метрика будет учитывать влияние каждого отдельного юнита на Crash-free users и подсвечивать проблемы.
Начальный порог на 1 юнит - 0.0179%
формула = целевой crash-free/число юнитов
Мониторинг работает автоматически + уведомляет юниты в случае привышения бюджета по крешам. В случае игнорирования юниту выдаются санкции.
Crash-free users — процент пользователей, у которых не было крэшей в приложении за выбранный период.
Crash Budget — допустимый процент крэшей у пользователей в расчете на 1 юнит за выбранный период.
Таким образом команда задумывается не просто о написании тестов, как об отчетности. Она сплочена общей проблемой и использует инструменты тестов, как повышение стабильности этих показателей.
👍4🔥1