Русский
Русский
English
Статистика
Реклама

Блог компании productivity inside

Перевод Мы выяснили, что люди копируют со Stack Overflow и насколько часто

23.04.2021 04:14:43 | Автор: admin
Говорят, что в каждой шутке есть доля правды. Если говорить о нашем первоапрельском приколе, то в нем эта доля стремилась ко всем ста процентам. Нам захотелось обыграть классический мем о Stack Overflow и немного уклониться от одного из наших фундаментальных принципов. Источником вдохновения послужили попортившие крови основателям компании ресурсы, которые открывают ответы на вопросы по программированию только для платных пользователей. А как бы изменился мир, если бы мы вдруг сделали возможность копировать текст со Stack Overflow доступной только за деньги?

Ну, пошутили и хватит. Надеемся, что все посмеялись и никто сильно не испугался. Но подождите, мы еще закончили. Настроив систему так, чтобы она реагировала на каждый ввод команды Command+C, мы сообразили, что у нас появился шанс получить больше информации о том, что люди делают на сайте. Мы успешно фиксировали каждую операцию копирования на Stack Overflow в течение двух недель, и вот что из этого получилось.

Вы не одни такие


Один из четверых пользователей, открывающих страницу с вопросом на Stack Overflow, что-нибудь копирует с нее в течение первых пяти минут после захода на сайт. Суммарно мы насчитали 40 623 987 копирований из 7 305 042 постов в период с двадцать шестого марта по девятое апреля. Текст из ответов люди копируют примерно в десять раз чаще, чем из вопросов и где-то в тридцать пять раз чаще, чем из комментариев. Блоки кода подвергаются копированию в десять раз чаще, чем сопровождающий текст, а копирование со страниц вопросов без принятых ответов, на удивление, ведется активнее, чем там, где они есть.

Соответственно, если вам когда-нибудь было стыдно за то, что вы копируете готовый код, вместо того чтобы писать его с нуля пусть ваша совесть будет спокойна! Зачем изобретать велосипед, если кто-то уже разрешил за вас все сложности? Мы называем это многократным использованием то, что когда-то узнал, создал, доказал кто-то другой, теперь послужит вам. И в этом нет ничего плохого: так вы можете быстрее учиться, оперативнее получать рабочий код и меньше мотать себе нервы. Весь наш сайт стоит на концепции многократного использования знаний сообщество Stack Overflow сильно, прежде всего, своим альтруистичным подходом к наставничеству.

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

Как человек, который многие годы без зазрения совести сдирал код со Stack Overflow, я не удивился, когда события копирования стали поступать миллионами. Удивило меня другое: сколько ответов на разные вопросы дала нам эта информация. Сколько людей в реальности копирует контент со Stack Overflow? Копируют один только код или что-то еще? Копируют ли активнее вопросы с принятыми ответами? Чтобы придать своему анализу какое-то направление мы с командой составили список вопросов, которые нас интересовали. Началось всё с простой шутки, а вылилось в серьезное исследование, пролившее свет на многие вещи и давшее толчок многочисленным обсуждениям о развитии и совершенствовании платформы в будущем.

Данные


При помощи самодельного инструмента для веб-трекинга мы создали кастомные события, чтобы фиксировать каждый случай, когда пользователь что-то копирует с сайта. Благодаря этим событиям нам удалось отследить самые разные характеристики: тэги, тип контента (вопрос, ответ или комментарий, блок кода или обычный текст), репутация копирующего, рейтинг поста, регион, статус поста принят или нет. В общем, сохраняли мы практически всё, кроме собственно текста, который копировался.

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

Результаты верхнего уровня подтвердили то, что давным-давно звучало в шутках: на Stack Overflow все только и делают, что копируют. Также мы быстро убедились, что копирование как тип поведения подчиняется тем же закономерностям, которые уже выявлены для трафика сайта. Активнее всего люди копируют в будни, в рабочие часы. Регионы, где наш сайт пользуется наивысшей популярностью, дают больше всего копирований: Азия 33%, Европа 30% и Северная Америка 26%. Ну и наконец, 86% копирующих анонимные пользователи (то есть у них нулевая репутация). Когда мы стали подробнее вникать, кто копирует и что именно, стало интереснее.

Соотносится ли высокая репутация с усиленным копированием?


Для начала нам захотелось проверить: окажутся ли пользователи с высокой репутацией самыми активными в копировании?



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

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



Если изучить эту визуализацию, прослеживается следующая закономерность: с ростом репутации число копирований на пользователя начинает снижаться. Корреляция присутствует, но не слишком выраженная, поэтому я не могу с полной уверенностью сказать, что пользователи с хорошей или плохой репутацией однозначно копируют активнее. Разработчики, которые еще только нарабатывают навыки, часто имеют невысокую репутацию и при этом склонны искать ресурсы, которые могут ускорить процесс обучения. По мере накапливания знаний они наращивают и репутацию и начинают работать с задачами, которые требуют хорошо откалиброванных решений такие не всегда удается найти на Stack Overflow.

Чаще ли копируют принятые ответы?


Ход мысли здесь выстраивается так: раз ответ приняли, значит, он, наверное, самый лучший, а раз так, то его и копировать должны с удвоенной энергией. Однако если взглянуть на статистику, то мы увидим, что в 52,4% случаев копируются не принятые ответы. Впрочем, если говорить о средних значениях, то на один уникальный пост с принятым ответом приходится семь копирований, а с не принятым только пять. Получается, что не принятые посты дают больше копирований, но у принятых активнее разворачивается тот самый процесс многократного использования знаний.



Следует отметить, что существуют и такие вопросы, у которых в принципе нет принятых ответов. Взять, допустим, вот этот ответ: за него проголосовали 4 984 уникальных пользователя, а скопировали 7 943 за время нашего исследования. Но спрашивающий его не принял. Да и никакой другой тоже не принял возможно, это как-то связано с тем, что он вообще не появлялся на сайте с 2010 года. Но многие другие полезные ответы находятся в том же положении.

Активнее ли копируют посты с высоким рейтингом?


Итак, принятые ответы не имеют преимущества при копировании, но уж высокий рейтинг-то точно должен влиять, верно? Давайте проверим.



Как мы видим, в категории ответов в группах от одного и до тысячи голосов всё идет довольно ровно. А вот в случае с вопросами большинство копирований приходится на посты с рейтингом от одного до пяти. Подозреваю, это потому, что люди копируют их для перепоста, пока наконец не появится ответ.

Как и в ситуации с пользователями, основная масса постов на сайте имеет довольно низкий рейтинг. Для нормализации посмотрим, сколько копирований приходится на один пост.



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

А посты с плохим рейтингом кто-нибудь копирует?


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

Посмотрите на этот ответ. Из всех ответов с отрицательным рейтингом он у нас собрал максимум копирований 288 штук при рейтинге -2. Если вчитаться в текст, можно заметить, что он в более сжатом виде излагает то же самое, что говорится в самом популярном ответе с рейтингом 29 и 493 копированиями в общей сложности. Пусть ответ с отрицательным рейтингом и не выбился вперед по числу копирований, но все-таки принцип ниасилил тут явно сыграл в его пользу.

Из каких тэгов копируют чаще всего?


Именно на этот вопрос мне больше всего хотелось получить ответ. К сожалению, из-за масштабов исследования и объемов доступных ресурсов провести парсинг вложенных тегов не удалось. Скажем, в тэге html не учитываются посты, у которых проставлено сочетание тэгов |html|css|.

Чаще всего контент копировали из самых популярных и активных тегов на сайте, чему никто не удивился. Мне только одно бросилось в глаза: python фигурирует сразу в четырех группах тегов из первой десятки. Три из них имеют прямое отношение к анализу данных: |python|pandas|, |python|pandas|dataframe| и |python|matplotlib|. Я сам к этой теме неравнодушен, так что очень рад, что так много людей осваивает эти инструменты.



Топ 10 тегов, теперь с числом копирований на пост


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



Какие посты копировали больше всего?


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

Ответ с блоком кода

Рад сообщить, что победителем вышел ответ на вопрос How to iterate over rows in a DataFrame in Pandas, у которого 3 497 голосов и 11,829 копирований. Его разместили в 2013 году, и он до сих пор продолжает выручать тысячи людей каждую неделю.

Ответ с обычным текстом

Если же говорить о контенте, не содержащем кода, тут выходит вперед пост на тему TypeError: this.getOptions is not a function [closed] с 218 голосами и 1 570 копированиями. Нет возможности проверить, но я полагаю, что копируют фрагмент `sass-loader@10.1.1`.

Вопрос с блоком кода

Среди вопросов у нас лидирует How to create an HTML button that acts like a link? 2 147 голосов и 3 665 копирований.

Вопрос с обычным текстом

Ну и наконец, самым популярным вопросом без кода оказался Updates were rejected because the tip of your current branch is behind its remote counterpart 322 голоса и 261 копирований. С ним есть сложности, потому что в тексте содержится много git-команд, которые не оформлены как блоки кода возможно, активно копируются как раз-таки они. Но так как сам текст, который подвергался копированию, мы не сохраняли, никто никогда не узнает.

Комментарии

Важно помнить, что Stack Overflow это не только вопросы-ответы. Иногда и одного толкового комментария бывает достаточно. Вот парочка из тех, которые копировались особенно активно!



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

Дайджест интересных материалов для мобильного разработчика 388 (28 марта 4 апреля)

04.04.2021 12:12:21 | Автор: admin
В новой недельной подборке архитектурные паттерны и новая WWDC21, распознавание карт и 13 подвохов мобильного приложения, траты пользователей, тестирование иконок и многое другое!



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Как меня Apple навечно забанил
Архитектурные паттерны в iOS: страх и ненависть в диаграммах. MV(X)
Compositional Layout: стоит ли игра свеч?
Почему мы не обновляли приложение ВКонтакте для iPad пять лет, а теперь обновили
Подключаем нагрудный датчик пульса по Bluetooth на Swift
Настало время офигительных историй[1/2]
Разрабатываем своего первого голосового ассистента на iOS
App Store отклоняет приложения, использующие сторонние SDK, которые собирают пользовательские данные
WWDC21 пройдет онлайн с 7 по 11 июня
Как создавать виджеты с WidgetKit
7 эффективных ключевых слов для оптимизации вашего Swift-кода
Представляем Epoxy для iOS
Синглтон против внедрения зависимостей в Swift
Удаляем фон в изображениях на Swift с помощью Core ML
2 iOS-инструмента для обнаружения мертвого и клонированного кода
Как перенести Луну в вашу комнату с помощью ARKit
Три типа дыр в безопасности, которые я вижу во многих iOS-приложениях
SwiftUI Animations: анимации на SwiftUI
ProgressHUD: анимированные иконки

Android

Доказательное программирование
CameraX+ML Kit для распознавания номера карты в действии
Google ограничивает, какие приложения могут видеть другие установленные приложения
Jetpack Activity Result API. Часть 2. Как работает под капотом
Google выпустил сканер документов Stack
Android Broadcast: как попасть на стажировку в Redmadrobot
Отладка скриптов сборки и плагинов Gradle [IntelliJ/Android Studio]
Самое простое руководство по пониманию Gradle!
Непустые списки в Kotlin
Более безопасный способ сбора потоков из пользовательских интерфейсов Android
Системный сбой в Android WebView: как разработчики могут избежать такой ошибки
Знакомимся с поведением ваших зависимостей
Запускаем ARM-приложения в эмуляторе Android
Реализация Snackbar для отмены действий в Jetpack Compose
Motion Layout: создание простой анимации Recycler View
Десять #AndroidLifeHacks, которые вы можете использовать прямо сейчас
LabeledSeekSlider: настраиваемый слайдер
Flux: погода на Jetpack Compose
KanbanBoard: канбан-доска на Kotlin

Разработка

13 подвохов мобильного приложения, о которых лучше знать до старта разработки
Осмысленные интерфейсы
TestOps: писать автотесты недостаточно
Какие вопросы ожидать на позицию автоматизатора и причем тут сортировка?
Дайджест релизов мобильной разработки Mail.ru Group за время пандемии
Storybook + Flutter = storybook_flutter
Паттерны и Методологии Автоматизации UI: Примеры из жизни
make sense: О карьерном росте до руководителя, необходимых навыках, лидерстве и доверии
Podlodka #208: операционные системы
GitHub обновил уведомления в приложении
Дизайн приложений: примеры для вдохновения #38
Google улучшает установку PWA
20 обязательных навыков для разработчиков 2021
CoScreen создает общую среду для разработки
Опыт 10,000+ экранов: 10 советов от ведущего продуктового дизайнера
Как мы разработали приложение за 300 тысяч и чуть не потеряли 4 млн рублей
Проектирование микро-взаимодействий в Figma с помощью интерактивных компонентов
Это начало конца PWA?
Бесшовная разработка мультиплатформенных приложений с Flutter
4 простых совета, чтобы стать более ценным разработчиком
6 основных различий между Junior и Senior разработчиком
Как мы ускорили нашу систему Continuous Integration на 50%
Как спланировать успех при запуске нового технического проекта
7 уроков моего пути от Junior-разработчика до Senior за 2 года
10 самых популярных вопросов на собеседовании по системному дизайну
ГОНКА к маркетинговому успеху
Инструменты для создания мобильных приложений с дополненной реальностью (AR)
Основы GitHub Actions
4 ошибки, которые я сделал как программист, но мне пришлось стать техническим директором, чтобы увидеть их
Разработка программного обеспечения игра проигравших
Как реализовать покупку подписок в приложении на Flutter
Доставка лучшего программного обеспечения быстрее: как мы сэкономили полмиллиона долларов
Чем мы можем делиться в Kotlin MultiPlatform: модули? данные? экраны?
Создайте свое приложение на Flutter за 5 дней

Аналитика, маркетинг и монетизация

Маркетологи в мобайле: Игорь Посталенко (Тинькофф)
Средний пользователь iPhone в США потратил в 2020 году на приложения $138
Траты пользователей на приложения и игры поставили новый рекорд в 1 квартале 2021
Прекращается работа Facebook Analytics
TechIntern: биржа IT студентов
A/B-тестирование иконок: опыт DEVGAME
Российский игровой рынок в 2020 году вырос на 35%
Lookout for Metrics от Amazon оценивает бизнес с помощью машинного обучения
Доверяете ли вы статистике от Google?
Яндекс попросил Samsung и других производителей не устанавливать неудаляемые приложения компании

AI, Устройства, IoT

Что такое IoT и что о нем следует знать
Microsoft поставит 120,000 HoloLens в армию
Snapchat готовит новые AR-очки Spectacles
IoT-устройства переведут на российский софт

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

Перевод Разработчики не могут исправить ошибки управленцев

18.06.2021 12:04:53 | Автор: admin
Мне постоянно попадаются статьи, в которых разработчиков упрекают за нежелание вникать, зачем нужна их работа, и доказывают им, что это неправильно вслепую вносить изменения, не разбираясь, какая за этим стоит цель. Звучат призывы в духе оглянитесь вокруг, не уходите с головой в написание кода!. На мой взгляд, эти статьи обращены не к тем людям.

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

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

Организации, живущие по заветам университетских программ делового администрирования, избегают моделей с нефиксированными объемами работ. Им проще сосредоточиться на том, чтобы у технических команд было что-нибудь Готово к определенному сроку. Готово обычно бывает что-то никому не нужное, потому что вопрос об определении реальных потребностей аудитории замяли. Вдобавок в проекте обычно царит полный хаос, потому что команда раз за разом бросает силы на то, чтобы делать новый функционал, вместо того чтобы оценить свою работу и устранить тот самый хаос. Единственный плюс того, что проект довели до состояния Готово как правило, это событие отмечают пиццей и тортом. Если очень повезет, то еще и умеренным повышением кого-нибудь из команды, за то, что уложились в сроки. Правда, в реальности новым функционалом люди не пользуются, но это до поры до времени не имеет значения, пока в один прекрасный день кто-нибудь (как правило, финансовый директор) не посчитает KPI по формуле 4Х и не урежет команде финансирование.

