Slide 1

Slide 1 text

Метрики всему голова Vadim Smal Senior iOS developer

Slide 2

Slide 2 text

2 NDA

Slide 3

Slide 3 text

3 Data D riven Hype Learning Machine Big Mining M etrics Approach Deep Complex Decision making Analytics Network Neural infographic NLP

Slide 4

Slide 4 text

4 Data D riven Hype Learning Machine Big Mining M etrics Approach Deep Complex Decision making Analytics Network Neural infographic NLP

Slide 5

Slide 5 text

5 Data D riven

Slide 6

Slide 6 text

6 Data Driven Анализ данных может изменить будущее организации, но только если будет применяться постоянно, каждый день, каждым сотрудником

Slide 7

Slide 7 text

7 Data Driven Анализ данных может изменить будущее организации, но только если будет применяться постоянно, каждый день, каждым сотрудником

Slide 8

Slide 8 text

8 Data Driven •Зачем? •Метрики •Продуктивность •Приложение •Экосистема

Slide 9

Slide 9 text

9 Data Driven •Зачем? •Метрики •Продуктивность •Приложение •Экосистема

Slide 10

Slide 10 text

10 Data Driven •Зачем? •Метрики •Продуктивность •Приложение •Экосистема

Slide 11

Slide 11 text

11 Data Driven •Зачем? •Метрики •Продуктивность •Приложение •Экосистема

Slide 12

Slide 12 text

12 Data Driven •Зачем? •Метрики •Продуктивность •Приложение •Экосистема

Slide 13

Slide 13 text

13 Data Driven = Optimization

Slide 14

Slide 14 text

14 Data Driven Company Monetization Marketing Management Analytic Design Testing Develop Business

Slide 15

Slide 15 text

15 Monetization Ценность клиента на протяжении жизненного цикла Стоимость привлечения клиента Риск концентрации клиентов Количество новых пользователей Отток клиентов Виральность …

Slide 16

Slide 16 text

16 Data Driven Company Monetization Marketing Management Analytic Design Testing Develop Business

Slide 17

Slide 17 text

17 Management Ключевые показатели эффективности (KPI) Коэффициент надежности оценки трудозатрат Число случаев нарушения SLA Скорость работы …

Slide 18

Slide 18 text

18 Data Driven Company Monetization Marketing Management Analytic Design Testing Develop Business

Slide 19

Slide 19 text

19 Testing Покрытие требований Тестовое Покрытие Покрытие кода Коэффициент регрессии Количество дефектов Время жизни дефекта Плотность дефектов …

Slide 20

Slide 20 text

20 Data Driven Company Monetization Marketing Management Analytic Design Testing Develop Business

Slide 21

Slide 21 text

21 Develop ?

Slide 22

Slide 22 text

22 Технологии: Language: Datasource: Visualization: Develop

Slide 23

Slide 23 text

23 Metabase Технологии: Visualization: Develop

Slide 24

Slide 24 text

24 Размер приложения Время запуска приложения Энергоэффективность CrashFree + OOM Время компиляции Время работы над задачей Время Code Review Конфликты Технический долг Безопасность Permission Apple Watch Apple Pay Причина запуска Accessibility … Причина завершения

Slide 25

Slide 25 text

25 Продуктивность Приложение Экосистема Время компиляции Время работы над задачей Время Code Review Конфликты Безопасность Технический долг Размер приложения Время запуска приложения Энергоэффективность CrashFree + OOM Причина завершения Permission Причина запуска Apple Watch Apple Pay Accessibility

Slide 26

Slide 26 text

26 ⏱ Время работы над задачей

Slide 27

Slide 27 text

27 Время работы над задачей

Slide 28

Slide 28 text

28 Количество задач 0 100 200 300 400 Дни недели Monday Tuesday Wednesday Thursday Friday IN TEST IN REVIEW QA PROGRESS IN PROGRESS OPEN RESOLVED OPEN IN PROGRESS IN REVIEW READY FOR TEST IN TEST RESOLVED Время работы над задачей

Slide 29

Slide 29 text

