Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Developer Experience at Heetch
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
740
8 uses of RxSwift
jegnux
0
220
Other Decks in Technology
See All in Technology
DatadogのBits Chatが開発組織にもたらしたもの / What Bits Chat Has Brought Us
sms_tech
1
280
【CEDEC2026】コードレビュー支援ツール開発から学ぶ:LLMを用いた業務システムの実践的な運用設計と誤出力対策
cygames
PRO
0
840
JavaScript 研修 (2026)
recruitengineers
PRO
2
590
20260804_Q4AzureUpdateBite_FabricDataAgentの精度を高める設計.pdf
matayuuu
1
140
AWS ネットワーク構築でハマった(ハマりかけた) 5選とそこから得た教訓
nagisa53
4
240
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
Webアクセシビリティ入門 2026
recruitengineers
PRO
3
620
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
220
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
670
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
19k
【CEDEC2026】次世代デジタルカードゲームのサーバー設計と運用 〜『Shadowverse: Worlds Beyond』の舞台裏~
cygames
PRO
1
1.4k
FPGAが実現する遠方宇宙の高空間分解能天体撮影 -大型地上望遠鏡の視力を補正する「補償光学」とは?-
komei_mt
0
280
Featured
See All Featured
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
700
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
290
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Utilizing Notion as your number one productivity tool
mfonobong
4
550
Scaling GitHub
holman
464
140k
How to train your dragon (web standard)
notwaldorf
97
6.8k
The Language of Interfaces
destraynor
162
27k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
170
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