Mobile Library Development - stuck between a pod and a jar file - Zan Markan - Codemotion Amsterdam...

Post on 21-Jan-2018

545 views 2 download

Transcript of Mobile Library Development - stuck between a pod and a jar file - Zan Markan - Codemotion Amsterdam...

Mobile Library DevelopmentStuck between a Pod and a Jar file

Zan Markan @zmarkan

AMSTERDAM 16 - 17 MAY 2017

@zmarkanZan Markan @zmarkan

LIBRARY DEVELOPMENTstuck between a pod and a jar file

@zmarkan©Copyright @zmarkan 2017

About MeDeveloper for 8+ years

Mostly Android, mobile

>>

See also: emoji overuser

@zmarkan@zmarkan

Developer tools company

blog.pusher.com

Chat API

Hiring in Ldn

Trusted by 150k+ devs pusher.com | @pusher

@zmarkan

Contents of this talk● Libs 101● API Design● Development & Testing● Releasing● Docs

...and more!

@zmarkan

We building libs because... Avoid duplicating logic - Best Practice

Sharing == Caring

It’s a great way to enrich your

We want to be paid

@zmarkan

Libraries are a collection of classes and methods that encapsulate common, shared functionality.

@zmarkan

Libs != AppsLibraries are NOT end products

Smaller, more lightweight than apps

Many x Many apps/lib ratio

@zmarkan

All about that Lib...What: Libraries, Frameworks, SDKs

Type: General libs, UI Widgets, Serverside, Testing

Access: Publicly vs Privately accessible

Pricing: FOSS, Free to use vs Commercial

API: DSL, Reactive, n other things...

@zmarkan

Product is about the User● Developers (like you and I)● Varied backgrounds, levels of experience● User experience -> Developer experience

@zmarkan

the truth about developersLibrary users are Developers…

… developers are very lazy, so...

libraries should enable laziness.

@zmarkan

API

@zmarkan

The API is to a library what the

USER INTERFACEis to an APP

@zmarkan

Things I mean by APIEntry points

Interaction points

Data model

Errors & Exceptions

@zmarkan

Entry points(where people first interact with your code)

They allow you to instantiate and configure the library

In “Code”: Constructors, Builders, Factories

In UI: Widgets

@zmarkan

Construction in CodeiOS: Named Parameters, Optionals

Android: (Overloaded) Constructors, Builders

Both: Sensible defaults >> Customisation

Also in Kotlin on Android!

@zmarkan

Builder Poor person’s named args

… and optional args

Ensures constructor is passed correct values, and

validates its state before building the class

@zmarkan

Methods & ModelsWhen in doubt - go S.O.L.I.D.

Naming, Naming, Naming!

Don’t surprise your users!(But you can delight them)

@zmarkan

(R)X-FactorAysnc as a stream of eventsAllows chaining, and functional operations

Support all the things: RxSwift, RxJava (even PHP!)

More: Paco Estevez makes AWESOME Rx libs/articles/talks

@zmarkan

RX in briefeventStream

.filter(//condition)

.flatMap(//transformation)

.subscribe(//handleSuccess, //handleError)

Not shown: one million operators, threading, ...

@zmarkan

RX… but

It’s still a power user feature

Callbacks are still often preferred

provide RX adapter as an optional extra?

@zmarkan

DSL-o-Matic... 9000Make your own little programming language…...by inventing a syntax that works for you!

Examples: Hamcrest, Rx, Kotlin Anko

Techniques: Macros, Annotations, Operator overloading, Extension methods, ...

@zmarkan

When things go ● Let it crash!● Early● Often

Ensure the error messaging is spot on

Add links in error messages to explanations

@zmarkan

Anatomy of a “nice” ErrorType: Illegal Input

Message: Request unsuccessful, reason: malformed auth token

Link: https://example.com/errors/123456

Explain things here!

@zmarkan

DEV & TEST

@zmarkan

Performance or Be wary of:

● Library size => App size● Memory leaks● Build times ● Needless dependencies

@zmarkan

API should be beautiful.Implementation should

f*****g work.

@zmarkan

Testing it & Loving it The easy: Unit Tests

The hard: Integration Tests with an app

The smart: foodingMore in: David Schreiber-Ranner’s talk from Droidcon Vienna 2016

@zmarkan

Tracking & AnalysisProblem: No Google Analytics for libraries

Track at the service level?

Listen and talk to users

fooding: Redux

unless you’re Fabric

@zmarkan

@zmarkan

(Semantic) Versioning 2.0Major[.]Minor[.]Patch

● Major: Breaking changes● Minor: New features● Patch: Hotfixes Shouldn’t ever happen● semver.org

@zmarkan

Releasing (how not to do it)

● Manually include the builds in your project

(Bad idea in most cases)

● Include project as a Git submodule

(Even worse idea in all cases)

@zmarkan

Releasing (the right way)

: Carthage, CocoaPods

Simple, git-based tools with some workspace-gen

: Maven Central, JCenter, Jitpack

Maven-based dependency managers ^^

@zmarkan

Releasing (privately)

: Carthage, CocoaPods << Work with private git repos ^^

: Sonatype Nexus, Artifactory Pro, Jitpack ^^ hosted solutions, will cost you

: Maven repo on S3, Artifactory OS ^^ free as in (just add server!)

@zmarkan

DOCS

@zmarkan

50 shades of Docs● Quick Start ● Sample apps ● Java/Swift Doc ● Wiki pages ● Yes, even tests! ● Mix & Match!

@zmarkan

Quickstart a.k.a.

“Let me copypaste something”

@zmarkan

Sample code● Should be small, confined apps● … often alongside libraries in the same repo● Should reflect your libraries’ features● Can go in-depth for more advanced features

@zmarkan

JavaDoc & SwiftDoc● Cheap to make● Automagically generated ● (Just add comments!)● Great in IDEs: Android Studio & XCode● Host it alongside your other docs

@zmarkan

Libraries enable app developers to be lazy. Docs enable library developers to be lazy.

@zmarkan

The takeawaysLibs 101

API design

Development

Releasing

Support

@zmarkan©Copyright @zmarkan 2017

fin

Blog: www.spacecowboyrocketcompany.com

Twitter: @zmarkan

Github: @zmarkan

Email: zan@[pusher.com | markan.me]