important • Dealing with bad tooling, architecture or boilerplate • Creates a disconnect between our work and the end result • Makes us inefficient, creates roadblocks in our way • Makes it easy for us to make simple mistakes
hard • Enables more efficient workflow • Easier to keep connected with our work • Keeps focus on what matters and not dealing with our technical stack shortcomings • Limits human mistakes
instances of class X should ever be alive? • Works in Swift and Objective-C • Surface new retain cycle as you create them, not after you've finished the feature
into many frameworks • + Improves modular architecture design • Each framework has its own test suite that can run fast • Enables use of playgrounds or small projects • - Longer launch times due to dylib loading • Leverage cocoapods-static plugin or direct static frameworks • - Might be complicated to do in existing projects
up your project easily? • Free tool: InjectionForXcode • Code Injection for Objective-C and Swift • Its external app you install, no need to unsign your Xcode
Swift and Objective-C • Custom DSL for exposing control variables (sliders, image pickers, trigger buttons). • Easy to add Framework to existing code-base • Works great with InjectionForXcode
/ Codable • - Lack of control over the generated implementation • Not supportive of non-default cases • - Not a generic solution for Boilerplate maintenace, solves only a small subset of common algorithms
works like a pre-processor • Used in over 30 000 apps • Adds annotation support to Swift language • Allows fine-grained control over the generation • Sourcery can generate any boilerplate code if you can describe the algorithm once
Swift and Objective-C • FileWatcher.Local useful for observing local file changes e.g. observe file on the developer desktop. • FileWatcher.Remote can be used to observe files on the web, both Etag headers and Last-Modified-Date are supported.
• Always save your data at Data Provider level to file • if the user decides to send a bug report, send those files to the cloud • You can use file watcher provider to load it on another device and re-execute almost all code paths you have • Need more power? leverage unidirectional architecture/view state to implement time travel
Build phase script that allows you to create #if branches per developer (e.g. http://goo.gl/cLc4ay) #if merowing showARExperience(StubARData(...)) #endif
core goals of architecture design • Investing time into improving your team developer experience can yield huge efficiency wins for your business and save the sanity of your developers • If a mythical 10x developer exists it would be the person that makes 10 team members more efficient