В истории уже такое было


Для сложившейся ситуации в разработке ПО можно привести историческую параллель. Где-то в сороковых годах прошлого века Уильям Эдвардс Деминг предложил производителям автомобилей Детройта новую методику автомобилестроения. В Детройте в то время деньги гребли лопатой за счёт того, что успели захватить самый прибыльный рынок в мире, и, честно сказать, не видели смысла что-то менять в принципе. Получив отказ, Деминг перешел на другие виды деятельности, стал принимать участие в восстановлении японской экономики после войны. Там его методы показали себя хорошо, и понемногу машины японского производства стали теснить Детройт на рынке.

Форд получил наглядный урок, когда столкнулся с тем, что покупатели были готовы ждать и доплачивать, лишь бы купить машину марки Форд с коробкой передач производства компании Тойота. Инженеры компании в недоумении разобрали коробки, чтобы сравнить детали, и по замерам выяснили, что у продукции Тойота детали в два раза точнее соответствуют чертежам. Благодаря этому в механизмах всё стыковалось лучше и давало меньше перебоев в работе.

К 1981 году, когда Япония подтачивала позиции Форда на рынке уже десятки лет, руководство наконец сдалось и пригласило Деминга отладить производство. В их преставлении проблема заключалась в качестве изготовления деталей иными словами, в рабочих, которые изготавливали недостаточно качественные детали. Ведь не начальство же этим занимается. К большому их удивлению, Деминг заявил, что 85% проблем, негативно влияющих на качество продукции, происходят от неправильного руководства. Компании понадобилось шесть лет, чтобы перейти на новую модель, и результатом стала линейка автомобилей Taurus-Sable на голову выше того, что они делали до этого.

Основной ошибкой компании Форда было то, что, продумывая, как можно улучшить производство, руководство не обращалось к людям, которые занимались им непосредственно. Компании удалось значительно поднять качество продукции простым способом: менеджерам было поручено опросить рабочих на тему того, что и как можно делать лучше. Замечания выслушивались, а затем на их базе в процесс производства вводились новые практические усовершенствования. Раньше они использовали другой подход менеджеры сами придумывали абстрактные усовершенствования (зачастую с подачи начальства) и заставляли рабочих их внедрять. Сегодня мы наблюдаем тот же антипаттерн оптимизации сверху вниз в разработке ПО.

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

Американским рабочим нужно всерьёз задуматься надо отладкой производственных процессов перенимайте опыт компании Тойота!
Рабочим следует итерировать совместно с клиентами, чтобы создавать автомобили наивысшего качества.
Рабочие на производстве автомобилей слишком много внимания уделяют деталям в ущерб пониманию причин.
Создание хорошего автомобиля не сводится к изготовлению и сборке деталей.

Авторы хотят как лучше и, на первый взгляд, вроде бы дают разумные советы. Но как именно эти самые работники автомобильной промышленности должны перекраивать рабочие процессы? Им предлагается переучивать начальство? В истории прецедентов особо не встречается, и я сильно сомневаюсь, что и сейчас это кому-то удастся. В подобной же ситуации оказываются и разработчики многих компаний. Большинство работает под игом выпускников по специализации делового администрирования. Каждый разработчик становится метафорическом винтиком в системе PMP/WBS всем по диаграмме Ганта, менеджеру проекта и индикатору типа задачи.

И даже когда компания, работающая по традиционной модели, решает переключиться на Agile, зачастую всё выливается во внедрение антипаттерна Date Scrum, который прекрасно уживается со стандартным подходом к руководству. Растущая популярность Date Scrum привела к тому, что у многих разработчиков сложилось неприязненное отношения к практикам Agile вообще. Их сложно винить: если до внедрения Agile им приходилось терпеть собрания с отчетом по текущим задачам раз в пару недель, то с Date Scrum приходится страдать ежедневно!

Что такое Date Scrum?
Это практика из сферы R&D, которая предписывает разработчикам оценивать проектные требования сразу для всей протяженности работ целиком. Когда проекту дают зелёный свет и утверждают бюджет на базе конечных оценок, команда каждый день собирается на встречах (скрамах), чтобы отчитаться по текущему положению и нейтрализовать рискованные моменты; таким образом решение итерируется по мере продвижения к дате релиза. Некоторые воспринимают этот подход как каскадную модель, только реализованную спринтами.

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

Так почему многие проекты в IT оканчиваются крахом? Разработка намного больше напоминает создание новой фабрики, чем подержание деятельности на уже существующей. Традиционный менеджмент рассчитан как раз на последнее он применяет жёсткие, отработанные практики для организации задач, время выполнения которых известно заранее. Разработка складывается из последовательности множества задач, время выполнения которых неизвестно. Из-за этой заложенной в самой природе деятельности непредсказуемости традиционные техники, в которых планирование основано на прогнозах, абсолютно к ней не подходят.

Форду понадобилось сорок лет, чтобы перенять модель, разработанную Демингом. Сейчас темп жизни ускорился, и компании, которые ещё сорок лет намерены продолжать дёргать талантливых разработчиков, просто не вытянут. Полагаю, что большая часть тех, кто будет сопротивляться изменениям, пойдет ко дну уже лет через десять. Подобные мрачные предзнаменования вызваны тем, что компании с традиционным подходом работают по методичкам, написанным для промышленной сферы. Они разбивают сотрудников на группы по типу работ, а затем оптимизируют все отделы при помощи одного набора жёстких, шаблонных лучших практик, которые обычно один в один списаны с фабричных. Именно это препятствует созданию продуктов, которые несли бы ценность за счёт выявления и закрытия важных потребностей, и приводит к тому, что разработчики вынуждены с головой уходить в код, который в конечном счёте никому не нужен. По той же причине в компаниях упорно закрывают глаза на все знаки того, что проект сошел с рельсов в них слишком крепко прижились застарелые антипаттерны из университетских программ. Например:

  • Разработчики, которые тратят вполне разумное количество дополнительного времени на то, чтобы проверить то, что сделано, и устранить хаос, считаются какими-то неспешными.
  • Разработчиков, которые замечают какое-либо несоответствие между продуктом и запросами рынка, мягко отправляют обратно за клавиатуру, строгать новый функционал. Всё, на что они могут рассчитывать обещание, что группа, генерирующая идеи, обо всём позаботится.
  • Разработчики, которые быстро выкатывают продукты на суд соответствующей сторонней группы, ценятся, потому что оперативно приводят всё в состояние Готово.
  • Разработчиков, которые ведут полевые наблюдения и видят, что пользователи испытывают трудности с продуктом, ненавязчиво возвращают в рамки общей программы.
  • Техлидов, которые пытаются вникнуть в Общую Картину (как продукт приспособлен к рынку, как определяются цены и состав пакетов услуг), похлопывают по плечу и отправляют обратно, мотивировать разработчиков на производство очередного функционала сомнительной полезности.
  • Разработчикам, которые пытаются держать ситуацию под контролем при помощи техник статистического управления хаосом, рекомендуют оставить всё это группе, ответственной за Качество как будто люди, которые не писали код, справятся с делом лучше!

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

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

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

  • Избегать контроля в мелочах: код всё-таки пишут разработчики, не менеджеры;
  • Не приходить в команду с нулём технических знаний: нет ничего хуже, чем руководитель, который смотрит мутным взглядом, когда пытаешься ответить на его вопрос.
  • Не прогибаться под любым давлением: корпоративная политика однозначно входит в сферу ответственности менеджера. Пожалуйста, представляйте интересы команды на совесть.

Учитывая мнение разработчиков, руководство должно отказаться от следующих практик, которые плохо приспособлены для проектов, связанных с ПО:

  • Планирование по прогнозам, которое строится на дробной оценке сроков. Это годится для процессов, в которых точно известно время исполнения задач, разработка к ним не относится.
  • Дробная оценка сроков силами разработчиков.
  • Иерархическая структура работ опять же, хороша там, где точно известно время исполнения.
  • Определение дью исходя из некорректных оценок сроков.
  • Применение Agile Scrum, за исключением случаев, когда работа ведётся в связке с заказчиком, который в этом разбирается.
  • Некритическое принятие масштабов проекта, заявленных группой, которая генерирует идеи.

Что за группы, генерирующие идеи?
Это структуры внутри компании, которым поручается придумывать новые продукты и новый функционал. Затем их идеи передаются на реализацию другой группе. Во многих компаниях за этот круг задач отвечают менеджеры продуктов.

В команде iiSM.ORG бытует мнение, что ПО меняет в жизни, работе и развлечениях людей очень многое за счет оптимизации и автоматизации. Доля IT-предприятий среди мировых топ-компаний неуклонно растёт по экспоненте, и вскоре наш ждёт целый поток изменений, который вызовет переворот в бизнесе и видоизменит общество. Если мы правы (а я полагаю, что правы), то руководителям, работающим по старинке, придётся подстраиваться под реалии мира после цифровой трансформации. Поэтому давайте не пожалеем времени на то, чтобы донести: традиционные техники менеджмента попросту не работают применительно к разработке ПО и продержаться на них в долгосрочной перспективе невозможно.
Подробнее..

Перевод А вы когда-нибудь причиняли себе физическую боль собственным кодом?

04.06.2021 10:04:57 | Автор: admin
Приходилось ли вам когда-нибудь ненароком причинить себе или другим физический вред из-за ошибок в коде? Мне да.

Примерно год назад я работал со сгенерированными файлами в формате WAV, их было несколько тысяч. Я пытался снабдить их метками, рассортировать по папкам, создавал метаданные. В процессе я прослушал несколько штук, и, к моей досаде, оказалось, что все они начинаются с довольно продолжительной тишины. Это сильно раздражало, особенно когда прослушиваешь серию файлов подряд и постоянно спотыкаешься о паузы перед воспроизведением каждого следующего. Прекрасно, значит, еще и с этим придется что-то делать.

Я уже потратил сколько-то времени на поиск решений для удаления тишины из файлов, когда меня вдруг осенило: это ведь WAV! Данные в файлах формата WAV обычно представляют собой PCM-аудио, то есть каждое значение в файле задает амплитуду звука в некоторый момент времени. Соответственно, если у нас там действительно полная тишина, а не белый шум, то в файле этой тишине должны соответствовать сплошные нули, так ведь?

$ xxd testfile1.wav | head -n 10000000000: 5249 4646 64b9 0e00 5741 5645 666d 7420  RIFFd...WAVEfmt 00000010: 1000 0000 0100 0200 44ac 0000 10b1 0200  ........D.......00000020: 0400 1000 6461 7461 40b9 0e00 0000 0000  ....data@.......00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................00000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................00000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................# ... and a lot more zeros below

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

Как читаются файлы WAV


Сначала мне нужно было поближе познакомиться с форматом WAV, чтобы понять, как работать с такими файлами и управлять данными внутри них. Я подобрал несколько источников; одним из самых полезных оказалась старая страница со stanford.edu (сайт сейчас уже недоступен, но, к счастью, сохранился на Wayback Machine). Там была очень доходчивая диаграмма:


Итак, структура файла WAV представляется довольно простой: сначала заголовок объемом в 44 байта, а дальше уже собственно данные. С этой информацией уже можно было приступать к коду. Требовалось только пропустить первые 44 байта, убрать последовательность из нулей в начале секции с данными, а всё остальное отправить на воспроизведение в исходном виде. Хотя не могу не добавить, что в другом источнике мне попались такие сведения:

Некоторые программы предполагают (и это очень наивно с их стороны), что вводная часть в заголовке всегда занимает ровно 44 байта (как говорится в таблице выше) и что всё остальное содержимое файла составляют только и исключительно аудиоданные. Делать подобные предположения небезопасно.

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

Код


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

Целиком код приводить незачем, но вот та часть, которая будет нас интересовать:

// index was calculated above to be the index of// the last consecutive zero byteFILE *f = fopen(argv[1], "rb");int ind = 0;int current_byte;while ((current_byte = fgetc(f)) != EOF) {    if (ind < 44 || ind >= index) {        fputc(current_byte, stdout);    }    ind += 1;}fclose(f);

Всё круто, всё просто. Пора тестировать. Я запустил программу на одном из файлов с особенно продолжительной паузой.

./strip_audio testfile1.wav > testfile1.nosilence.wav

Проверил, что выдаёт xxd для testfile1.nosilence.wav. Отлично, никаких нулей в начале. Значит, сработало. Чтобы окончательно убедиться, открою-ка я по-быстрому файл в аудиопроигрывателе.



Источник

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

Где я ошибся?


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

  • Ошибка 1: надо было убавить звук.
  • Ошибка 2: не надо было сидеть в наушниках.
  • Ошибка 3: неучтённая единица.

А вы заметили третью ошибку в коде, который я приводил выше? Подсказка: смотрите на комментарий. Я рассчитал переменную index как индекс последнего байта, представляющего собой нули. А значит, за вычетом 44 байтов заголовка, теперь мы воспроизводим только то, что следует за индексом или накладывается на него. index у нас стоит на последнем нуле в серии, то есть мы включаем один лишний нулевой байт в секцию с данными.

Это можно исправить следующим образом:

//     replaced >= with just >if (ind < 44 || ind > index) {    fputc(current_byte, stdout);}

Теперь в выдаче нет лишних нулей, и если воспроизвести файл, ничего страшного не случится. Я всё починил Но стоп.

В файлах WAV у нас PCM-аудио, а нули в аудиоданных такого рода соответствуют полной тишине. Так разве этот лишний байт не должен быть совершенно бесшумным? Почему он оказался таким громким и таким статическим?

Для начала давайте сравним нормальный аудиофайл с монстром, которого я создал, при помощи Audacity:


Угадали, где монстр? Да, это тот самый, у которого амплитуда стабильно вывернута чуть ли не максимум. Почему так?

Как читаются аудиосэмплы


Я вернулся к источникам, которые отобрал, и попытался разобраться, как ошибка на единицу могла привести к подобному взрыву амплитуды. Я знал, что в моих файлах сэмпл содержит 16 бит, а канала два (стерео), поэтому стал искать соответствующую информацию. Вот что говорилось в разделе про 16-битное стерео PCM-аудио:

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

Минимально достаточное количество байтов для хранения заданного размера формулировка здесь излишне запутанная. i соответствует числу битов, которые содержатся в сэмпле. В нашем случае их шестнадцать. Соответственно, если у нас есть некое значение длиной в 16 битов, само собой, храниться оно будет в двух байтах. А дальше важный момент: наименее значимый из байтов располагается в хранилище первым. Вот оно.

Взгляните на график, который я сделал, чтобы показать, что привело к возникновению такого сильного сигнала:


В верхней части показан мой файл-монстр, в котором я случайно оставил лишний байт с нулями. В каждом из трёх сэмплов s1, s2 и s3 по два байта, причем второй более значимый. Следовательно, при переводе этих пар байтов в десятичную форму мы получаем очень высокую амплитуду.

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

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

Выводы


  • Проверяйте звуковую волну аудиофайла, прежде чем врубать его на максимальной громкости
  • Читайте (и принимайте к сведенью) спецификации
  • Учитывайте, как код может повлиять на вас и других людей
Подробнее..

Перевод Проваленное собеседование, которое дало мне больше, чем три удачных

30.04.2021 14:04:59 | Автор: admin


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

