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
Getting Clean, Keeping Lean
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Joe Birch
March 17, 2017
Programming
740
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Getting Clean, Keeping Lean
Joe Birch
March 17, 2017
More Decks by Joe Birch
See All by Joe Birch
Learning to play guitar with Actions on Google
hitherejoe
1
140
Making Change as an Ally
hitherejoe
1
530
Tensorflow for Android Developers
hitherejoe
3
300
Learning to play the guitar with Actions on Google
hitherejoe
0
170
For Optimists, our UI is pretty Pessimistic
hitherejoe
4
3.1k
Android Things: Building for the IoT
hitherejoe
2
210
Android TV: Building Apps with Google’s Leanback Library
hitherejoe
1
1.2k
Building Beautiful Apps with the Design Support Library
hitherejoe
3
290
Other Decks in Programming
See All in Programming
Getting Started with Vibe Coding
miccheng
0
120
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
240
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3.1k
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
200
Event is what happens
moro
2
2.3k
パスワード再設定メールのURLについて知っておこう
uyuki234
0
200
[2026-10-09]一枚の布で作らなくてもいい。 信頼性は「パッチワーク」で紡がれる~既存の運用と新しい可能性をつなぎ合わせてきたCREの話~
tosite
0
120
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
6k
Python Lambdaにおけるテストしやすい設計とAI支援の活用 / Designing Testable Python Lambda Functions with AI
kitano_yuichi
1
260
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
500
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
490
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
390
Featured
See All Featured
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
590
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
460
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
310
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
A Soul's Torment
seathinner
8
3.9k
Code Reviewing Like a Champion
maltzj
529
40k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
550
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
780
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1.1k
Transcript
Getting clean. Keeping lean.
@hitherejoe hitherejoe joebirch.co Joe Birch - Android Engineer @ Buffer
@buffer buffer.com
Greenfield projects
None
- High-level of technical debt - Extremely tightly coupled concepts
- No unit or UI tests - Difficult to know what is going on and where No longer lean
- YOU know what is what - YOU know where
class X is - YOU know where logic for Y is - But what about along the line… No longer lean (for now) (for now) (for now)
25 50 75 100 Output Debt
25 50 75 100 Output Debt
For the sake of yours and future developers sanity -
have empathy. Be mindful of the consequences and think before you craft.
Buffer for Android
None
None
None
- Lack of architecture - Bloated activities with multiple responsibilities
- Difficult to test - Difficult to extend and maintain - Duplication of concepts == no reuse
Moving to MVP - Fear of changing too much -
Helped separate presentation logic - DataManagers to house data operations - Increased test coverage
None
None
Not enough. - Bloated DataManager classes - Future changes, offline
- where? - Presentation linked to specific data source - No clear line between responsibilites - Buffer is a big app. Data types, features, sources
Architecture “The art of planning, designing and constructing buildings”
Architecture “The art of planning, designing and constructing buildings concepts”
None
None
None
None
None
Think outside of your team.
Clean Architecture
None
Separation of Concerns
- Layers are independent of frameworks - Code becomes more
testable - Inner layers independant of UI - Inner layers independant of external parties Separation of Concerns - Bugs more isolated
None
Layer Models - Each layer has own Model classes -
Removes dependancy on external models - Easily map with Mapper classes
ModelA Mapper Model Mapper Model
Enterprise Business Rules - Application Business Objects (Entities) - Unaffected
by operational change - Can create before touching any UI
public class TournamentModel { public String id; public String
name; @SerializedName("full_name") public String status; @SerializedName("date_start") public String dateStart; @SerializedName("date_end") public String dateEnd; public int size; }
Application Business Rules - Application specific business rules - Uses
Cases - Affected by operational change - Isolated from external concerns
public class GetSchedules extends UseCase<ProfileSchedules> { private final SchedulesRepository
schedulesRepository; @Inject public GetSchedules(SchedulesRepository schedulesRepository) { this.schedulesRepository = schedulesRepository; } @Override public Single<ProfileSchedules> buildUseCaseObservable() { return schedulesRepository.getSchedules(); } }
None
Use Case Interface Interface Impl Activity Application Business Rules Interface
Adapters
Interface Adapters - Contains MVP architecture of our app -
Presenters contain ‘callbacks’ - Views define contract for implementation - Mapper converts data from external form
public class UpdatesPresenter extends BasePresenter<UpdatesMvpView> implements SingleObserver<List<Update>> { @Override public
void onSubscribe(Disposable d) { … } @Override public void onSuccess(List<Match> matches) { … } @Override public void onError(Throwable e) { … } }
Presenter Interface Interface Impl Activity Interface Adapters Frameworks & Drivers
Frameworks & Drivers - UI components (Activities, Fragments) - Networking
actions (Retrofit) - Storage (Cache & DB) - Repository Pattern for interacting with these
Repository Interface Repository Impl DataStore Interface DataStore Impl DataStore Impl
DataStore Factory
None
Layer Boundaries - Communication via abstractions (interfaces) - No direct
name references in inner layers - Instead, inner layer provides this interface - aka, The Dependancy Inversion Principle
Not limited to these layers Layer 1 Layer 2 Layer
3 Layer 4
Not limited to these layers Layer 1 Layer 2 Layer
3
Not limited to these layers Layer 1 Layer 2 Layer
3 Layer 4 Layer 5 Layer 6
Test Coverage
None
Learnings
Advantages. - High percentage of code coverage - Incredibly easy
to navigate package structure - Easier to maintain - Allows us to move faster - Focused classes and test classes
- Seperation of concerns - Define, Test, Stabilise before UI
- Futureproof implementations - Clear discipline, good practice - and more…
Disadvantages - Adds initial overhead - Takes time to get
used to - Can feel overkill for some tasks - Difficult to make decisions - Conversion of models between layers
Winston Enterprise Business Rules Application Business Rules Interface Adapters Mobile
UI TV UI Wear UI Frameworks & Drivers
Winston Enterprise Business Rules Application Business Rules Interface Adapters Mobile
UI TV UI Wear UI Frameworks & Drivers @hitherejoe hitherejoe joebirch.co
Resources https://overflow.buffer.com/2016/12/22/rebuild- android-composer/ https://github.com/googlesamples/android- architecture Clean Architecture: A Craftsman's Guide
to Software Structure and Design (Robert C. Martin)