Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Developer Experience at Heetch
Search
Jérôme Alves
April 04, 2019
Technology
49
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Developer Experience at Heetch
Jérôme Alves
April 04, 2019
More Decks by Jérôme Alves
See All by Jérôme Alves
Showcase Driven Development
jegnux
0
750
8 uses of RxSwift
jegnux
0
220
Other Decks in Technology
See All in Technology
LambdaWebFunctionsを試してみた / exploring-lambda-web-functions
koukihosaka
1
350
AI駆動で「他アプリの音を加工できる」アプリを作った
satomasahiro2005
0
170
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.4k
その Valkey 使いこなしていますか?
onk
PRO
5
1.5k
Claude の新機能を、 出た日に触って社内に届けるまで
rfdnxbro
1
190
Classmethod Company Deck
satoshi7
1
710
PHPカンファレンス関西の招待状 / Invitation to PHP Conference Kansai
ykanoh
0
140
AI コーディングと人間の認知スループット / CTO Night & Day 2026 Morning Session / AI Coding and Human Cognitive Throughput
prog893
4
1.2k
パスキーの自動テストはどこまでいけるのか
teamlab
PRO
0
260
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
150
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
930
Code for Security プロジェクト紹介 2026年10月
yu23ki14
0
110
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Chasing Engaging Ingredients in Design
codingconduct
0
360
Utilizing Notion as your number one productivity tool
mfonobong
4
620
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Designing for Performance
lara
612
70k
The Curious Case for Waylosing
cassininazir
1
570
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Transcript
Developer Experience
at Heetch
→ Organization → Architecture → Dependency Injection → Debugging →
Showcase Driven Development → Pull Requests
! Organization
6 devs
4 teams
Driver Engagement (2) Passenger Acquisition (1) Ride (1) Boost (1)
! Architecture
MVC
UIViewController
None
→ Managing the View → Presenting View Controllers → Supporting
Custom Transitions and Presentations → Managing Child View Controllers in a Custom Container
→ Responding to View Events → Extending the View's Safe
Area → Managing the View's Margins → Configuring the View’s Layout Behavior → Managing the Status Bar
ViewController<T>
Wraps any UIView or UIViewController
Properties to manage safe area insets, status bar style and
layout margins
ScrollViewController<T>
Wraps any UIViewController
Automatically updates contentSize using AutoLayout
VisualEffectViewController<T>
Wraps any UIViewController
Properties to manage the visual effect view
StackViewController
Arranges UIViewController children in a UIStackView
Simple and easy-to-use animation API
LayerViewController
Arranges UIViewController children as layers (think Photoshop)
Simple and easy-to-use animation API
ViewController<T> ScrollViewController<T> VisualEffectViewController<T> StackViewController LayerViewController
UIView
→ Configuring Visual Appearance → Managing the View Hierarchy →
Managing AutoLayout (Constraints, LayoutGuides, etc..) → Laying out Subviews (manually) → Drawing → Managing Gesture Recognizers
Recipe
1. Create Views 2. Assemble them 3. Subclass UIViewController only
if needed
What abut Data and Control flow?
View Models
Data → View Models → View
class ProfileHeaderView: UIView { } class ProfileContentView: UIView { }
class ProfileSummaryView: UIView { }
class ProfileViewModel { var name: Observable<String> { get } var
email: Observable<String?> { get } var rating: Observable<Double> { get } }
extension ProfileViewModel { func drive(_ view: ProfileHeaderView) { /* Binding
Rx */ } func drive(_ view: ProfileContentView) { /* Binding Rx */ } func drive(_ view: ProfileSummaryView) { /* Binding Rx */ } }
class RideViewModel { } extension RideViewModel { func drive(_ view:
ProfileSummaryView) { /* Binding Rx */ } }
What about Navigation?
Coordinators
Rule nº1: No Protocol
var rootViewController: UIViewController { get }
var rootViewController: Observable<UIViewController> { get }
var topViewController: Observable<UIViewController> { get } var middleViewController: Observable<UIViewController> {
get } var bottomViewController: Observable<UIViewController> { get }
Rule nº2: A coordinator is not responsible of its own
presentation
Rule nº3: Use requirements
init(navigationController: UINavigationController)
! Dependency Injection
ViewModels declare their dependencies in an "IO" protocol.
Sourcery generates automatically "IOResolvers".
protocol ProfileViewModelIO { var profile: Observable<Profile> { get } func
updateEmail(_ newValue: String) -> Completable } class ProfileViewModel { let io: ProfileViewModelIO init(io: ProfileViewModelIO) { self.io = io } }
let viewModel = ProfileViewModel(io: .resolve( profile: { Observable.merge( apns.continuousUpdates(of: .profile),
api.performRequest(.getProfile) ) }, updateEmail: { newValue in api.performRequest(.postEmail(newValue)) } ))
Debugging
NSLogger
We (try to) log everything
extension ObservableType { func log() }
Debug Assistant
Fake Location
Slow Motion
Feature Flags
Staging Environment
Debug Info
Demo
✨ Showcase Driven Development
Showcase [noun, /ˈʃoʊ.keɪs/]
It's like a Playground, but in-app
Every view is developed in a Showcase
Every screen is available as a Showcase.
View Models are stubbed with fake IO resolvers.
Coordinators are presented as modals or pushed.
Demo
⚖ Pull Requests
Keep them small
Focused on one thing
Good Description
Duck Review
! Thank you