Несколько месяцев назад я решил устроиться на должность программиста-сениора: внес в резюме все самые свежие свои навыки и проекты и разослал его по компаниям. Одна из этих компаний пригласила меня на серию собеседований стандартного типа: одна встреча посвящена написанию кода, другая проектированию систем, еще несколько соответствию командной культуре и завершает всё финальная встреча с руководителем или замом команды программистов. Все этапы прошли хорошо, за исключением того, который касался проектирования систем. О нём я и хотел бы вам рассказать.

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

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

Наконец, мы переходим к собеседованию, посвященному проектированию систем, и тут всё становится интереснее в смысле, я его завалил. Постараюсь углубиться в детали того, как оно проходило, объяснить, где и что я сделал не так, и дать некоторые рекомендации.

Моей задачей на этом собеседовании было спроектировать сервис для сокращения ссылок.
Функциональные требования приводились следующие:

  • Сервис должен генерировать для загруженного адреса короткую версию, в которой за доменным именем следует ключ длиной в семь символов. Это называется короткой ссылкой: например, shorturl.com/9zck6rc.
  • Когда пользователь пытается перейти по короткой ссылке, сервис должен перенаправить его на исходный адрес.

Нефункциональные требования были такими:

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

Для начала я определился с тем, какие конечные точки нам понадобятся, чтобы создавать короткие ссылки и как мы будем извлекать ссылки исходные. Получался простой сервис с базой данных, где будут храниться все id, long_url, short_url, и created_at. По ходу дела у нас с собеседующим состоялось обсуждение нескольких вопросов.

Вопрос первый: SQL или NoSQL


Я начал с того, что выбрал подходящий тип базы данных для сервиса. Я предложил NoSQL совсем вылетело из головы, что, раз объем аудитории у нас небольшой, о масштабировании можно не беспокоиться. Аргументы в пользу NoSQL я приводил довольно убедительные, но для нужд инструмента, который мы проектировали, вполне хватило бы и SQL обосновать, почему выбор должен непременно пасть именно на систему NoSQL, мне не удалось. Я стал приводить примеры сервисов, которые используют NoSQL, типа систем бронирования, и оседлал этот конёк надолго.

Ошибка первая: Я увлекся объяснениями. Да, нужно пояснять для того, кто проводит собеседование, почему вы выбираете именно такой вариант, но слишком долго излагать лишние подробности всё-таки ни к чему. Я несколько минут проговорил о том, что в реальности можно было бы объяснить в нескольких фразах. Очень важно уметь себя остановить, чтобы не продолжать развивать мысль до бесконечности.

Рекомендация: вызывайте собеседника на обратную связь. Диалог не должен превращаться в монолог.

Вопрос второй: генерация короткой ссылки


Дальше следовал ключевой для работы системы шаг: нужно было задать логику, по которой будут генерироваться короткие ссылки. Не буду слишком грузить подробностями, но там нужно было вычислить уникальный хэш (SHA256), а затем закодировать его в Base62. У этого способа имеются определенные недостатки, есть риск, что появятся дубликаты.

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

Ошибка вторая: у меня были ложные ожидания. Я не предполагал, что на собеседовании по проектированию систем будут до такой степени уходить в детали. К моему большому удивлению, расспрашивали очень подробно. Более того, с точки зрения собеседующего, именно это и составляло основную суть задачи, здесь я и должен был показать свои знания. Мне следовало уделить этому вопросу больше времени, а я вместо этого потратил непозволительно много на предыдущую тему.

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

Вопрос третий: репликация базы данных


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

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

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

Рекомендация: не бойтесь сказать: Не знаю, если это сбережёт вам время на более важные вещи.

Вопрос четвёртый: кэширование


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

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

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

Ошибка четвертая: мне не хватило уверенности. С концептом распределенного кэширования я знаком хорошо, даже в проектах применял его не раз, но отвечая на этот вопрос, почему-то усомнился в своих знаниях. Хотя решение было рабочее, мне показалось, что меня куда-то не туда понесло. А ведь единственное, что здесь надо было добавить это упомянуть издержки такого подхода.

Рекомендация: здесь можно только пожелать всем верить в себя. Если в чем-то разбираетесь значит разбираетесь.

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

Дайджест интересных материалов для мобильного разработчика 386 (15 21 марта)

21.03.2021 16:08:22 | Автор: admin
В нашей новой подборке троя в библиотеке, автотестирование и полезные протоколы, уязвимости Android и снижение комиссии Google Play, борьба с читерами, человеческое общение, цена покупок, Nest с радаром и многое другое. Подключайтесь!



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Память в Swift от 0 до 1
Погружение в автотестирование на iOS. Часть 4. Ожидания в XCUITest
Работа с сложными JSON-объектами в Swift (Codable)
Коста Элефтериу, создатель FlickType, подал в суд на Apple
Александр Зимин: история победы в Telegram Contest 2021
Библиотека XcodeSpy заражает разработчиков с Xcode трояном
Количество работающих в экономике iOS-приложений в Европе выросло на 7%
Swift 5: полезные протоколы, чтобы писать как профессионал
Реверс-инжиниринг Bluetooth-устройств
Как уменьшить и оптимизировать размер iOS-приложения?
Создание настраиваемого UITextField с помощью Combine
Глубокое погружение в Функции в Swift
Список UICollectionView с интерактивным кастомным заголовком
Чистый Swift: объяснения и шаблоны
Тестирование push-уведомлений в iOS в конвейерах CI/CD
Протоколы в Swift
Реализация модификатора OnChange в SwiftUI для iOS 13
Xcodes.app: много Xcode на выбор

Android

Выходим на рынок Huawei, или Как мы адаптировали приложение для работы с HMS
Большой разговор с новым Kotlin Project Lead Романом Елизаровым
Готовьсь, цельсь, пли! Как не обжечься при сборке Gradle-приложения, и настолько ли всё серьезно?
0x7E5 Рассуждения о главном
Борьба за жизни переменных. Или как я попытался упростить жизнь Android разработчикам
Материалы митапа для андроид-инженеров: поиск проблем сборки, защита от них и работа с Gradle
Уязвимости Android 2020
Android запрещенные приемы
От компьютеров к мобильным устройствам: вывод игр на новые платформы
Android Broadcast: Собеседование в прямом эфире 2. Livecoding. Middle Android Dev
Android Broadcast: новости #7
Плитки в Wear OS открыли для всех
Google снижает комиссию Play до 15%
Компилируйте меньше с SOLID
Использование возможностей дизайн-языка Android
Добавьте вашему приложению жизни
Как мы разработали компонент, который повысил удобочитаемость, масштабирование и тестирование
10 ошибок, которые я сделал как Android-разработчик, но вы не должны
Лучшая обработка состояний между ViewModel и Composable
Создаем приложение с несколькими темами на Android
11 самых популярных библиотек Kotlin на 2021 год
Создаем плагин Android Studio Show layout bounds
Давайте сделаем приложение с таймером обратного отсчета с помощью Android Compose
Tinder-Like: Tinder на Jetpack Compose
Jetpack Release Tracker: отслеживание AndroidX
SegmentedProgressBar: прогресс-бар как в историях Instagram

Разработка

Первые пять шагов для перелома ситуации с читерами в PvP-шутере
Детские шалости: как Roblox стала одной из самых дорогих игровых компаний современности
Минимальное PWA
Автоматизация тестирования мобильных приложений. Часть 2: предусловия, верификация элементов и независимость шагов
Курс тестировщика пройден. А дальше что?
Мобильное настоящее М.Видео: телепортация была стремительной
Flutter вот-вот завоюет Web
Как все-таки экономить на мобильной разработке?
С чего начать изучение Flutter в 2021 году
Адаптация таблиц под мобильные устройства
Обзор мобильного приложения Team
Самый полный список метрик тестирования на русском языке
Podlodka #207: дебаггинг
Flutter Dev Podcast #26: Flutter 2.0
Redmadrobot открывает весеннюю стажировку
Aurora UI: новый визуальный тренд на 2021 год
LinearB объясняет происходящее в проектах разработки
Дизайн приложений: примеры для вдохновения #36
Верхняя или боковая панель навигации: что лучше подходит для вашего продукта?
Как улучшить понимание интерфейса с помощью интуитивных действий
Принципы психологии, которые следует знать каждому продуктовому дизайнеру
Kotlin Multiplatform панацея для разработки мобильных приложений?
5 наиболее часто задаваемых вопросов в собеседованиях программистов в Amazon
Расширения Visual Studio Code для повышения производительности в 2021
Мой опыт собеседования в Google
Будущее приложений: декларативные UI и Kotlin MultiPlatform
Как сделать UI-звуки для игры
10 шаблонов проектирования, которые должен знать каждый архитектор ПО
UX-советы по оптимизации встроенных покупок в играх
Как работать с трудными людьми в программных проектах
Закон Теслера. Вот почему вы не можете сделать UX проще.
Мои 3 самые большие неудачи как разработчика
5 способов увеличить скорость разработки
4 необычных способа улучшить свои навыки программирования
Взламываем код-интервью с помощью этих 5 реальных функций
5 главных ошибок, которые я совершил, когда был нубом в программировании
Clone Wars: клоны популярных проектов

Аналитика, маркетинг и монетизация

Маркетологи в мобайле: Максим Шатерник (Gameloft)
myTracker интегрировался с Google AdMob
Mobile People Talks: Анализируй это аналитика мобильных приложений
Как мы делаем Sleepy: монетизация, первая сессия и paywall
Hi Marley: человеческое общение
Gucci начинает продажи виртуальных кроссовок
Средняя цена на покупки в приложениях выросла на 50% с 2017 года
Apple согласилась на предустановку российских приложений
Основные метрики мобильного приложения

AI, Устройства, IoT

Видеоаналитика М.Видео-Эльдорадо: 30 000 камер, 1 компьютер и нейросеть
Bluetooth Low Energy: подробный гайд для начинающих. Bluetooth Mesh
Google выпускает новый Nest Hub с радаром

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

Дайджест интересных материалов для мобильного разработчика 389 (5 11 апреля)

11.04.2021 14:15:43 | Автор: admin
В новом выпуске делаем таб-ба с нестандартной кнопкой и кастомные переходы, эволюционируем декларативные фреймворки и готовимся к I/O 2021, доказываем разработку и отказываемся от стандартных теней. Все это и многое другое в этом дайджесте!



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Настало время офигительных историй. Кастомные транзишены в iOS. [2/2]
Как реализовать таб-бар с нестандартной кнопкой: CAShapeLayer и UIResponderChain
Работа с Bluetooth в iOS
5 секретов, о которых iOS-разработчики вам не скажут
Понимаем параллельную разработку в iOS
SwiftUI: как сделать снимок экрана с содержимым ScrollView?
Создание системы лицензирования для платных приложений на Swift
Плавный скроллинг в iOS
Hive: игра Улей для iOS
IrregularGradient: анимированные градиенты

Android

Rust включили в список основных языков для разработки платформы Android
Android 12 Developer Preview: готовим приложение к новым обновлениям
Эволюция декларативных UI-фреймворков: от динозавров к Jetpack Compose
Жизнь без AppStore и Google Play: работаем с Huawei Mobile Services и AppGallery
MotionLayout + RecyclerView = красивые анимированные списки
Разбираем ELM архитектуру в рамках мобильного приложения
Простой вариант разношерстного recycler view на шаблоне Посетитель
Конференция I/O 2021 пройдет в мае в виртуальном формате
Google Play Store обновил дизайн
Android Broadcast: GraphQL для мобильных разработчиков. Стоит ли использовать REST?
Android Broadcast: новости #8
Мой опыт работы с Flutter как Android-разработчика
Изучение Jetpack Compose создание простого приложения с таймером
Создание уровня данных репозиторий с помощью корутин в Kotlin
Решайте мобильные продакшен проблемы как Шерлок
GitHub Actions: автоматизируйте рабочий процесс сборки и выпуска Android-приложений
Запомните {mutableStateOf ()} шпаргалка
Шумный код с Kotlin Scopes
10 отличных идей для улучшения времени сборки Gradle
Switch Snake: змейка из переключателей
Holi: цвета Jetpack Compose
Uinspector: иерархия представлений

Разработка

Доказательная разработка или как data-driven подход добавил смысла работе
Как мы изменили пайплайн создания контента в PvP-шутере и забыли про кранчи
Почему мы отказались от стандартных теней Unity для мобильных шутеров и вместо этого написали свои
Вам звонок. Как выстроить отношения между QA и техподдержкой
Как написать плагин для Фигмы: проблема, MVP, решение
История одного видео редактора
Как сократить стоимость мобильной разработки
Как мы сделали мобильное приложение для курьеров ВкусВилл за 9 дней
Синтезатор на Unity 3D
Снова про UI\UX дизайн в 1С или как ускорить разработку мобильных приложений
Podlodka #210: технический консалтинг
7 из 10 программистов жалуются на переработки
Objective-C выпал из топа рейтинга TIOBE, а Fortran вернулся
Zoom выпустил Video SDK
Mail.ru Group запустила совместный редактор кода
Google представил аудиокодек Lyra на основе ИИ
4 ошибки, которые я сделал как программист, но мне пришлось стать техническим директором, чтобы увидеть их
Почему изучение программирования не поможет сохранить ваше рабочее место
Дизайн приложений: примеры для вдохновения #39
Рекомендации по проектированию автозаполнения (autosuggest)
10 лучших UI-китов в Figma для вашего проекта
30 самых популярных вопросов на собеседовании по программированию в Apple (с решениями)
Почему менеджеры по-прежнему хотят писать код
Как мы сделали из членов команды Airbnb мобильных инженеров
Как добиться успеха на кодинг-интервью в 2021 году
Лучший технический стек для разработки мобильных приложений в 2021 году
Эволюция написания современных мобильных приложений
8 обязательных расширений для Flutter-разработчиков
5 лучших навыков Senior-программистов
Маркетинг для инди-разработчиков: исследование рынка
Ежедневный стендап пустая трата времени
Ключевой фреймворк, который я использовал, чтобы изучать любые новые технические навыки
5 лучших практик для создания эффективных кнопок
Дизайн взаимодействий это больше, чем просто пользовательские потоки и клики
Прекратите добавлять комментарии к вашему коду
Полезный фреймворк для именования ваших классов, функций и переменных
Как зарабатывать на программировании
Создание красивого интерфейса во Flutter
Архитектура технологического стартапа, состоящего из одного человека

Аналитика, маркетинг и монетизация

Гайд по мобильной рекламе для тех, кто задумался о монетизации
Как мобильное приложение помогло ВкусВиллу стать лидером по количеству заказов продуктов онлайн
Разработка, аналитика и атрибуция. Какие сервисы нужны для мобильного приложения в 2021?
Маркетологи в мобайле: Николай Липкин (Яндекс.Медиасервисы)
Epic и Apple готовятся к суду
Mem получает $5.6 млн на ведение заметок
Bunch: ассистент по лидерству
Charles получает инвестиции на разговорную коммерцию
Самые скачиваемые приложения в марте 2021
Supercell делает еще три Clash-игры
Руководство по продуктовым метрикам

AI, Устройства, IoT

HMM: ловим мошеннические транзакции
Wi-Fi розетка с управлением через Интернет за 60 минут
Чем мобильные разработчики заряжают девайсы: 10 новых качественных аксессуаров с AliExpress

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

Дайджест интересных материалов для мобильного разработчика 390 (12 18 апреля)