29 Среднее время в часах 0 10 20 30 40 Дата 23 24 25 26 28 Разработка Code Review Ожидание QA Тестирование IN PROGRESS IN REVIEW READY FOR TEST Разработка IN REVIEW Code Review IN TEST READY FOR TEST Ожидание QA RESOLVED IN TEST Тестирование Время работы над задачей

Slide 30

Slide 30 text

30 Среднее время в часах 0 10 20 30 40 Дата 23 24 25 26 28 Разработка Code Review Ожидание QA Тестирование Время работы над задачей Используй перцентиль!

Slide 31

Slide 31 text

31 0 4 8 12 16 80%перцентиль Значения: 1; 2; 2; 4; 5; 16; 2; 5; 2; 16; 1; 4; Сортируем: Отбрасываем 20% наибольших: 1; 2; 2; 4; 5; Время работы над задачей

Slide 32

Slide 32 text

32 95%% время в часах 0 10 20 30 40 Дата 23 24 25 26 28 Разработка Code Review Ожидание QA Тестирование Время работы над задачей Время Code Review

Slide 33

Slide 33 text

33 Оптимизация: •Больше функциональных тестов •Поиск замедляющих факторов Время работы над задачей Время Code Review

Slide 34

Slide 34 text

34 + Время компиляции Время компиляции

Slide 35

Slide 35 text

35 Build Clean Incremental No Changes Changes Время компиляции

Slide 36

Slide 36 text

36 time xcodebuild clean build Clean shell Время компиляции

Slide 37

Slide 37 text

37 Incremental - No changes time xcodebuild build xcodebuild clean build shell Время компиляции

Slide 38

Slide 38 text

38 Incremental - Changes touch time xcodebuild build xcodebuild clean build shell Время компиляции

Slide 39

Slide 39 text

39 Clean Incremental No changes 1200 1000 800 600 400 200 0 Build time в секундах Время компиляции

Slide 40

Slide 40 text

40 -debug-time-function-bodies Как оптимизиризовать clean build time? Время компиляции

Slide 41

Slide 41 text

41 Disable whole module optimization: SWIFT_OPTIMIZATION_LEVEL = -Onone Enable compilation times logging: OTHER_SWIFT_FLAGS += -Onone Xfrontend -debug-time-function-bodies ruby + xcodeproj Время компиляции

Slide 42

Slide 42 text

42 3823.01ms Pods/SwiftProtobuf/TimeUtils.swift:37:15 func gregorianDateFromSecondsSince1970 277.29ms Service/Categories/SomeValidationService.swift:61:18 private final func isRequired 272.32ms Assemblies/ServiceFactory/ServiceFactoryImpl.swift:103:5init() 252.48ms UnitTests/RequestTests.swift:8:10 @objc func testProfileRequest 223.99ms UnitTests/SearchParametersTests.swift:8:10 @objc func testSearchParameters 217.99ms Pods/SwiftProtobuf/Google_Protobuf_Timestamp+Extensions.swift:28:14 private func parseTimestamp Время компиляции

Slide 43

Slide 43 text

43 Что делать с Incremental? Dynamic frameworks Меньше кода! (в основном таргете) Время компиляции

Slide 44

Slide 44 text

44 App Main target Some framework 1 Some frame work 2 Some frame work 3 Время компиляции

Slide 45

Slide 45 text

45 App Main target Some framework 1 Some framework 2 Some framework 3 Время компиляции

Slide 46

Slide 46 text

46 For all targets first: write start timestamp last: write end timestamp ruby + xcodeproj Время компиляции

Slide 47

Slide 47 text

47 Alamofire start: 1510929110.2161 Reachability start: 1510929110.3254 Unbox start: 1510929110.4009 Alamofire end: 1510929110.7597 Unbox end: 1510929110.9774 Reachability end: 1510929110.9925 … Время компиляции

Slide 48

Slide 48 text

48 Alamofire 0.5436 Reachability 0.6671 Unbox 0.5765 … Время компиляции

Slide 49

Slide 49 text

49 Время компиляции Alamofire Unbox Reachability …

Slide 50

Slide 50 text

50 Конфликты

Slide 51

Slide 51 text

51 Почему возникают конфликты? Часто изменяемые файлы Изменения в одном файле Конфликты

Slide 52

Slide 52 text