18.04.2021 12:07:38 | Автор: admin
В этом дайджесте рассматриваем новые подходы к спискам и коллекциям, вопросы автогенерации музыки и написание безболезненных unit-тестов, спиннеры и иконки, рост приложений, вентиляторы, генерацию идея для игр и многое другое!



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Связанные неявные выражения в Swift 5.4
Подходы к спискам на UICollectionView
В App Store обнаружили казино, которые притворяются детскими играми
Apple анонсировала конференцию Spring Loaded 20 апреля
Apple работает над комбинацией Apple TV и HomePod
Apple не выпускает iMessage на Android, чтобы пользователи не уходили с iPhone
Более эффективный/быстрый способ получить средний цвет изображения
Представляем Коллекции в Swift
Миграция вашего приложения на Swift Package Modules
Как вложить UITableView в UICollectionViewCell и сделать как у Trello
Создание, анимация и настройка кругов в Swift
5 советов по написанию чистого Swift-кода
Встроенный инструмент рефакторинга Xcode великолепен
Объяснение каждого протокола SwiftUI
UIKit Live Preview для UIViewController и UIView
Руководство по iOS-архитектуре MVVM+Coordinators
Создание нативного обмена сообщениями через Firebase с помощью SwiftUI
CollectionViewPagingLayout: красивые UICollectionView
FDWaveformView: визуализация звука для iOS
3D Flip menu: трехмерное меню

Android

Как портировать SDK Flutter на ТВ-приставку для разработки и запуска приложений Android TV
Практическое использование автогенерации музыки
In-App-Review. Фильтруем негативные отзывы
Пишем unit тесты так, чтобы не было мучительно больно
Стилизуя нестандартно
Реализация Undo в Snackbar на Jetpack Compose
Coroutines: хаотичное изучение
Android Jetpack Compose: простая анимация
Stateful Android приложение с MVI (MODEL VIEW INTENT)
Насколько подробно вы можете ответить на эти вопросы как Android-разработчик?
Compose CameraX в Android
Использование DataStore с сериализацией Kotlin
Кеширование в процессе Android-сборки
Пример против MVI архитектуры
Современный способ передачи данных между фрагментами
Android Tool: упрощение работы с adb и fastboot
BlurShadowImageView: красивые тени для изображений

Разработка

Повышаем качество кода с Dart Code Metrics
Препродакшн игровых проектов: как оценить объем работ на старте и не сгореть к дедлайну
Cordova. Опыт Enterprise-проекта
Уродливый API
Судно на воздушной подушке на Unity 3D
История одного личного кабинета, который помог нам сделать 15 000 курьеров и сборщиков немного счастливее
Регдоллы на Unity 3D
Русские программисты не сдаются
Podlodka #211: Haskell
Рабочий день разработчика гипер-казуальных игр
Дизайн приложений: примеры для вдохновения #40
Google запустил бесплатный курс по Python на Coursera
Полезный фреймворк для именования ваших классов, функций и переменных
Прекратите использовать спиннеры есть кое что получше
Проектирование циферблата CASIO для Apple Watch
Советы по дизайну лучших интерфейсных иконок
Как улучшить навыки дизайна с помощью насмотренности
5 основных продуктовых фреймворков
3 основных урока, извлеченных из создания приложения
Полное руководство разработчика по качеству кода
Книги по программированию, которых не существует (но мы все читали)
Чистая архитектура для корпоративного мобильного приложения
Руководство разработчика приложений для собеседований по системному дизайну
Как я сделал игру за 35 часов
Пять вещей, которые я узнал после решения более 500 вопросов Leetcode
10 бесплатных инструментов для создания пользовательских интерфейсов
Советы по созданию качественного приложения с Firebase
Почему @protocol все поменяли для Flutter-разработчиков?
Как синдром самозванца может помочь вам стать лучшим разработчиком
Создание Age of Empires II
Почему некоторые разработчики избегают головной боли магазинов приложений, оставаясь только в Интернете
Как создавать лучшие иконки
Провал одного технического интервью научил меня большему, чем прохождение трех
Психологические принципы для каждого продуктового дизайнера
7 лучших советов и рекомендаций по работе с Dart для более чистых Flutter-приложений
Резюме, которое привело меня в FAANG
19 реалистичных привычек для улучшения разработки
Замена React Native на Kotlin Multiplatform в Wantedly

Аналитика, маркетинг и монетизация

Как мы достигли 1 млн скачиваний с нулевым бюджетом
На какие языки стоит перевести игру в 2021: обзор от Alconost
Рост мобильных приложений 2020 Отчет Adjust и Facebook
Litoff и App Annie: загрузки финансовых приложений в 2020 выросли на 15%
Исследование AppsFlyer: процент ATT-согласия намного выше, чем ожидалось
Bethesda тестирует Mighty DOOM
Canvas Medical: хороший UI для медицины
7 простых способов ранжироваться в сторе выше
Измените свой дизайн для глобальной аудитории: исследование кросс-культурного UX-дизайн
Как продать мобильное приложение?
Европейские шпили: как наше приложение доехало до Германии и Польши
5 лучших инструментов продуктовой аналитики 2021
Удерживаем пользователей как Amazon, Spotify и др.

AI, Устройства, IoT

Зачем все ставят вентиляторы в туалет или как мы решили сделать умный вентилятор, история по DIY
Edge платы для домашнего Computer Vision
Чем Tarantool круче Redis'а для IoT-сервисов
Создание своей оценочной платы для микроконтроллеров
Война миров во вселенной IoT/IoE доколе?
ИИ-платформа генерации идей для игр Ludo вышла из бета-версии
NVIDIA выпустила диалоговый фреймворк Jarvis

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

Дайджест интересных материалов для мобильного разработчика 391 (19 25 апреля)

25.04.2021 18:04:25 | Автор: admin
В новой подборке машинное обучение на iPhone и прямые intent, навигация без магии и уменьшение размера приложения, извилистые дороги операционных систем, продуктовые фреймворки, простой дизайн, мобильное здоровье в прошлом году и многое другое!



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Как мы подружили Flutter с CallKit Call Directory
Как запустить модель машинного обучения на iPhone
Как мы создали фреймворк для построения графиков в iOS-приложении
Как мы уменьшили размер приложения Pinterest для iOS на 30%
Swift Memory Layout
Презентация Apple: новый iPad Pro
Презентация Apple: Apple TV 4K
Презентация Apple: метки AirTag
Создание Издателей для HealthKit
Разматывающиеся переходы в Swift 5
MVVM + Координаторы туториал по iOS-архитектуре
Юнит-тесты в iOS
Геттеры и сеттеры в Swift
Самые полезные шорткаты Xcode
MJMaterialSwitch: материальный переключатель для iOS
SwiftShield: обфускация Swift-кода

Android

Давайте будем прямыми в своих intent
Применение SQLiteOpenHelper и Database Inspector в Android-разработке
Фоновая работа в Android: обзор возможностей WorkManager
Пишем под Android с Elmslie
Навигация в многомодульном приложении на Jetpack без магии и DI
Android 12 сможет автоматически переводить приложения на другие языки
Пример приложения для VoIP звонков для Android
CI/CD для Android с использованием Bitbucket Pipelines и Gradle Play Publisher
Модульная Навигация с помощью Jetpack Compose
Приложение Pi Practice в Compose
Анимация с помощью Jetpack Compose
Ускоряем компиляцию Android на устройстве Apple M1
NavigationUI
RecyclerView с волшебными касаниями
RoundedProgressBar: красивый индикатор для Android
Login Template: вход в приложение на Jetpack Compose
Dads: лучшие папины шутки для Android

Разработка

Создаём 2,5D-игру жанра Dungeon Crawling в Unity
Извилистые дороги корейских ОС, или Как Tizen OS и webOS к успеху шли
Создаем свой шахматный движок: алгоритм игры компьютера
Миграция мобильного приложения на Dart 2.12 (Flutter 2)
Библиотека Oboe для высокопроизводительного аудио в играх и приложениях
Игровые механики на уроке геометрии или векторы на Unity 3D
Разделяй и властвуй Использование FSM в Unity
Лучшие клавиатуры для программирования 2021
Nhost делает открытую альтернативу Firebase
Podlodka #212: профессия: Solution Architect
Резюме, которое приведет вас в FAANG
5 главных продуктовых фреймворков Waze
Взламывая код мобильной продуктивности
ВКонтакте проводит седьмой сезон VK Cup
5 вещей, которые я узнал после решения более 500 задач на Leetcode
UserZoom получил $100 млн. на тестирование пользовательского опыта
Что на самом деле означает простой дизайн? Правильный подход к созданию UI-kit для iOS
6 приемов в дизайне, которые помогут вам установить отношения с вашими пользователями
Visual Studio 2022
Как писать самодокументирующийся код
3 структуры данных для прохождения кодинг-собеседования
Веб-приложения это не будущее
Ваш UI неряшливый? 7 распространенных ошибок, которых следует избегать
1 год работы с Flutter: извлеченные уроки
Дизайн для дислексии
Все циклы плохо пахнут
Дайте своему клиенту приятные впечатления от заказа McDelivery Simplified
Test-Driven Development во Flutter
Руководство CTO по современному технологическому стеку
22 лучшие практики, которые помогут вывести ваши навыки проектирования API на новый уровень
Ваш язык программирования не имеет значения
20 вещей, которые я хотел бы знать до того, как начал работать менеджером по продукту
Как Duolingo проводит масштабные эксперименты
Создание поиска для вашего продукта
Скелетоны в Flutter
Чистая архитектура для чайников
3 различных типа роадмепов, которые необходимо освоить каждому PM

Аналитика, маркетинг и монетизация

Epic Games Store увеличивает количество приложений
EA готовит мобильный Battlefield
Мобильное здоровье 2021: отчет Sensor Tower
LOVEMOBILE #11: SLON Media
Zoom запустил фонд для инвестиций в приложения на своей платформе
Microsoft делает новый магазин приложений для Windows 10
Правила AppTrackingTransparency начнут работу с 26 апреля
Я локализовал свою игру на 11 языков: что это дало
N26: страховой банк
Доходы приложений для свиданий в январе поставили рекорд
40 тыс MAU в приложении с бюджетом в 150 тыс
7 метрик, которые помогут вам принимать более разумные решения на этапе Product-Market Fit

AI, Устройства, IoT

Samsung превратит устаревшие смартфоны пользователей в устройства для управления умным домом
Молодые изобретатели смогут получить 3 млн рублейв конкурсе James Dyson Award
Я запрограммировал простой AI для NFS Most Wanted
Математика, необходимая для успешного прохождения собеседований по машинному обучению

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

Дайджест интересных материалов для мобильного разработчика 392 (26 апреля 2 мая)

04.05.2021 08:16:25 | Автор: admin
Уходим на длинные выходные с новой подборкой интересных статей и новостей. В ней библиотеки и борьба с Apple, карточки ВКонтакте и качество кода, Flutter и Kotlin, умение заканчивать проекты, понимать путь клиента и многое другое!



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Переход вашего приложения на модули пакетов Swift
Мечтал стать сценаристом, а стал программистом
В App Store появились поисковые подсказки
10 SwiftUI-библиотек 2021
Начато производство Apple M2
Apple выпускает обновление iOS 14.5
Немецкие компании подают антимонопольный иск против Apple, касающийся iOS 14.5
ФАС оштрафовала Apple на $12 млн по иску Лаборатории Касперского
Начинаем работу с Combine (практические примеры фреймворка Combine в UIKit и SwiftUI)
Руководство по многопоточности Grand Central Dispatch
Градиент в Swift за 4 строчки кода
SwiftUI в продакшене
Что такое Замыкания и как они работают в Swift? (Пошаговое руководство)
Кастомные переходы View Controller-ов в Swift
Введение в работу с Codable в Swift
Swift: как написать полный логер
Скелетный проект для масштабируемой разработки под iOS
SwiftUI: как создать ячейку со свайпом
Кастомный Top Tab
Простая валидация форм с RxSwift
Начинаем работу с Firebase Realtime DB на WatchOS
GLWalkthrough: онбординг с подсветкой

Android

Как реализован экран с карточками заявок в друзья и рекомендациями в приложении ВКонтакте
Как мы интегрировали Huawei Mobile Services в два этапа
Google Play усиливает борьбу с мислидами
Улучшаем работу Layout Preview в Android Studio
Как повысить качество кода
Android Studio начала поддерживать M1
Опубликовано расписание I/O 2021
Google Play будет собирать данные об использовании приложений для ускорения запуска
Курс Kotlin для начинающих
Кастомная форма с помощью Jetpack Compose
Уроки, извлеченные при переносе моего приложения на Jetpack Compose
Автомиграция Room
Тест на Android Studio бенчмарк компьютеров
Не запускайте бенчмарки в отлаживаемом Android-приложении
Один AlertDialog, чтобы править ими всеми
Jetpack Compose: простой способ сделать RecyclerView
Динамическая доставка с помощью Jetpack Compose
Эволюция Quality Assurance для приложений в Azimo
Красивый сплеш скрин для Android с анимацией
Пример WebRTC в Kotlin
Как обрабатывать изменения конфигурации в Android
Android RecyclerView Swipe Gestures: жесты в RecyclerView
Android ScreenshotDetection: определение скриншотов
Linkester: тестирование глубоких ссылок в приложении

Разработка

Еще пять инструментов против читеров на мобильном проекте с DAU 1 млн пользователей
Моя история реализации офлайн приложения Хабра
Этический антидизайн: как разработать продукт, не вызывающий привыкания
История разработки SDK для приема платежей в мобильном приложении на Flutter
Немного о графиках, сплайнах и генерации ландшафта
Тестирование push-уведомлений в мобильных приложениях
Решение задач позиционирования при просмотре карты во Flutter
Нестабильные(Flaky) тесты одна из основных проблем автоматизированного тестирования
Углубленный анализ тестирования виджетов во Flutter. Часть I: testWidgets() и TestVariant
Начинающему QA: полезные функции снифферов на примере Charles Proxy
Podlodka #213: инвестиции в стартапы
Microsoft Build 2021 пройдет с 25 по 27 мая
Как заканчивать игры (и другие проекты)
Книга Создание мобильных приложений в масштабе: 39 инженерных задач
Дизайн приложений: примеры для вдохновения #41
Хороший дизайн это наука, а не искусство
Кейс: как Surf и Росбанк сделали первое в России банковское приложение на Flutter
Как нобелевский лауреат помог нам с дизайном приложения для I Love Supersport
5 лучших инструментов для создания приложений без кода
Как великие продуктовые менеджеры принимают правильные решения: подход Привычный
Как безопасно выкладывать в open source внутреннее ПО: лучшие практики
5 преимуществ парного программирования и как делать это удаленно с помощью VS Code
Как ежегодно экономить 135,000 евро с Google Analytics 4 + BigQuery
Локальные уведомления во Flutter
10 забавных расширений VS Code, которые помогут программировать
Лучшие практики для дизайна модальных окон
Хотите стать лучшим UX-дизайнером в 2021? Делайте для эмоций
Лучшие практики: дизайн автозаполнения
Почему хорошие инженеры не начинают собственный бизнес
Интервью у senior-инженера в Facebook: единственная статья, которую вам нужно прочитать
Метрики качества кода

Аналитика, маркетинг и монетизация

Понимаем путь клиента по приложению с помощью событий Firebase и BigQuery
Mobvista покупает Reyun
Маркетологи в мобайле: Роман Хуртов (Parimatch Russia)
Neverland помогает с работой по саду
Oath Care: форум для мам по подписке

AI, Устройства, IoT

S в аббревиатуре IoT означает Security, или Как я лампу хакнул
Йога глазами дата-сайентиста: как мы строили computer vision в мобильном приложении
О чем спорят строители Умных Домов, Бань, Дач и Гаражей
Amazon выкладывает софт DeepRacer в open source
10 лучших проектов в области науки о данных для начинающих

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

Дайджест интересных материалов для мобильного разработчика 393 (10 16 мая)

16.05.2021 14:08:59 | Автор: admin
В этом дайджесте процесс загрузки iPhone и организация стриминга на нем же, борьба App Store с разработчиками мошенниками, концепции Jetpack Compose и обзор Android Automotive OS, этический антидизайн, вопросы АТТ-согласия и многое другое.



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Процесс загрузки iPhone. Часть 1: Boot ROM
Видео-стриминг на iOS по RTMP
Фантомные типы в Swift
Пошаговый урок: как начать делать что угодно для Touch Bar
Core Data + Repository pattern. Детали реализации
Построение графиков в SwiftUI
Apple подчеркивает усилия по борьбе с мошенничеством в App Store
В App Store работает более 500 модераторов и они проверяют более 100,000 приложений в неделю
Акторы в Swift: практический пример
Локализация строк и управление версиями в iOS с помощью Firebase
Замена селекторов замыканиями в UIButton
Создание собственного парсера Markdown с нуля на Swift
Поиск Spotlight для ваших приложений
Важность новых технологий в iOS-разработке
Как использовать Firebase в новом жизненном цикле приложения SwiftUI
BodyProgress: физические упражнения на SwiftUI
TOCropViewController: удобный кроп для изображений

Android

Как использовать облачную ферму устройств Huawei для тестирования и отладки в Android Studio
Как мы создали облачный сервис для управления и контроля за маршрутами обходов на предприятиях
Концепции Jetpack Compose, которые должен знать каждый разработчик
Jetpack Paging 3: пагинация на Android
Масштабирование архитектуры в Lyft с Денисом Неклюдовым
Обсуждаем Kotlin 1.5 и что будет в Kotlin 1.6
Вышла превью-версия Jetpack Compose для веба
Обзор Android Automotive OS
Адаптация вашего приложения под Android 11
Наш опыт миграции на корутины с RxJava
Bottom Navigation и Navigation Drawer с помощью Scaffold из Jetpack Compose
Руководство по архитектуре, рекомендованной Google для Android-приложений
Фоновый инспектор задач
Навигация: вложенные графы и тег включения
KMMT: шаблон приложения на Kotlin Multiplatform Mobile
ModernStorage: простая работа с данными

Разработка

Этический антидизайн. Разработка продуктов, которые не вызывают привыкания
Мобильные приложения перестали быть подходящей идеей для стартапов
Мобилка hh.ru теперь и в Беларуси: как жить, когда команду раскидало
Разработка первой игры на Construct 3
Углубленный анализ тестирования виджетов во Flutter. Часть II. Классы Finder и WidgetTester
Исследование движения глаз для улучшения здоровья и доступности
Podlodka #215: тест-менеджмент
Распродажа Azure Cloud Computing в Humble Bundle
Niantic расширяет доступ к своей платформе Niantic Lightship AR
Snapchat открывает Creator Marketplace
YoYo Games запустила игровое руководство по GameMaker Studio 2
Sendbird предлагает API для групповых голосовых и видео звонков
Дизайн приложений: примеры для вдохновения #42
Почему важно применять междисциплинарный подход в дизайне
Как лучше управлять бизнес-логикой в приложениях Flutter
Системный дизайн дейтинг-приложений
Дорогостоящие ошибки: почему нам пришлось отказаться от Firebase
10 трюков с Figma, о которых я хотел бы знать раньше
От нуля до MVP за 3 месяца с Flutter
Урок номер один, который я усвоил, управляя небольшой командой разработчиков
11 хитростей искусства гугления для разработчика
Как мы достигли скорости записи 1.4 миллиона строк в секунду

Аналитика, маркетинг и монетизация

7 подсказок, как создать и улучшить Battle Pass в вашей игре
Маркетплейс одежды Vinted получил 250 млн при оценке в 3.5 млрд
GasBuddy: бензин рядом
AppsFlyer: процент ATT-согласия в России достигает 42%
Flurry: согласие на отслеживание дали только 5% пользователей iOS
Сезонность проекта: не бойтесь летнего спада
Как мы достигли 1 миллиона загрузок с нулевым бюджетом
Kakao приобретает платформу микрочтения Radish
IronSource запускает аналитическую платформу LiveGames для гиперказуальных игр

AI, Устройства, IoT

Использование LoRa для интеграции кота в IoT
Монетизация машинного обучения: как превратить данные в деньги
Linux Foundation запускает AgStack Foundation для сельского хозяйства

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

Дайджест интересных материалов для мобильного разработчика 394 (17 23 мая)

23.05.2021 20:21:44 | Автор: admin
На этой неделе у нас новая Google I/O, доступность iOS, банки и штаны, автотесты и разумные A/B-тесты, методы атрибуции, свободная Цивилизация и многое другое.



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Обертки свойств в Swift с примерами кода
Крейг Федериги назвал уровень безопасности Mac неприемлемым
Учебный курс Разработка приложений для iOS с использованием SwiftUI
Книга Про доступность iOS
Как создать приложение с использованием SwiftUI и CoreData
Swift инструмент автоматической стилизации кода в 2021
Советы iOS-разработчикам в 2021 году
App Thinning: синхронизация локализованных строк в Outlook для iOS
13 полезных методов работы с массивами в Swift
Вертикальный пейджинг в SwiftUI
SwiftUI + Core ML+ ARKit создаем приложение для определения объектов для iOS
Создаем утилиту командной строки с помощью Swift Argument Parser
Мои приложения в топе инструментов разработчиков (магазины приложений для iOS и Mac): я заработал 60 долларов
База данных Notion + iOS
Прохождение туториала Scrumdinger по SwiftUI от Apple
Взламывая iOS-интервью
Самые популярные тенденции в разработке приложений для iOS в 2021
MediumCup UI: стакан на SwiftUI
LocalConsole: консоль в приложении

Android

Банки ультимативно лезут к нам в штаны личную жизнь
Почему Kotlin хуже, чем Java?
Рисуем светом: длинная выдержка на Android
Google I/O 2021: что нового для Android-разработчиков (полный обзор)
То, чего нам так не хватало: Render Effect в Android 12
Google I/O: что нового представили Android-разработчикам
Производительность Android Runtime vs NDK
Пример модульного андроид приложения с помощью Navigation component и Koin (DI)
Developer Keynote с Google I/O 21
I/O 21: обновление Firebase
I/O 21: Android 12 Beta 1
I/O 21: 3 миллиарда устройств на Android
I/O 21: разговорный ИИ LaMDA
I/O 21: Flutter 2.2
I/O 21: Wear OS 3.0
I/O 21: Material You новый язык дизайна
Инструменты статического анализа для Android
Jetpack Compose: стили и темы
Понимаем паттерн MVVM для Android в 2021 году
Бесконечные списки с автоматической прокруткой с RecyclerView и LazyLists в Compose
Разрабатываем HelloAR в Android Studio с помощью ARCore и Sceneform
Миграция с LiveData на Kotlin Flow
Современный сплеш скрин в Android
Как мы улучшили процесс code review в инженерной команде Android
Kotlin SharedFlow или как я прекратил использовать RxJava и полюбил Flow
Интеграция Dagger 2 и Jetpack Compose
Лучшие практики View Binding
Исследуем новые тактильные функции в Android 12
Movies: кино на основе MVVM

Разработка

Три паттерна для улучшения работы с автотестами
Ремастеринг игрового контента, или как создать 800 единиц контента за семь месяцев
Flutter: флип-анимация
Wild Horizon или как осуществляется на практике мечта игродела
Все, что вы хотели знать про диалоговый UX/UI в проектировании чат-ботов
Mobile People Talks: Legacy
Podlodka #216: типографика
Исследование: кто находит работу после онлайн-обучения
Дизайн приложений: примеры для вдохновения #43
Google запустил курсы для технических писателей
Задачи с собеседований: размен
No-code платформа разработки приложений Adalo получила $8 млн
Книги о программировании на Python в Humble Book Bundle
Работает не трогай: как Snapchat переписал свое приложение для Android
10 уроков по UX дизайну, которые я хотел бы усвоить раньше
3 способа самостоятельно радикально улучшить свои навыки программирования
10 потрясающих шрифтов Google, которые вы будете использовать в 2021 году
Coinbase успешно перешел на React Native
5 самых сложных вопросов по программированию из интервью FAANG
Что не так с Flutter
5 лучших сервисов AWS для запуска любого проекта
Как развить сверхчеловеческую концентрацию при написании кода
Unciv: открытая Цивилизация

Аналитика, маркетинг и монетизация

Время деньги: анализируй А/В-тесты разумно
Какие ошибки совершает аналитик в первые полгода работы и как их избежать
Хочу всё знать о клиенте! Или как обогатить сухие факты DWH цифровыми путями и свойствами клиента из Amplitude
Игровая экономика: игры free-to-play
Somewhere Good: анти-социальная сеть
По данным Post-IDFA Alliance, UA затраты на Android выросли на 21% после внедрения iOS 14.5
Анализируем iOS 14.5: методы атрибуции
Как создавать эффективную видеорекламу для приложений
Быстрый рост неигровых приложений с Wow-booster
Нативная реклама мобильных приложений в TikTok
Все приложения делают это: крадут друг у друга. Как это влияет на мобайл и ASO?
Калькулятор экономики для мобильных подписок

AI, Устройства, IoT

Ребята взломали машину для мороженого и начали холодную войну с её производителем
Интервью с менеджером проектов АСУ: цифровизация, интернет вещей и умные города
Snap представил AR-очки Spectacles
Дата сайентисты вымрут через 10 лет
Сбер запускает набор Kidsar для AR-приложений на SberPortal
Как сделать монитор качества воздуха с помощью Raspberry Pi Zero W

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

Дайджест интересных материалов для мобильного разработчика 395 (24 30 мая)

30.05.2021 20:12:29 | Автор: admin
В этом дайджесте переезд на Swift и 36 секунд доступности, валидация встроенных покупок и кросс-системное тестирование, симпатичный чейнджлог, проблемы с неткодом, переезд Coinbase на React Nativeи многое другое!



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Как Лёня с React на Swift переезжал
Доступность на iOS началась с 36 секунд
Самые популярные SDK после выхода iOS 14.5
Всемирная конференция Apple для разработчиков начнётся 7 июня и пройдёт в онлайн-формате
Эван Шпигель поддержал налог App Store и меры защиты Apple
Как управлять поведением клавиатуры в iOS-приложениях
MVP архитектура для iOS
Как разрабатывать приложения для iOS без Mac
Как использовать SnapKit в ваших iOS-приложениях
Как использовать Firebase Remote Config с Swift 5
3 способа стилизации представлений SwiftUI
HMS ML Kit: перевод в реальном времени (iOS Swift)
ScrollingContentViewController: простое создание скроллируемого View
NotificationToast: тосты для iOS
CalendarKit: календарь для iOS, iPadOS и macOS

Android

Интеграция и серверная валидация инаппов для стора Google Play как защититься от читеров
Обновляемся на новую версию API Android по наставлению Google
Создаем приложение для Android быстро и просто
Почему Kotlin лучше Java?
Особенности тестирования Android без Google-сервисов
Получаем результат правильно(Часть2). FragmentResultAPI
Как начинающему Android-разработчику прокачать свои навыки: 5 open source проектов для изучения
Полезные расширения Kotlin для Android
Hilt стабилен. Более простая инъекция зависимостей на Android
Повышаем уровень своего класса данных Kotlin с помощью расширений
Историческое введение в модель реактивного состояния Compose
Совершенно новое Состояние в Jetpack Compose
Улучшение преобразования кода Java в Kotlin: пример
Структурированный параллелизм в действии
Начните отсюда: 5 упражнений для подготовки вашего приложения к работе с большими экранами
Начинаем работать с WorkManager
Простые инструментальные тесты (UI-тесты) для Android в 2021 году
Введение в Security By Design
KodeEditor: редактор кода для Android
SuperForwardView: перемотка в стиле Netflix

Разработка

Почему мы решили создать отдел кросс-системного тестирования
Лаги, джиттер и потеря пакетов: откуда берутся проблемы с неткодом и как их решать
7 QA-шных грехов, которые помогут или помешают тестировщику (стать тем, кем ты хочешь)
За что банит Apple(и Google)
Как написать симпатичный чейнджлог: опыт Авито
Без тимлида не обойтись, а что насчет техлида?
Как сохранить нервы тестировщика или ускорить регресс с 8 до 2 часов
Как я хотел поработать нативным Android разработчиком, но устроился Flutter разрабом
Dart: Быстрые неизменяемые коллекции
6 способов снизить когнитивную нагрузку от интерфейса
Podlodka #217: фасилитация
Flutter Dev Podcast #27: как работает рендеринг UI
Как Coinbase перешел на React Native
Stack Overflow запустил новый ежегодный опрос разработчиков
Fuchsia получила свое первой устройство
Мой SaaS добился MRR $12.5K за один месяц: вот чему я научился
Куда уходят программисты?
Онлайн-конференция Google for Games Developer Summit 2021 пройдет в июле
Проблема дизайна это сами дизайнеры
Пользователям плевать на дизайн: как устроен хороший UX на самом деле
Хотите стать лучшим UX дизайнером? Создавайте эмоциональный дизайн
Лучшие языки программирования для изучения в 2021 году
10 вещей, которые хорошо знают опытные разработчики
Почему софтверные компании часто отвергают хороших программистов
Наплевать на доступность
Самые востребованные языки программирования в 2021 году
Избегайте блокировки CI/CD делайте свои сборки более портативными
Flutter: CRUD с использованием Firebase Cloud Firestore
Одна привычка, чтобы стать лучшим разработчиком
Что нового во Flutter 2.2
Библиотека разработчика от Google

Аналитика, маркетинг и монетизация

Датасет о мобильных приложениях
Реклама мобильных игр в первом полугодии 2021: мировая статистика
RevenueCat закрыл Серию B при оценке в $300 млн
Платформа отладки Lightrun получила $23 млн
Платформа потери веса Noom привлекла $540 млн
Тренды мобильных приложений 2021: отчет Adjust
Дейтинг-приложения предложат улучшения прошедшим вакцинацию
Google запускает рекламные кампании приложений на десктопах
Netflix думает над выходом на игровой рынок
Одних технологий недостаточно: что раздражает рекламный рынок в Apple и как она зарабатывает на закрытости системы

AI, Устройства, IoT

ML: нечеловеческие технологии для человеческих цен
TinyML. Сжимаем нейросеть
SberCloud + Intel oneAPI = льготное облако для ML-разработчиков
IBM разработала датасет Project CodeNet для обучения ИИ программированию
Как сделать бизнес на AR/VR
Mail.ru Group открыла новый набор на бесплатное обучение в Академию больших данных MADE
Microsoft использовала GPT-3 для создания кода на естественном языке
Best Buy начинает продажи смартфона для пожилых

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

Дайджест интересных материалов для мобильного разработчика 396 (31 мая 6 июня)

06.06.2021 16:09:40 | Автор: admin
Сегодня в нашем дайджесте архитектурные паттерны и победители Swift Student Challenge, инициализация цепочек и цветов Fuchsia, инди-акселератор и инди-фестиваль от Google, Android 12 для разработчиков, $643 млрд из App Store и многое другое!



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Архитектурные паттерны в iOS: привет от дядюшки Боба, или Clean Architecture
Тернистый путь внедрения Swift Package Manager. Доклад Яндекса
Swift и CoreData. Или как построить Swift ORM на основе Objective-C ORM
Как сделать экран подтверждения СМС-кода на iOS
Мои приложения для разработчиков вышли в топ iOS и Mac App Store: сколько это принесло?
WWDC21: Школьники и студенты из России победители Swift Student Challenge
Объявлены номинанты Apple Design Awards 2021
Добавляем поддержку Siri в iOS-приложение за считанные минуты
Как сериализовать и десериализовать объекты в iOS
Как улучшить время компиляции и выполнения Xcode
Удаление фона с помощью Core ML и SwiftUI
Как извлечь функциональность из устаревшего iOS-кода
Приложение для чата без пароля для iOS с Auth0
Как добавить Swift-код в качестве кастомной LLDB команды
Design to Code: превращая дизайн в код
SPIndicator: индикатор в стиле Apple