52 OR git log/whatchanged Конфликты

Slide 53

Slide 53 text

53 Конфликты

Slide 54

Slide 54 text

54 Refactoring DI SRP + + Конфликты

Slide 55

Slide 55 text

55 Network Communication Проверка Transport Layer Security (TLS) Проверка Certificate Pinning Data Storage and Privacy UserDefaults vs KeyChain secureTextEntry = true Cryptography md5 vs sha256 Anti Reverse Engineering Jailbreak check Authentication Session prune Session timeout Architecture Frameworks identify Platform Interaction WebViews JS disabled Code Quality and Build Settings Non-debuggable Log disabled Безопасность

Slide 56

Slide 56 text

56 Code Quality and Build Settings Anti Reverse Engineering Data Storage and Privacy Cryptography Authentication Platform Interaction Architecture Network Communication Безопасность

Slide 57

Slide 57 text

57 SwiftLint + Технический долг

Slide 58

Slide 58 text

58 Размер приложения

Slide 59

Slide 59 text

59 - SomeApp.app - SomeAppBinary - Fonts.bundle - AppIcon*.png - *.plist - *.nib - *.storyboardc - *.momd - *.bundle *** - PlugIns - *Extension.appex Binary - Frameworks - libswift*.dylib - *.framework - Binary - *.car = Resources Binary Размер приложения

Slide 60

Slide 60 text

60 Export for all devices: xcodebuild -exportArchive Generate report: zipinfo | grep Resources zipinfo | grep .framework Generate diff shell Размер приложения

Slide 61

Slide 61 text

61 App-iPad 2.ipa 0.02Mb 0.00Mb SomeFramework.framework/SomeFramework growth ----------------------------------------------------------------------------------------- App.ipa 0.00Mb 0.01Mb App growth 0.02Mb 0.01Mb SomeFramework.framework/SomeFramework growth ----------------------------------------------------------------------------------------- 892 files, 233498726 bytes uncompressed, 70231104 bytes compressed: 69.9% General report Binary diff Размер приложения

Slide 62

Slide 62 text

62 120 100 80 60 40 20 0 App size in Megabytes Размер приложения

Slide 63

Slide 63 text

63 App launch time be less than 20 seconds or the system will kill it WWDC 2016 Время запуска

Slide 64

Slide 64 text

64 Cydia Время запуска

Slide 65

Slide 65 text

65 run simulator xcrun simctl uninstall xcrun simctl install save timestamp xcrun simctl launch save timestamps in app xcrun simctl terminate parse log file kill simulator shell Время запуска

Slide 66

Slide 66 text

66 TotalMedian Total PreMain AfterMain BeforeLaunching AfterLaunching 1.117 1.412 0.523 0.491 0.211 0.187 Время запуска

Slide 67

Slide 67 text

67 1.4 1.2 1.0 0.8 0.6 0.4 0.2 0 Start up times in seconds TotalMedian AfterMain BeforeMain BeforeLaunching AfterLaunching Время запуска

Slide 68

Slide 68 text

68 Время запуска

Slide 69

Slide 69 text

69 1.Save time in main - gettimeofday 2.Save time in enter to didFinishLaunching 3.Save time in exit from didFinishLaunching 4.Calculate: startup time = time - process start time ( sysctl ) Время запуска

Slide 70

Slide 70 text

70 2.2 2.0 1.8 1.7 1.6 1.5 10.24 10.27 10.30 11.02 11.05 11.07 11.10 11.13 11.16 11.17 Total Median / events count Main Median / events count Finish Launching Median / events count Время запуска

Slide 71

Slide 71 text

71 Размер ресурсов

Slide 72

Slide 72 text

72 1.7 K 1.5 K 1.2 K 1 K 750 500 250 Размер ресурсов

Slide 73

Slide 73 text

73 Размер ресурсов 50 MB 150 MB 300 MB > 300MB NSFileManager attributesOfFileSystem

Slide 74

Slide 74 text

74 CrashFree + OOM

Slide 75

Slide 75 text

75 Background Eviction Crash Out of memory Force Quit Device Reboot Terminate Reason: Debug App Update OS Update Unknown #if DEBUG Fabric Compare versions Compare OS onTerminate Device uptime onBackground CrashFree + OOM Причина завершения receiveWarning