Android

Проекты в Gradle 7: как не зависеть от зависимостей
Всё о PendingIntents
Инициализация Rx цепочки
Proto DataStore + AndroidX Preferences на Kotlin
Подробный обзор Android 12 для разработчиков
Введение в систему Снапшотов Compose
Недоверенные события касания
Понимаем юнит-тесты для Android в 2021
Polestar предлагает эмулятор для разработчиков, создающих приложения для Android Automotive
QA-инженеры, функциональное и UI-тестирование в Azimo
10 лучших библиотек для разработчиков Android в 2021 году
Сохранение данных на Android с помощью Room Database и Data Store Руководство для начинающих
CheckboxQuestions: вопросы и чекбоксы
Compose Space Invaders: игра для декстопа на Jetpack Compose
Carousel Recyclerview: красивая карусель

Разработка

Как художнику найти работу мечты в геймдеве. А также советы по оформлению портфолио
4 технических решения, которые делают API сервис успешным
C# vs Kotlin
Как и зачем Mail.ru Group провела редизайн мобильной версии главной страницы портала
Mobile People Talks: какого же цвета Fuchsia?
Podlodka #218: схемотехника
HarmonyOS заработала на смартфонах
Новый SDK от Loomдобавляет видео-сообщения в любые веб-приложения
Facebook открывает Messenger API в Instagram для всех
Задачи с собеседований: зарплата
Дизайн приложений: примеры для вдохновения #44
Stack Overflow продан за $1.8 млрд
Что не так с Flutter?
Исследование продакт-менеджеров 2021 от Product Plan
Как оставаться в физической и ментальной форме, продолжая программировать
О создании гибкого пользовательского интерфейса на примере Instagram Threads
Представляем новый язык дизайна Material You от Google
Сеты бесплатных иконок для разработчиков и дизайнеров
Как привлечь первых 100 клиентов в SaaS: 5 простых шагов
Следующим стартапом на триллион станет образовательная компания
5 задач для автоматизации с помощью Python
Я не мог быстро тратить деньги, и это чуть не убило мой стартап
Flutter 2.2: создаем первую Universal Windows Program (UWP)
Мой код плохо пахнет, но все в порядке
Как создать свою первую Облачную функцию Firebase
5 вещей, которые я узнал после двух лет работы инженером-программистом в Microsoft
Test-driven Development для создания пользовательских интерфейсов
Мой опыт интервью в Twitter
Flutter: создание красивых приложений для Windows удобная структура дизайна и навигация
Вселенная no-code/low-code стартапов и ее игроки
Пример дизайна: Safe Space wellness-приложение для Android
База данных с вопросам из интервью в Apple

Аналитика, маркетинг и монетизация

В Android также ограничивают действие рекламного идентификатора
make sense: О запуске агротех-стартапа
Voodoo открывает летний конкурс гиперказуальных игр
Google запускает Indie Games Accelerator и Indie Games Festival
Продажи в App Store в 2020 выросли на 24% до $643 млрд
Создатели читов для PUBG Mobile заработали $77 млн
3 лучшие техники геймификации
Greg: приложение для любителей растений
Маркетплейс для разработчиков Malt получил 80 млн
Социальная сеть Poparazzi стала 1 App Store: секреты роста
Проектирование продуктов, формирующих привычки
Ошибки при расчете юнит-экономики
9 способов встроить виральность в ваш продукт
Как создать отличные скриншоты для страницы приложения в App Store

AI, Устройства, IoT

Учиться, учиться, и ещё раз учиться?
Теория игр как механизм для анализа крупномасштабных данных

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

Дайджест интересных материалов для мобильного разработчика 397 (7 13 июня)

13.06.2021 14:11:44 | Автор: admin
В этом дайджесте обсуждаем конференцию WWDC и ее последствия, быстрые обновления Android и ответственность команд, автоматизацию с помощью таблиц, применение КММ, цвета, элементы управления и многое другое.



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

Xcode Cloud, SharePlay, Focus самое важное с Keynote WWDC21
Apple убивает TeamCity, Bitrise, Appcenter, Fastlane, Firebase, Sentry и иже с ними. Краткий обзор Xcode Cloud
Делаем OpenVPN клиент для iOS
iOS интервью в Vivid
Лучшие приложения для iPhone весят почти в 4 раза больше, чем пять лет назад
Mobile People Talks: WWDC21
Apple выпускает бета-версии прошивок AirPods для разработчиков
iOS 4 воссоздали как приложение для iPhone
Дырявим вьюхи на Swift
Apple уточняет правила публикации в App Store
Apple разрешит пользователям остаться на iOS 14
Новые функции iPadOS 15
Apple представила новые технологии и инструменты для разработчиков приложений
watchOS 8: новые функции доступа, возможности подключения и практики осознанности
Apple представила iOS 15
Главное в iOS 15 для дизайнеров
Доклад Platforms State of the Union с WWDC 2021
Отчеты о сбоях iOS с LLDB
Онбординг SwiftUI в приложении UIKit
Лучшая маршрутизация глубоких ссылок в iOS-приложении
Что мы узнали из инцидента с OOM в iOS-приложении Pinterest
Делаем бесконечную прокрутку фотографий в iOS
Что нового в SwiftUI после WWDC21
SwiftUI двунаправленный список SnapList
Использование SwiftUI с View Model, написанной на Kotlin Multiplatform Mobile
Пишем первое приложение для iOS с помощью Realm, SwiftUI и Combine
Что нового в StoreKit 2
Как мы используем SwiftUI в приложении Medium
Что нового в SwiftUI 3.0?
Как сделать иконку для темного режима для вашего приложения
iOS 15 привносит атрибутные строки в SwiftUI
Понимаем AsyncImage в SwiftUI
Indicate: тосты в стиле AirPods
SimpleAnalytics: своя аналитика для iOS

Android

Долгая дорога к быстрым обновлениям Android
Миграция с LiveData на Kotlins Flow
Бесконечная автопрокрутка списков с помощью RecyclerView и LazyLists в Compose
Разработчики могут подать заявку на снижение комиссии до 15% через Play Store
Flutter Dev Podcast #28: Google I/O 2021
Корутины обработки ошибок
Проблема трех фреймворков в Kotlin Multiplatform Mobile
Современная архитектура Android с шаблоном проектирования MVI
Азбука модульности Android в 2021 году
Навигация в Jetpack Compose
Несколько бэк-стэков
Работа с сетью в Kotlin Ktor на Android
Автогенерация пользовательских размеров для Android с помощью Kotlin
Глубокое погружение в интернационализацию приложений для Android на Jetpack Compose
Датабиндинг в Android
Чистая архитектура Android [точка зрения]
Создаем приложение CoroutineScope с помощью Hilt
Пагинация в Android с Paging 3, Retrofit и Kotlin Flow
CompleteKotlin: автодополнение для всех платформ
TimeRangePicker: круглый range picker для Android

Разработка

Кто, где, когда: система компонентов для разделения зон ответственности команды
Автоматизация или смерть: как управлять тысячами единиц игрового контента с помощью гугл-таблиц
Appwrite, open-source бэкэнд-платформа
Роль QA Lead в продуктовой компании: особенности и зоны ответственности
Вызов кода Go из Dart с использованием cgo и Dart FFI на простом примере
Создание прекрасных приложений с помощью Xamarin.Forms
We need to go deeper: как пасхалка в приложении Delivery Club сократила субъективное время ожидания еды
Тестируем и визуализируем с помощью Mind Map
Автоплатеж, автооплата или автопополнение? UX-кейс
Как стать тестировщиком с нуля
Podlodka #219: выбор первой профессии в IT
Дизайн приложений: лауреаты премии Apple Design Awards 2021
КММ на практике или выбор кроссплатформенного фреймворка для Леруа Мерлен
Исследование разработчиков HackerEarth 2021
Отключенные кнопки не должны путать пользователей
Распродажа книг по Data Science и аналитике данных в Humble Bundle
6 мощных инструментов для разработчиков, использующих Mac
Как мы улучшили сегментированные элементы управления (segmented control)
Руководство для новичков по применению цвета в UI дизайне
Пошаговое руководство по работе в Figma. Урок по созданию мобильного приложения
Принцип IBM Leadership-as-a-service обеспечивает профессиональный рост команд
Топ-5 шаблонов проектирования распределенных систем
ELI5: Flipper кроссплатформенный дебагер
Как ежедневно улучшать навыки архитектуры ПО
Анимированный TabBar Coinbase в React Native
Как проверять код Junior разработчику
Разработчики не могут исправить плохой менеджмент

Аналитика, маркетинг и монетизация

WWDC 2021: новое и полезное для разработчика, ASO спецалиста, маркетолога мобильных приложений
Почему подписываются пользователи? Как повысить конверсию мобильных приложений
Classplus: Spotify для образования
AppsFlyer: на 570% выросло количество неорганических установок финансовых приложений в России
Стратегия победителя: как покорить весь мир, начиная с Якутска? Кейс inDriver и Rocket10
Кейс: как вытеснить конкурентов из поиска, оптимизируя инаппы?
Практические инструменты и преимущества отслеживания удалений мобильных приложений
Онбординг в мобильном приложении: как поддерживать интерес пользователей

AI, Устройства, IoT

Как Яндекс применил генеративные нейросети для поиска ответов
Маленький и быстрый BERT для русского языка
Начинаются продажи карманной игровой приставки Playdate
Защищенный смартфон, контролируемый ФБР, раскрыл действия сотен преступников

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

Дайджест интересных материалов для мобильного разработчика 398 (14 20 июня)

20.06.2021 12:09:43 | Автор: admin
В этой подборке исследуем StoreKit 2, распознаем лица и позы на Android, улучшаем производительность React-приложений, учим сквирклморфизм и многое другое!



Этот дайджест доступен в виде еженедельной рассылки. А ежедневно новости мы рассылаем в Telegram-канале.

iOS

За что App Store может отклонить приложение: чек-лист
Meet StoreKit 2
Тим Кук: на Android в 47 раз больше вредоносных программ, чем на iOS
Новый антимонопольный акт может заставить Apple продать App Store
Что нового во встроенных покупках в iOS 15 WWDC 21
Строим лабиринты с SwiftUI
iOS 15: заметные дополнения к UIKit
Info.plist отсутствует в Xcode 13 вот как его вернуть
ScrollView в XCode 11
Создаем игры на SwiftUI с помощью SpriteKit
Мастерим списки в SwiftUI
Как лучше структурировать свои проекты в Xcode
Глубокое погружение в Акторы в Swift 5.5
Разработка функций iOS-приложения в виде модулей в Xcode
Как делать видеозвонки с помощью SwiftUI
Euler: вычислительный фреймворк на Swift
WorldMotion: положение устройства относительно Земли

Android

Как использовать Android Data Binding в пользовательских представлениях?
AppSearch из Jetpack вышел в альфа-версии
Распознавание лиц и поз за 40 минут
Android Broadcast: новости #10
Создайте свою библиотеку KMM
История моего первого а-ха-момента с Jetpack Compose
Как стать ассоциированным разработчиком Android (Kotlin Edition)
Анимации Jetpack Compose в реальном времени
RecyclerView с NestedScrollView: лучшие практики
Android Bitbucket Pipeline CI/CD с Firebase App Distribution
CompileSdkVersion и targetSdkVersion в чем отличие?
Нижняя панель навигации Android с Jetpack Compose
Интеграция Google Sign-in в Android-приложение
Focus в Jetpack Compose
DashedView: полосатые View
Screen Tracker: название видимого Activity/Fragment
SquircleView: красивые View

Разработка

5 000 000 строк кода, 500 репозиториев: зачем мы адаптировали приложение AliExpress для Рунета
Десятикратное улучшение производительности React-приложения
gRPC + Dart, Сервис + Клиент, напишем
Podlodka #220: волонтерство в IT
Хороший день разработчика: Good Day Project от GitHub
К 2024 году 80% технологических продуктов будут создавать непрофессионалы
Сквирклморфизм (Squirclemorphism) в дизайне интерфейсов
12 рекомендаций, которые помогут улучшить процесс регистрации и входа в систему
React Native в Wix Архитектура (глубокое погружение)
Как узнать плохой код? 8 вещей
5 лучших пакетов Flutter, которые вы должны знать
Советы по кодинг интервью в Google
Как стать плохим разработчиком

Аналитика, маркетинг и монетизация

Гайд по тестированию рекламы для мобильных приложений
Вслед за Apple и Google комиссию магазина приложений снизила Amazon
make sense: О инфлюенсер-маркетинге
UserLeap получает еще $38 млн на отслеживание пользовательского опыта
Классическая MMORPG RuneScape запускается на iOS и Android
Маркетологи в мобайле: Александр Плёнкин (Vprok.ru Перекрёсток)
Почему такие скриншоты пустая трата времени? (пока у вас нет 4,000 загрузок в месяц)
Amplitude получил еще $150 млн
$100 млн для Free Fire: как младший брат может обогнать старшего на уже сложившемся рынке?
App Annie: рынок мобильных игр в России в 2020 вырос на 25% до $933 млн
Темные паттерны и уловки в мобильных приложениях
Использование BigQuery и Firebase Analytics для привлечения, вовлечения и оценки пользователей

AI, Устройства, IoT

Запускаем DOOM на лампочке
Быстрое обнаружение Covid-19 на рентгеновских снимках с помощью Raspberry Pi
Как я учу Python на Raspberry Pi 400 в библиотеке
Топ-5 преемников GPT-3, о которых вы должны знать в 2021 году

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

Обновление списка Top50 курс на рост

08.04.2021 08:18:32 | Автор: admin


В конце марта вычислительный центр МГУ имени М.В. Ломоносова и Межведомственный Суперкомпьютерный Центр РАН в очередной, тридцать четвертый раз опубликовали рейтинг российских суперкомпьютеров, где представлена информация об отечественных машинах с наибольшими мощностями. Ниже вы найдете общую сводку изменений за прошедшие полгода.

Прежде всего, следует отметить, что негативная динамика, которая наблюдалась в прошлом выпуске, сменилась положительной: мощности снова стали расти. С зафиксированных в прошлый раз 19.8 PFlop/s на тесте Linpack суммарная производительность поднялась до 20.2 PFlop/s, тем самым превысив показатель не только тридцать третей, но и тридцать второй редакции. Суммарная пиковая производительность также повысилась: теперь она составляет 30.9 PFlop/s (в предыдущей редакции 29.9 PFlop/s). Наконец, порог вхождения в рейтинг установился на уровне 69.6 TFlop/s против 56.95 TFlop/s в предыдущей версии.

С точки зрения изменений в составе участников полугодие прошло довольно спокойно. Тройка лидеров осталась прежней:

  • Лидером рейтинга всё так же остаётся система Кристофари, разработка компаний SberCloud (ООО Облачные технологии) и NVIDIA, установленная в СберБанке (производительность на тесте Linpack 6.7 PFlop/s, пиковая производительность 8.8 PFlop/s).
  • На второй строчке укрепился суперкомпьютер Ломоносов-2 производства компании Т-Платформы из Московского государственного университета имени М.В. Ломоносова (производительность на тесте Linpack 2.5 PFlop/s, пиковая производительность 4.9 PFlop/s).
  • Третье место занимает суперкомпьютер, созданный компаниями T-Платформы и CRAY, который находится в Главном вычислительном центре Федеральной службы по гидрометеорологии и мониторингу окружающей среды (производительность на тесте Linpack 1.2 PFlop/s).

Вместе с тем, в первой десятке топа появился новый участник: апгрейд системы PetaNode 1.2 Cluster (разработчик ООО Компьютерные Экосистемы) позволил ей подняться с пятнадцатого места на девятое за счет сильного роста производительности с 211.6 TFlop/s до 420.1 TFlop/s. Продолжает свое движение вверх также суперкомпьютер cHARISMa, установленный в Высшей школе экономики: за предыдущие месяцы его мощности возросли с 568.5 TFlop/s до 653.7 TFlop/s, что обеспечило перемещение с седьмой позиции на шестую.

Дебютировали в рейтинге на этот раз две разработки. Система Лобачевский, сегмент A100 от группы компаний РСК, установленная в Нижегородском государственном университете им. Н.И. Лобачевского, стартовала с двадцать седьмого места. Суперкомпьютер Олег, созданный компанией Lenovo и находящийся в Сколковском Институте Науки и Технологий, занимает тридцать шестую строку.

Ряд небольших изменений можно отметить в техническом оснащении лучших суперкомпьютеров. Гибридных машин, использующих для вычислений ускорители, стало на одну больше теперь общее их число составляет 27. Напротив, число разработок на основе технологии Intel Omni-Path сократилось: их осталось 5 вместо прежних 6. Удерживают свои старые позиции процессоры Intel (используются в 48 системах), коммуникационные сети InfiniBand (используется в 32 системах) и Gigabit Ethernet (используется в 8 системах).

Основными создателями мощнейших вычислительных комплексов являются те же три компании, что и раньше: Hewlett-Packard Enterprise (13 позиций в рейтинге), группа компаний РСК (12 позиций в рейтинге) и Т-Платформы (10 позиций в рейтинге). При этом Hewlett-Packard Enterprise несколько ухудшила свои показатели по сравнению с предыдущей редакцией.

С точки зрения применения суперкомпьютеров наиболее популярной областью остаются наука и образование количество задействованных в них систем выросло с 26 до 28. В некоторых других сферах, напротив, наблюдается отток: число суперкомпьютеров, применяющихся в прикладных исследованиях, упало с 8 до 7, а число систем, ориентированных на промышленность с 2 до 1. Большая часть отраслей на данный момент представлена единичными специализированными разработками: так, моделирование климата осуществляет суперкомпьютер PetaNode 1.2 Cluster, на задачи, связанные с геофизикой, работают системы НОВАТЭК НТЦ, сейсмологическими расчетами занимается суперкомпьютер PTG-hpSeismic и так далее.
Подробнее..

Портфолио разработчика по Джошу Комо структура, наполнение, смысл

26.05.2021 14:12:47 | Автор: admin


В прошлом году Джош Комо, автор туториалов и учебных материалов для разработчиков, на своем аккаунте в Твиттере вызвался посмотреть и покритиковать сайты-портфолио всех желающих. В ходе мероприятия он заметил интересную вещь: обратная связь получалась не очень разнообразной, недоработки при оформлении портфолио у большей части начинающихся программистов оказывались примерно одни и те же. Тогда у Комо и возникла мысль о том, что неплохо бы собрать часто повторяющиеся замечания в один список. В итоге у него получился довольно обширный материал, который был оформлен в электронную книгу она доступна на сайте автора бесплатно. Под катом вы найдете основные тезисы, рекомендации и источники, которые в ней приводятся.

Общие вопросы


Что подразумевается под портфолио разработчика?

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

Это обязательно?

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

Разве нет других способов продемонстрировать свою работу?

Есть. В резюме сейчас часто включают, допустим, ссылки на LinkedIn или Github ресурсы, с помощью которых тоже неплохо можно осветить свою деятельность. Преимущество сайта-портфолио в том, что он позволяет рассказать о себе в той форме, которая удобна и выгодна для вас. Нет необходимости следовать заданному формату, можно давать для каждого проекта столько контекста, сколько покажется нужным.

Для кого предназначены эти советы?

Для разработчиков-джуниоров, которым, с одной стороны, уже есть что показать, а с другой хочется компенсировать в глазах работодателя недостаток рабочего опыта и выделиться из общей массы. Автор ориентируется, прежде всего, на фронтенд и фулстек, однако большая часть рекомендаций будет полезна также и тем, кто занимается бэкендом или мобильной разработкой.

Сколько проектов должно быть на сайте?

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

Если проект только один, но масштаб и качество у него достойные, допустимо добрать количество за счет чего-то менее впечатляющего: сделать простенький продукт чисто для портфолио или небольшую вариацию на тему основного (например, расширение на базе мобильного приложения), указать текущий проект с пометкой В процессе, рассказать о какой-то деятельности, не связанной напрямую с кодом (документации, организации мероприятий для разработчиков).

Какие проекты включать нельзя?

Есть несколько категорий проектов, которые следует использовать с большой осторожностью:

  • Всё, что сделано по инструкции скажем, с опорой на туториал или в ходе воркшопа. В таких проектах слишком велик вклад человека, который вас направлял, они не дают четкого представления о том, что вы умеете делать самостоятельно. К тому же можно нажить проблемы с авторскими правами. Проект можно считать своим, только если вы использовали чужой материал как отправную точку и очень существенно (на 50% и более) его расширили или переработали.
  • Проекты с предыдущих или текущего места работы. Причина здесь очевидна велик риск нарушить соглашение о неразглашении. Если все же решаетесь разместить рабочий проект на сайте, обязательно обсудите все подробности и узкие места с работодателем.
  • Сам сайт-портфолио. Обычно это производит удручающее впечатление как будто разработчик не нашел среди своих работ ничего более яркого. Исключение составляют случаи, когда вы реализовали что-то сложное и нетривиальное под капотом. Если же кроме того, что посетитель видит невооруженным глазом, показать нечего, то на уровень портфолио сайт сам по себе не тянет.
  • Проекты, не имеющие отношения к разработке. Все прочие умения и увлечения лучше оставить для раздела О себе. Комо также не рекомендует уделять слишком много внимания своим навыкам в смежных областях, вроде графического дизайна или написания технических текстов. Это несколько меняет жанр сайта, создавая ощущение, что вы занимаетесь фрилансом и работаете по краткосрочным контрактам. Работодатель, который ищет сотрудника на постоянную основу, может сделать неверные выводы о ваших предпочтениях.


Какие проекты стоит включать в первую очередь?

Помимо очевидного (хорошие и интересные), есть несколько характеристик, которые работодатели склонны ценить особенно высоко:

  • Целевые проекты, которые создавались для решения конкретной частной проблемы. Они показывают, что вы умеете переложить технические навыки на практическую почву, и позволяют оценить ваш подход ко всем аспектам ведения проекта, от начала до конца.
  • Живые проекты, у которых есть реальные пользователи, пусть даже немного, как правило, вызывают больше интереса, чем демо-версии продуктов, которые делались ради самого процесса.
  • Масштабные, сложные проекты, на которые ушло много времени и сил. Не каждый джуниор в принципе в силах довести нечто подобное до конца, так что сам факт наличия будет говорить в вашу пользу.
  • Вклады в популярные библиотеки с открытым кодом. Это своего рода признание со стороны сообщества, подтверждение, что вы способны работать с чужим кодом, ставить перед собой задачи и взаимодействовать с другими программистами. Само собой, необходимо очень четко прописать, какие именно изменения вы вносили, чтобы случайно не присвоить себе чужую работу.

В целом, в портфолио можно добавлять самые разные продукты вашей деятельности: учебные проекты, трофеи с хакатонов, небольшие программы, которые вы писали для своих собственных нужд. Джуниоры часто беспокоятся о том, что их проекты не представляют собой ничего особенного, не поражают сложностью и будут жалко смотреться в портфолио. Не стоит поднимать планку слишком высоко. Если вам есть что рассказать о проекте (как вы бились над реализацией функции, как выбрали одно решение, а потом отказались от него в пользу другого), скорее всего, у него достаточно скрытой сложности и он адекватно отображает ваш текущий уровень.

Структура и наполнение сайта


У сайтов-портфолио обычно не слишком разветвленная структура. По сути, она сводится к набору следующих смысловых блоков: раздел О себе, список/сетка проектов, с развернутыми описаниями для каждого, контакты. Далее мы рассмотрим каждый из них в отдельности.

О себе

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

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

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

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

Выбирая тон своего рассказа, имейте в виду еще один момент: кадровики и разработчики смотрят на ваши мягкие навыки джуниоров сквозь разные призмы. Кадровики скорее оценят энтузиазм и увлеченность своим делом. Для разработчиков в первую очередь важна адекватная самооценка им еще предстоит вас обучать. Поэтому, расписывая свою любовь к коду, старайтесь не впадать в излишний апломб. Если вы представляете себя как сложившегося специалиста и аса разработки, кадровики, может, и проникнутся вашей уверенностью, но будущие наставники, скорее всего, подумают, что работать с вами будет тяжело.

Проекты и их описания

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



Каждая такая карточка обязательно должна переводить на страницу с подробным описанием. Если информация исчерпывается перечисленными пунктами, смысл сайта-портфолио, по сути, теряется.

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

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

Также обстоят дела и с кодом. Ни для кого не секрет, что с точки зрения качества кодовые базы обычно неоднородны: какие-то части сделаны умно и изящно, какие-то держатся на изоленте. По воле случая, смотрящему вполне могут броситься в глаза вторые, а не первые.

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

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

Введение

  • Общий обзор, суть проекта
  • Список основных функций и отличительных особенностей
  • Ваша роль в проекте: работали в одиночку или в группе, какие именно вещи реализованы вашими силами?
  • Технологии, которые применялись
  • Ссылка на демо-версию и кодовую базу (по возможности)

Цели и основания

  • Почему вы взялись за этот проект, какова его значимость лично для вас?
  • Что предполагалось на старте, каким был продукт на этапе проектирования?
  • Любые другие замечания, касающиеся стадии планирования.

Ключевые моменты

  • Что в проекте больше всего впечатляет с точки зрения технического исполнения? Ответы могут быть самыми разными хоть система аутентификации, хоть элементы интерфейса, хоть подтягивание информации из базы данных.
  • Сложности, с которыми вы столкнулись в процессе.
  • Пути решения возникающих проблем, ход мысли при выборе стратегии, результаты. Здесь нужен хороший, глубокий анализ, написанный в расчете на то, что читать будут разработчики.

Выводы

  • Чему вы научились в ходе работы над проектом? К чисто техническим открытиям можно добавить и что-то не связанное напрямую с кодом, например, какие-то подробности управления проектом или организации релиза.
  • Правильно ли вы выбрали инструменты, фреймворки, библиотеки? Что в стеке вам особенно помогло? Каких возможностей не хватало?
  • Повлиял ли приобретенный опыт на вашу дальнейшую работу? Если удастся связать два проекта, указав, как знания, приобретенные в одном, пригодились в другом, будет просто отлично.


Текущий статус опциональная секция. Ее имеет смысл включить, если продуктом в реальности кто-то пользуется; тогда можно упомянуть, какая у него аудитория и что говорят люди. Если проект делался специально для портфолио, распространяться об этом не стоит.

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

Контакты

Как правило, в этом блоке представлена форма обратной связи. Если вам удобнее общаться по электронной почте, можно ограничиться прямой ссылкой mailto. Сюда же выносятся ссылки на страницы в соцсетях и профессиональный блог, если вы его ведете. Сейчас наметилась тенденция встраивать блог непосредственно в сайт-портфолио, но автор относится к этой идее скептически. Портфолио заточено в первую очередь под общение с работодателем вероятность того, что он найдет время на чтение постов, крайне мала. Кроме того, вам придется особенно пристально следить за регулярностью обновлений и качеством контента.

Техническая реализация


Дизайн

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

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

Комо отмечает, что в ходе своего массового просмотра портфолио неоднократно сталкивался с одним и тем же популярным дизайном, просто скопированным пиксель в пиксель:



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

Вот ряд шаблонов, на которые можно опираться при создании дизайна:

Portfolio Starter
Craig Portfolio
Alex Portfolio
Dexter Portfolio
Novo
Kester
Art Director

Разработка сайта

Если вы претендуете на должность фронтендера или фуллстек-разработчика, делать сайт нужно своими силами, без nocode-решений положение обязывает. Инструменты можно использовать любые, лучше всего те, с которыми вы хорошо знакомы, чтобы не тратить лишнего времени. Как варианты можно рассмотреть: ванильные HTML/CSS/JS, 11ty, Gatsby, Next, Jekyll. Лично от себя автор рекомендует Gatsby, не в последнюю очередь за то, что для него сделано много тем и плагинов, сильно экономящих усилия.

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

Доменное имя

В идеале это должно быть что-то в духе имяфамилияналатинице.com. При необходимости (например, если имя уже занято) можно вставить элемент code или dev. Ники использовать нежелательно, если только вы не видная персона в онлайн-сообществе.

Домены верхнего уровня можно выбирать на свой вкус (co, io, специфические домены разных стран). Единственный момент: стоит избегать .info, который у многих ассоциируется со спамом и мошенниками.

Хостинг

Сайты-портфолио обычно статические, так что проблем с серверами они не создают. Для хостинга статических сайтов существует целый ряд сервисов, среди которых Комо выделяет Vercel, Netlify, Github Pages, Surge.

*

В дополнение к теории для наглядности Комо приводит два примера портфолио с подробным разбором. Первый сайт Чарли Смит, вымышленного лица, который автор сделал сам, ориентируясь на типичный, усредненный образец из Сети. Второй сайт Джулии Джонсон, студентки и стажерки IBM, который произвел на него самое приятное впечатление на фоне других, присланных подписчиками. Сравнивая один с другим, легко заметить, как они соотносятся с рекомендациями.



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



Сайт Джулии более эффектный дизайн, удачная структура, сдержанный, но не безликий рассказ о себе, много элементов, оживляющих страницу, подробные описания для каждого проекта
Подробнее..

Перевод История о том, как один подросток сбежал от физического труда в программирование

27.05.2021 08:07:06 | Автор: admin


Летом 1982 года буквально за несколько месяцев до моего поступления в колледж мать отвела меня в сторонку и сказала: Отец хочет, чтобы ты нашел на лето работу и сам оплачивал свои расходы в учебном году. Мне было восемнадцать лет, я нигде еще не успел поработать, и даже сама мысль об этом, честно сказать, меня тогда немного пугала. Я был ботаном-домоседом, ну и, чего греха таить, довольно ленивым перспектива работы меня совсем не прельщала. Но я понимал, что спорить тут бесполезно, потому что в чем-то был согласен с позицией отца.

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

Мать всегда была готова помочь: она нашла несколько вакансий в нашем городке, среди которых была одна в дорожном управлении. Туда-то я и направился робкими шагами на собеседование одним июньским утром. В громадном здании со множеством грузовиков и кучами песка мне навстречу вышел крепкий парень в оранжевом жилете. Он скептически оглядел меня с ног до головы. Я был долговязым и прыщеватым подростком; слово ботан тогда еще не вошло в обиход, но я выглядел его живым воплощением. Едва ли не первыми словами, которые я от него услышал после этого осмотра, было (ей-богу, не вру):

Ты же в курсе, что работа связана с физическим трудом?

Конечно, конечно, ответил я, стараясь звучать поубедительнее. По-моему, он не поверил, но только пожал плечами и сказал:

Ну ладно. Когда выходишь?

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

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

Я сказал парню в оранжевом жилете, что схожу домой узнаю, когда мы едем отдыхать, а потом сообщу ему дату (спойлер: больше я туда не возвращался) и умотал из владений дорожного управления на высшей скорости. Когда мать спросила, взяли ли меня на работу, мне не хватило духу соврать. Я сказал, что взяли, но я не пошел, и попытался объяснить почему, чувствуя себя пристыженным. Уверен, она была недовольна, но отчасти меня поняла. Последнее, что она сказала на этот счет: Не говори отцу.



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