Slide 76

Slide 76 text

76 CrashFree + OOM Причина завершения

Slide 77

Slide 77 text

77 Энергоэффективность

Slide 78

Slide 78 text

78 Background Or Foreground Энергоэффективность

Slide 79

Slide 79 text

79 Charging ? Энергоэффективность

Slide 80

Slide 80 text

80 energyEfficiency = battery level diff / foreground duration On Demo: ~ 24% (iPad mini 4) - 55% ( iPhone 4s ) в час Энергоэффективность

Slide 81

Slide 81 text

81 2M 1M 0M 0 M 15К 30К 45К 10.24 10.27 10.30 11.02 11.05 11.07 11.10 11.13 1 0.75 0.5 Энергоэффективность

Slide 82

Slide 82 text

82 QuickAction Notification OpenURL Common Причина запуска AppDelegate

Slide 83

Slide 83 text

83 Not have Have Camera AVCaptureDevice.authorizationStatus Location CLLocationManager.authorizationStatus Photo Library PHPhotoLibrary.authorizationStatus Push Notification UIApplication.currentUserNotificationSettings Permission

Slide 84

Slide 84 text

84 Larger Text UIApplication.preferredContentSizeCategory Bold Text UIAccessibilityIsBoldTextEnabled() Accessibility

Slide 85

Slide 85 text

85 Darker System Colors UIAccessibilityDarkerSystemColorsEnabled() Grayscale UIAccessibilityIsGrayscaleEnabled() Invert Colors UIAccessibilityIsInvertColorsEnabled() Accessibility

Slide 86

Slide 86 text

86 Voice Over UIAccessibilityIsVoiceOverRunning() Speak Screen UIAccessibilityIsSpeakScreenEnabled() Speak Selection UIAccessibilityIsSpeakSelectionEnabled() Accessibility

Slide 87

Slide 87 text

87 Reduce Motion UIAccessibilityIsReduceMotionEnabled() Reduce Transparency UIAccessibilityIsReduceTransparencyEnabled() Shake To Undo UIAccessibilityIsShakeToUndoEnabled() Switch Control UIAccessibilityIsSwitchControlRunning() Accessibility

Slide 88

Slide 88 text

88 Check supported WCSession.isSupported() Activate session.activate() Wait and check activationDidComplete: session.isPaired Apple Watch

Slide 89

Slide 89 text

89 PKPayment…ViewController.canMakePayments * Apple Pay

Slide 90

Slide 90 text

90 Model uname(&systemInfo); systemInfo.machine iOS version: UIDevice.systemVersion Locale Locale.current.identifier Disk capacity fileManager.attributesOfFileSystem

Slide 91

Slide 91 text

91 isSimulator (arch(i386) || arch(x86_64)) && os(iOS) isJailbreak*

Slide 92

Slide 92 text

92 Text Size Color Size Voice Over Apple Watch Apple Pay Rich Notification

Slide 93

Slide 93 text

93 Rich Notification Apple Pay

Slide 94

Slide 94 text

94 •Данные бывают обманчивы •Объяснить просто, понять сложно •Сделать проще, чем замерить •Отсутствие действий

Slide 95

Slide 95 text

95 •Данные бывают ошибочны •Объяснить просто, понять сложно •Сделать проще, чем замерить •Отсутствие действий

Slide 96

Slide 96 text

96 •Данные бывают ошибочны •Объяснить просто, понять сложно •Сделать проще, чем замерить •Отсутствие действий

Slide 97

Slide 97 text

97 •Данные бывают ошибочны •Объяснить просто, понять сложно •Сделать проще, чем замерить •Отсутствие действий

Slide 98

Slide 98 text

98 Итог До •Востребовано? Во время •Есть импакт? После •Результат достигнут? •Что улучшить?

Slide 99

Slide 99 text

99 Итог До •Востребовано? Во время •Есть импакт? После •Результат достигнут? •Что улучшить?

Slide 100

Slide 100 text

100 Итог До •Востребовано? Во время •Есть импакт? После •Результат достигнут? •Что улучшить?

Slide 101

Slide 101 text

101