Как-то раз мать принесла с работы интересную наводку. Она работала на радиостанции, составляла график рекламных объявлений. Один из спонсоров жил в нашем городе и занимался ремонтом и перепродажей подержанных автомобилей. У него что-то не заладилось с компьютером, и он спросил на станции, нет ли здесь специалистов по компьютерам. Мать взяла его телефон и передала мне. Я позвонил.

Внесу ясность: хотя последние четыре-пять лет я хватался за всякую представляющуюся возможность усесться за компьютер, к специалистам я не относился. Благодаря программе, позволявшей старшеклассникам учиться программированию, я прошел несколько вузовских курсов по Фортрану и структурам данных, обгоняя учебную программу. Также я более-менее научился писать на BASIC в результате многочасовых попыток делать игры на соседском TRS-80. Но в моих знаниях по программированию было, мягко говоря, много пробелов. Я никогда не писал масштабных и сложных программ, не работал с чужими и вообще не занимался программированием в рабочей обстановке.

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

В своем разговоре с владельцем автомастерской (назовем его Джимом) я предложил такие условия: я посмотрю на компьютер, но плату возьму, только если сумею его починить. Джим был всячески согласен он, похоже, уже неоднократно обращался к другим людям и выкладывал деньги без какого-либо результата.



Примерный портрет Джима (возможны расхождения с оригиналом)

Я приехал в мастерскую и познакомился с Джимом, который почти полностью соответствовал всеобщему представлению о владельцах бизнеса по ремонту и перепродаже подержанных машин: дружелюбный, оборотистый, но при этом движимый несколько нездоровым интересом к зарабатыванию денег. Он сколотил, пожалуй, крупнейший бизнес по продаже машин в окрестностях, который, не будучи салоном, вдобавок обслуживал машины, грузовики и трейлеры. У него была широкая деятельность и еще более обширные амбиции. Я бы с удовольствием продолжил: Джим был интересным персонажем, неординарным и тенденциозным, и часто попадал в разные переделки. Но вернемся к нашей истории.

Компьютерные проблемы Джима брали начало из сделки с калифорнийскими разработчиками, которую он заключил раннее он заказал систему для ведения бизнеса. Компания была очень маленькой, буквально пара человек. Они продали ему 16-разрядный мини-компьютер Data General Eclipse с несколькими терминалами, а также сделали специальную программу для обработки заказов на ремонт, платежей и зарплатных ведомостей.

В какой-то момент отношения между Джимом и подрядчиком стали портиться. Подрядчик перестал дорабатывать систему и начал требовать слишком много денег, на вкус Джима, за то, чтобы исправлять баги, которые стали сильно портить жизнь сотрудникам офиса. Всех подробностей я не знаю, но дошло до того, что они вообще перестали разговаривать друг с другом, так что Джим фактически остался с продуктом, лишенным поддержки, на руках. Он обратился к местным программистам выяснилось, что программа зашифрована. Тут оговорюсь для точности: следовало бы сказать, что программа была защищена, а не зашифрована, но итог все равно один никто не мог добраться до исходного кода и что-то в нем исправить.

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

А именно. Все системные файлы, которые что-то делали, были написаны на BASIC отлично, благодаря долгим годам корпения над играми для TRS-80 я неплохо знал BASIC. Но, если открыть какой-нибудь из этих файлов, он оказывался пустым. Программа есть, а в редакторе кода ничего не отображается. Судя по размеру файлов я проверил в директории, где они находились содержимое в них было. Но их как-то сделали недоступными для просмотра.

Если бы у меня были компьютеры получше в годы юности, я бы, наверное, сразу встал и ушел без малейшего понятия, что с этим делать. Но я много времени провел за допотопными или просто примитивными машинами вроде мини-компьютера PDP-8/E производства Digital 1974 года, который стоял в школе, или моего личного инструктора по микрокомпьютеру Netronics ELF II, где для ввода-вывода служили клавиатура с шестнадцатеричными кодами и лампочки. Поэтому я кое-что знал о машинном коде, форматах файлов, заголовках, системных утилитах всяких низкоуровневых вещах. По крайней мере, об их существовании.

И я подумал: наверное, с этими файлами что-то сделали, раз они не читаются, может быть, дело в заголовках? Я нашел в системе hex-редактор, с помощью которого можно было отображать и редактировать содержимое файлов в сыром виде, включая заголовки. Программа вывела содержимое файла в виде набора шестнадцатеричных чисел, аккуратно оформленных в табличку, а также символов, которые они представляли.



В редакторе определенно отображался исходный код на BASIC для всех программ. Он реально существовал, никакой шифровки не было. Это было первым наблюдением, которое меня обнадежило значит, моя теория могла оказаться верной. Возможно, найдется какой-то способ перетянуть этот код из старых файлов в свежие, которые будут нормально открываться.
Джим крутился рядом, явно умирая от любопытства, но нужно отдать ему должное особенно не вмешивался. Уверен, для него всё выглядело, как будто я знаю, что делаю, потому что всякие цифры и таблицы так и летали по экрану. В реальности я действовал наобум, пытаясь нащупать решение и исправить файлы.

Я создал нормальный файл на BASIC и изучил его в hex-редакторе. Потом сравнил с корявыми. Само содержимое, разумеется, отличалось, но у заголовков, в которых содержалась информация о файлах (название, расположение, размер, защита), формат был похожим. Так как эти фрагменты хорошо накладывались друг на друга, я решил, что можно кое-что извлечь из сопоставления.

В заголовках выделялось несколько непонятных мне областей, в которых обнаруживались различия между нормальными и корявыми файлами. Я стал просто вслепую экспериментировать с кодом, меняя некоторые символы в корявых файлах. Первые несколько попыток привели только к повреждениям файла, из-за которых он переставал даже открываться. Но потом я дошел до одного места, где в нормальных файлах стоял символ E, а в корявых символ F (E в шестнадцатеричной системе исчисления соотносится с 1110 в двоичной, а F с 1111). 1110 против 1111, разница всего-то в один бит. И я просто взял и заменил в корявом файле F на E.

Как по волшебству, на экране появился код на BASIC. Я был потрясен. Защита, которую подрядчик оставил для своих файлов, сводилась к банальной замене одного символа в каждом из заголовков, чтобы файлы запускались, но не читались. Можно сравнить с замочком, которые некоторые надевают на чемодан может немного помешать, но того, кто твердо намерен добраться до содержимого, не остановит.

У меня колотилось сердце: казалось все более и более реальным, что я сумею решить проблему Джима. И, самое-то главное, смогу подкрепить слово делом, или как там говорят? На тот момент я провел в офисе примерно час, еще около сорока пяти минут понадобилось, чтобы перебрать все файлы и везде заменить символы. Сейчас я бы, наверное, попытался сделать какой-то скрипт, который бы все это провернул автоматически, потому что программисты не зря слывут лентяями. Но подобные вещи оставались за пределами моих возможностей в восемнадцатилетнем возрасте, да и не факт, что Data General Eclipse так уж хорошо подходил для создания скриптов, насчет этого не поручусь.

В конечном счете, мне потребовалось чуть меньше двух часов, чтобы снять все защиты. Когда Джим увидел, что я починил файлы, он был изумлен и обрадован (именно в этом порядке). Он радостно попросил меня исправить еще один баг в форме ввода, который очень докучал его бухгалтеру там никак не удавалось заполнить одно поле. Баг оказался простым, полминуты на поиск, полминуты на исправление. Но для них это значило, что не придется теперь тратить целые часы лишнего времени, заполняя формы вручную, потому что не получается на компьютере.

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

Сколько просишь?

Этот вопрос возглавил бы список самых страшных вещей, которые у меня спрашивали, если бы не Когда выходишь?, который я услышал парой недель раньше от работника дорожного управления. А так он занял почетное второе место. Ведь мне, восемнадцатилетнему подростку, который нигде никогда не работал, никогда в руках зарплаты не держал и сбежал с единственного в своей жизни собеседования, предлагалось самому решить, сколько денег мне причитается. На финансовой стороне вопроса я как-то не сосредоточивался. Когда входил в офис, еще думал о том, что, может быть, удастся получить здесь работу, но потом всё внимание поглотила техническая задача.

Какую же цифру назвать? Я понятия не имел. Не знал, сколько в принципе берут программисты, что такое консультант и как оценивать свое время. Мне не хотелось обижать Джима заоблачными запросами, но и в дураках остаться тоже не хотелось. Поэтому я выбрал сумму, которая лично мне казалась кругленькой, но Джима вряд ли бы разорила сто долларов.
Услышав мой ответ, Джим расплылся в улыбке. Это была улыбка человека, которого после томительного ожидания вытащили из петли и отпустили на свободу. Ну или можно сказать, улыбка человека, который только что провернул хорошую сделку. Джим бросил взгляд на бухгалтера и сказал:

Выпиши Неду чек на сто долларов.

Потом он сообщил мне, что у его еще много таких задач, если мне случаем нужна работа систему еще дорабатывать и дорабатывать. Он предложил мне четыреста долларов в неделю в течение лета, чтобы я приходил исправлять ошибки и писать новые программы, которых ему не хватает.
Так что я ушел от него с сотней долларов и работой на лето в кармане. Родители были счастливы, да и я тоже. Я отработал у Джима и то лето, и следующее, денег мне хватило и на жизнь, и на учебные расходы, да еще осталось, чтобы купить свой первый настоящий компьютер Commodore VIC-20. Я неплохо заработал, делая то, что мне нравится.

Какое-то время меня преследовало чувство, что я прогадал в этой своей первой сделке с Джимом. Было ясно, что на тот момент я диктовал условия и мог спокойно взять с него и побольше, чем сотню. Он бы заплатил, и, наверное, это было бы справедливо ведь никто, кроме меня, не смог справиться с проблемой. Вообще-то, до этого он отдавал программистам и более значительные суммы за работу, даже безрезультатную. И я спрашивал себя: сколько еще денег я мог бы унести домой в тот день? Возможно, я показал этим свой непрофессионализм?

Время все расставляет по своим местам. Вспоминая эту историю сейчас, я осознаю, что в те времена минимальная зарплата составляла чуть меньше четырёх долларов в час. То есть за эту сотню мне пришлось бы двадцать пять часов раскидывать асфальт с дорожными рабочими а вообще-то, больше, учитывая, что Джим в своем фирменном стиле рассчитался со мной за всё это предприятие в конверте. А в итоге я получил работу, где мне платили, наверное, около двадцати долларов в час, потому что за свои четыреста долларов мне приходилось отрабатывать не больше половины рабочей недели. И при этом я занимался тем, что и по сей день не воспринимаю как работу в том смысле, который вкладывал в это слово мой отец. В общем, не такая уж невыгодная сделка.

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

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

Вообще-то статья замышлялась как руководство по откосу от серьезной работы для подростков, но я не могу сообразить, какой совет дать исходя из личного опыта. В голову лезут только всякие банальности в духе Занимайтесь тем, что вас увлекает, а деньги придут потом или Найдите работу, которую любите, и вам не придется работать ни дня. В моем случае в этих расхожих фразах нашлось зерно истины. А так могу добавить только одно: если идете на собеседование, сразу придумайте запасной план на случай, если вам начнут задавать страшные вопросы вроде Когда выходишь?.
Подробнее..

Перевод Как произвольно установленные дедлайны вредят разработчикам

06.05.2021 10:07:53 | Автор: admin


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

Дедлайн должен иметь под собой обоснование. Потому что потому это не обоснование. Это никуда не годная практика установки сроков, от которой страдают и компании, и разработчики. Мне повезло: у большей части компаний, в которых я работал, не было обычая брать сроки с потолка. Но бывали и исключения. Об одной ситуации такого рода я хочу рассказать в качестве примера в этой статье.

Я тогда работал в стартапе; фронтенд-команда у нас состояла из троих человек, еще имелась бэкенд-команда таких же размеров. Мы работали над обновленной версией мобильного приложения и должны были уложиться с релизом до четко обозначенного дня. Одна проблема: этот день был произвольно выбран то ли простым директором, то ли техническим без каких-либо оснований для подобного решения.

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

Так или иначе, наша приблизительная оценка стала результатом двухдневных совещаний: сначала общий обзор новых функций, потом подробный разбор каждой в отдельности, потом еще более дробный анализ Наконец по каждому этапу работ прикинули количество часов, перепроверили, соотнесли с UX и UI-дизайном, всё сложили, накинули сколько-то часов сверху и вот получился срок выполнения работ.

Вы сейчас, наверное, подумали: ну, раз у них UX и UI-дизайны уже готовы, да еще и про запас часы заложены, то, наверное, всё должно пройти нормально? В большинстве случаев при установке сроков условия бывают похуже. Ну, в общем, нет. Нормально ничего не прошло.
Продолжительность работ была установлена в три-четыре недели не слишком много времени, если говорить о релизе нового продукта силами небольшой команды. Само собой, после первых двух недель мы уже стали отставать от графика. Не потому что медленно работали или мало часов тратили на проект, а потому что всё всегда идёт не по плану.

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

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

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

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

В обновлении не было ничего такого уж важного, что бы мотивировало необходимость релиза именно в эту дату и ни днём позже. Никто из пользователей не знал про то, что готовится новая версия, никто (ни клиенты, ни инвесторы) не строил планов с опорой на дату. Да, функции полезные, но разве кому-то стало бы хуже, если бы их выпустили на один день позже? Разве это вообще на ком-нибудь сказалось бы?

А вот на разработчиках сказалось. Тут и там люди изливали друг другу свое недовольство; отношения между командой и руководством явно были подпорчены. И это не единичный случай, такое происходило часто, пока я там работал с периодичностью где-то раз в несколько месяцев.

И какой из этого всего следует вывод? Совсем махнуть рукой на любые сроки? Ну, нет, конечно. Как уже говорилось в начале статьи, дедлайны вообще-то полезны, и самому мне с ними проще работается. Но их нужно воспринимать как ориентиры, а не как жесткие обязательства. Если продукт выйдет на пару дней позже, это не должно считаться концом света. Какой смысл оказывать лишнее давление на разработчиков? Или вы думаете, качество кода от подобных марш-бросков не страдает?

Когда мы после рабочего дня поздно вечером отрабатывали дополнительные часы под знаменем форс-мажора, общий настрой был: Так, надо это добить поскорее. Часто внедрялись всякие костыльные решения, которые сколько-то поработают, а потом потребуют рефакторинга. В некоторых случаях соответствующий рефакторинг сразу вносился в расписание, в других о нем благополучно забывали. А бывало, что разработчики и сами толком не осознавали, что делают что-то костыльное, потому что были уставшими и хотели домой.

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

По моим прикидкам (статистику я не собирал, так что ручаться не могу), толк от этой переработки был только в краткосрочной перспективе. Ну да, выпустили приложение в срок. А следующий релиз уже пришлось задерживать, потому что многое переписывали. Разработчики были недовольны (и, как вы уже догадались, активно увольнялись), атмосфера в команде стала напряженной. И это мы еще не учитываем последствия багов, с которыми пользователи столкнулись после релиза.

Как нужно?


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

Всё сделали раньше срока? Ну, в такой ситуации все только выигрывают. И тестирование можно провести как следует, и дать разработчикам возможность что-то улучшить в кодовой базе. Если вы разработчик или общаетесь с разработчиками по работе, то сами знаете: в коде всегда есть места, которые хотелось бы подтянуть. Иногда это всего час и займет, а иногда речь идет о нескольких днях. Лучше не экономить время на том, чтобы сделать код лучше и аккуратнее как мы все можем подтвердить, в приложениях и так хватает недочетов, которые никто из пользователей не оценит.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru