- Видео 28
- Просмотров 62 013
Inside iOS Dev
США
Добавлен 16 мар 2017
Inside iOS dev is a weekly show about real world iOS development. Your hosts, Alex Bush and Sandeep Aggarwal, draw from their experiences ranging from 4+ year old legacy codebases, to small startup green field projects, to working on apps at places like Uber, Wayfair, and Upkeep with millions of active users. They discuss everything from implementing specific features, to creating flexible designs, to utilizing refactoring techniques, and more. This is THE show for professional iOS developers.
Clean Code’s Impact with Uncle Bob
In this episode we have legendary Robert Uncle Bob Martin come over to talk about Clean Code, professionalism, and courage. We cover:
- the impact of Clean Code on businesses' ability to change software and make money
- management pushback on applying Clean Code practices and how to handle it
- how managers get to the truth and how developers get to the truth
- professionalism, courage to take risk and saying NO despite potentially being fired
- writing tests to reduce risks working with legacy (and not legacy) code
- code ownership and pair programming
- following the code rules you establish
- a rapid questions round
- ask listeners' questions
- and much more
Clean Code: Architecture & Design Mast...
- the impact of Clean Code on businesses' ability to change software and make money
- management pushback on applying Clean Code practices and how to handle it
- how managers get to the truth and how developers get to the truth
- professionalism, courage to take risk and saying NO despite potentially being fired
- writing tests to reduce risks working with legacy (and not legacy) code
- code ownership and pair programming
- following the code rules you establish
- a rapid questions round
- ask listeners' questions
- and much more
Clean Code: Architecture & Design Mast...
Просмотров: 4 855
Видео
iOS Interview Tips from Engineering Manager and Senior Engineers
Просмотров 1,1 тыс.Год назад
Sandeep and Alex talk to Aaina Jain and Muralidharan Kathiresan about interviewing in current layoffs prone market, interview stages and tips to be more successful in each. Aaina's medium: medium.com/@aainajain Murali: unknowndefault.com/ topmate.io/murali_k www.linkedin.com/in/muralidharankathiresan/ Prepping for a system design interview? Check out Alex's iOS System Design Interview: video co...
Horrible Truth About Swift didSet
Просмотров 5702 года назад
In this episode Alex pair programs with Sandeep and finds out the horrible truth about Swift didSet callbacks with structs - unintentional side effects!!! 😱😱😱 !!! We code through a more readable OOP data encapsulation alternative using methods which alleviates this. The original discussion that happened about this can be found here: www.linkedin.com/feed/update/urn:li:activity:70172377774025277...
Offline iOS App Architecture
Просмотров 2,8 тыс.2 года назад
In this episode we have Saurabh back to talk about system design and architecture of iOS apps, in this case offline mode. We started with diagramming for a system design interview attempting to build an app that works offline. But we ended up jumping into coding and building a test app to figure out the details of how we'd actually do it. At the end of the conversation we covered a lot of groun...
Swift Dead Code Analysis
Просмотров 2,2 тыс.2 года назад
Sniff, sniff! 👃 Is it Duplicate code? No! Long method? No! Ah! It is dead code 🤯 The problem with dead code is that after a while it starts to “smell bad.” The older it is, the stronger and the sourer the odor becomes. The other day I was talking to my ex-colleague and he told me that while working on a new feature, he had to refactor a lot of code that ultimately increased the scope of the wor...
App Delegate Mediator Design Pattern
Просмотров 7032 года назад
Alex and Sandeep refactor a typical App Delegate into a more manageable and testable object using Mediator Design Pattern. Sign up for Alex's upcoming video course about iOS System Design Interview: iosinterviewguide.com/system-design-interview Need to prepare for an iOS Engineer Interview? iosinterviewguide.com Connect with us: insideiosdev Email us at hello@insideiosdev.com Attrib...
iOS System Design Interview for Fintech Companies
Просмотров 4,8 тыс.2 года назад
In this episode Alex talks to Sourabh Singh about iOS system design interview for a fintech company. They walk through and design a payment app with multiple payment options such as credit card, bank account, Paytm, etc. and sketch a potential architecture for it. Alex's system design video course: iosinterviewguide.com/system-design-interview Sign up for Alex's upcoming video course about RIBs...
WWDC 2022 Devs Reaction
Просмотров 2852 года назад
In this episode Alex and Sandeep react to WWDC 2022 Platform State of The Union. This is our very raw, unresearched reaction/opinion on what we heard on latest WWDC changes for iOS development. Some things are just emotions and unfiltered opinions, some are things we already looked into. We'll be doing deep dives in other videos into some of the stuff we covered that we're not sure or don't kno...
Learn top 10 iOS tips in less than 10 minutes
Просмотров 5162 года назад
Alex and Sandeep share 10 iOS development tips that you can add to your knowledge base in less than 10 minutes for a better development experience. 0:00 Intro 0:13 Tip # 1 0:46 Tip # 2 1:29 Tip # 3 2:43 Tip # 4 3:43 Tip # 5 4:43 Tip # 6 5:50 Tip # 7 7:44 Tip # 8 8:11 Tip # 9 9:24 Tip # 10 9:38 Outro Sign up for Alex's upcoming video course about iOS System Design Interview: iosinterviewguide.co...
Deep Links from Terminal
Просмотров 2872 года назад
In this episode Alex goes over how to open deep links in simulator via command line and how to do a basic setup to handle deep links in your codebase. Sign up for Alex's upcoming video course about iOS System Design Interview: iosinterviewguide.com/system-design-interview Sign up for Alex's upcoming video course about RIBs Architecture: ribsarchitecture.com/video-course-waitlist Need to prepare...
Blocked by the backend? Use prod mocks.
Просмотров 3172 года назад
In this episode Sandeep and Alex showcase how mocks can be used in production code to substitute upcoming unfinished or unreleased backend changes. They use dependency injection and Liskov Substitution Principle to inject a service object implementation that uses local hardcoded data instead of fetching it from the network.
Generating Mocks with Sourcery
Просмотров 7 тыс.2 года назад
Alex and Sandeep introduce Swift Sourcery, a code generation tool to automatically create mock implementations for interfaces in your code. Sourcery on github: github.com/krzysztofzablocki/Sourcery Chapters: 0:00 Intro 3:34 Sourcery setup 11:17 Power Of Sourcery 13:22 Bash Script 15:02 Alias 15:46 Outro Sign up for Alex's upcoming video course about iOS System Design Interview: iosinterviewguid...
iOS Unit Testing 102 - Intro to Mocks
Просмотров 3362 года назад
In this episode Sandeep and Alex give an introduction to mocking in unit tests. They cover what are mocks, what do you need them for, and how to get started. Sign up for Alex's upcoming video course about iOS System Design Interview: iosinterviewguide.com/system-design-interview Need to prepare for an iOS Engineer Interview? iosinterviewguide.com Connect with us: insideiosdev Email ...
iOS Unit Testing 101
Просмотров 5342 года назад
Alex Bush and Sandeep Aggarwal give an introduction to unit testing on iOS. They explain how to setup unit tests in your iOS app and show a typical structure of a unit test. Prepping for an iOS system design interview? Sign up for Alex's upcoming video course about iOS System Design Interviews: iosinterviewguide.com/system-design-interview Need to prepare for an iOS Engineer Interview? iosinter...
Factory. Refactoring Large Initializer in Swift Part 2.
Просмотров 4743 года назад
In this episode Sandeep and Alex refactor a class with a large initializer into something easier to use. This is part two of this series. This time we are using factory design pattern. Sample code was taken from Fred’s tweet: frederickohen/status/1413595709471875072 Part one: ruclips.net/video/OgUtcCIqLSM/видео.html Refactoring Large Initializer Playlist: ruclips.net/p/PLTj5r2IIqcwi...
Refactoring Large Initializer in Swift Part 1. Dependency Injection & Default Values & Properties
Просмотров 9433 года назад
Refactoring Large Initializer in Swift Part 1. Dependency Injection & Default Values & Properties
Factories & Dependency Management with VIPER on iOS
Просмотров 1623 года назад
Factories & Dependency Management with VIPER on iOS
Typical VIPER vs Big Tech VIPER Implementation in iOS
Просмотров 3953 года назад
Typical VIPER vs Big Tech VIPER Implementation in iOS
2 Ways to Implement VIPER iOS Architecture with its author Jeff Gilbert
Просмотров 1,3 тыс.3 года назад
2 Ways to Implement VIPER iOS Architecture with its author Jeff Gilbert
Swift Optional String Or Empty Extension
Просмотров 4863 года назад
Swift Optional String Or Empty Extension
68 - iOS Interview Questions For Senior Developers in 2020 Part 2
Просмотров 7444 года назад
68 - iOS Interview Questions For Senior Developers in 2020 Part 2
67 - iOS Interview Questions For Senior Developers in 2020 Part 1
Просмотров 3,7 тыс.4 года назад
67 - iOS Interview Questions For Senior Developers in 2020 Part 1
Component Based & Protocol Based Dependency Injection with Daniel Hall
Просмотров 5955 лет назад
Component Based & Protocol Based Dependency Injection with Daniel Hall
Inside iOS Dev - 5 - Setting Up Universal Links
Просмотров 11 тыс.7 лет назад
Inside iOS Dev - 5 - Setting Up Universal Links
Inside iOS Dev - 3 - Unit Tests In Object Oriented Programming
Просмотров 2917 лет назад
Inside iOS Dev - 3 - Unit Tests In Object Oriented Programming
What kind of nonsense this all was?
I mean there is so many points of view
Can you please share how to analyse dev pods aswell?
Why can't we just have single source i.e from Storage... instead of 2 data source? The app takes data only from there and once data is available the storage data is updated?
:(
This isn't a very good example. It's too open ended. The customer class doesn't have an implementation making it difficult to decide which services are required. Regardless, the Customer class has too many responsibilities and would be better refactored further up the call hierarchy. For instance, the customer could be passed a context with the necessary data it requires.
That's not a good practice to pre-check internet connection because there's no reliable way to do that. From Apple: "Always attempt to make a connection. Do not attempt to guess whether network service is available, and do not cache that determination."
is any iOS developer still alive? Not many.
I develop iOS for Cisco.
Thank you. This is very helpful. Can you help to add the ruby script in my pre-commit hooks ?
If I have 2 weeks to do something and I have to work on messy code, I spend the first week refactoring. So I can easily fit the new stuff into the system in an easily testable way.
If you are refactoring messy code you are almost guaranteed to break something.
you are crooks selling development hours
I'm a simple man. I see Uncle Bob, I click.
Lots of if else , no use of proper design pattern. They should better learn and upgrade themselves first.
You do refactoring only after tests cover all functionality.
thank you~
Is anyone else having a bad time understanding Indian accent?
The podcast is super insightful. Thank you for conducting it Alex!🙂
Hard to listen to them . They have so bad English.
Hi, Thanks for the great video. One thing I wanted to check is that why can't we use NSURLCache here. It would be helpful even incase of pagination as it will just cache the api response against the URL and don't need to write any extra code for this. Is there any issue with that?
In the example you used with a viewController refreshing the view when the viewModel changes, absolutely the didSet was the proper way to go. However the root issue here is treating a ViewModel as just a struct with no logic. The reason for MVVM to be created was to move most of the logic typically found in a Massive View Controller outside of the view controller and into a ViewModel. A class dedicated to handling the logic and the update of the view.
perfect, thanks for the content
Next week I am starting to work on a new iOS project in Russia and they using RIBs, so I started to learn about it. You guys did great explanations, very appreciate this and I found that the main idea of RIBs is really interesting.
That’s awesome! Check out this video course I made about ribs too alexbush.podia.com/ribs-architecture-on-ios It’s free but unfortunately unfinished. Hope it helps even more.
great video, really appreciate it. BTW guys, can you please consider making part 2 of this video with additional 5-10 tips. PS: Paula naming the tip number with such enthusiasm adds another dimension to this video. 😂
Nice video to explain Mediator design pattern!
Great video!! Thanks for the info!
Checkout the implementation code on Github - github.com/Inside-iOS-Dev/AppDelegateMediator
Thank you a lot for this valuable idea i really see massive AppDelegates in many projects, so i'll try to implement this soon :)
Great Conversation, Thanks guys.
I just don’t get the part : for showing Pythm app we have to use delegate to get to appdelegate, why? Cant we just call “can open url”?
we can but that would be breaking single responsibility principle and utilizing an anti-pattern - singleton. Every "module" of your app, in our case viewmodel/viewcontroller combination, is responsible for one part of the app, i.e. screen. App delegate is the place we forced to use to receive incoming deeplink requests therefor it is natural to extend it to also route to other deeplinks/apps thus being consistent with its single responsibility. It can also keep track of context and relevant data for outgoing Paytm request in order to properly process future incoming request from it back into our app. If we call open url from another viewmodel/viewcontroller module in our app we lose track of that. It's a lot of boilerplate, unfortunately, but this approach likely will illuminate a whole set of bugs, issues, and inconsistencies you might have if you open url directly. There is an alternative approach, that I haven't thought of on our call, with having some sort of a manager/handler be a dependency of module that wants to communicate with Paytm. Potentially we can have AppDelegate broadcast any incoming deeplinks and data passed with them as a stream that the handler/manager subscribes to. Then when a specific module wants to open a deeplink and wait for a response from it it can just call openUrl but than sit and wait for the handler to "get a response"/i.e. to get a broadcast message from AppDelegate deeplinks stream. All of this is due to the nature of how UIKit was built and app delegate being the sole receiver of incoming deeplinks. We want to preserve single responsibility principle throughout our architecture as much as possible to make it more manageable, testable, and reusable.
@@InsideiOSDev singleton being an anti-pattern is highly arguable
Really Awesome
Hi Alex, thanks for sharing this and the related podcast; it has been super helpful and I'd like to apply it for a similar use case to the form example you shared. Say there is a model that is build over some period of time. Some of the information is returned from the server (e.g., the ID) and other information is populated from user input in a form. Before the user has competed filling the form and the final model object is built, does it make sense for the builder object to be the "source of truth" for the values displayed in the UI? For example, some view model uses the builder object to get the value of each model attribute, so that it can determine the string that should be displayed for that field in the form.
it does. this is a great use case for it! your relationship of objects is basically something like this in that case: UI/view/viewcontroller -> viewmodel -> builder object
you can even have multiple VMs use the same builder as a source of truth if needed. The builder essentially plays a role of collecting data over time, validating the input, assembling the model, being the source of truth.
Thanks 👏
How to pass the input parameters required to create the dependencies if it is required. Do we need to pass it as arguments to factory class?
That’s one option. Or you can pass them as params to the make method. Typically the rule of thumb is to pass other dependency objects with behavior via the constructor/initializer and data dependencies via the method params. The idea is that things that change less and are less dynamic will be set in the initializer and more dynamic things like user input that happened during runtime will be passed via the method params.
please show me how to generate mocks with generic methods
With pain bro
Waiting for more 🙋♂️
here is more ruclips.net/video/fMqkf1bb23k/видео.html
It sounds very much like the same kind of architectural approach as TCA.
never heard of it. are there are links to check out to read about it?
There are a lot of examples in a variety of languages including Swift on the website.
Yeah the website is pretty good.
I really dislike when people talk about architectural patterns like MV* , VIP or RIB as they are THE architecture of the app, I dislike even more when people claim that one self acclaimed architecture is superior to others.
Can you explain why you dislike it and how is RIBs not superior to every other mobile architecture out there?
@@InsideiOSDev I never heard about RIB before this video and I do not dislike RIB. I dislike looking at architecture as just applying some "one size fits all" pattern. All projects are different and no single architecture will be the best for all of them. Also thinking that architecture is something you can describe with an acronym just seem very naive to me, I honestly do not know any other developers than mobile developers who thinks of architecture as something you can simply solve by applying a pattern. I did like the video though.
Wow this is really nice topic. Would like to hear more on how swift ui works with rib architecture.
I’m looking forward to part 2 thanks guys
here it is ruclips.net/video/PT7Zsbl5G7U/видео.html
Related useful video about VIPER architecture: ruclips.net/video/EhsrS6vjuds/видео.html
Cool. And extension could be extended to cover for sequences.
Backend for mobile dev is a killer question. I don't have experience with this
yea, it's a tough one for mobile folks. I recommend looking into www.thoughtworks.com/en-us/insights/blog/bff-soundcloud samnewman.io/patterns/architectural/bff/ medium.com/tech-tajawal/backend-for-frontend-using-graphql-under-microservices-5b63bbfcd7d9 and martinfowler.com/articles/micro-frontends.html It will help you build better mobile apps as you'll have an appreciation of what's going in the backend and will just in general make you a more well rounded engineer.
@@InsideiOSDev thanks very much
Hi Alex, Why not use Swift's nil coalescing operator instead? e.g. let param2 = param2 ?? "" It avoids the if-let/else, the extra variable, and the extension.
yep! this extension is just a "nicety" for readability as you can chain things together with it such as: if someString.orEmpty().isEmpty where if you do coalescing operator you'd have to reserve to: if (someString ?? "").isEmpty neither is better or worse, just your own preference of readability. The idea for this extension method comes from Kotlin kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/is-null-or-empty.html
@@InsideiOSDev Hi Alex. Please pardon the delay getting back to you. Things have been busy, and good, here. The conventional Swift expression of isNilOrEmpty is someString?.isEmpty ?? truecertainly readability in some cases, it would help educate beginning Swift developers on Swift core language features as well as showing the value of extensions. But starting with a C-style if/else (Swift certainly can use if/else, but in this scenario it's an odd use), the beginning developer misses out on the opportunity to learn a core language feature and comes out with an idea that may lead to some odd code just because they don't understand part of the language, which is unfortunate. I hope this helps as you formulate your content and wish you the best.
I'm also an Android engineer, but find the content valuable. If there was some visual illustration to complement with the talk, that would make this extra nice. Anyway, thanks for sharing :)
there are illustrations and visuals about this in my course iosinterviewguide.com/system-design-interview I'm also starting to make more video episode where I screen share and show code or diagrams. Will be revisiting the topic of system design. Stay tuned.
Thanks for the video also nil coalescing operator works well let unwrappedparam2 = param2 ?? ""
true! this extension is just a "nicety" for readability as you can chain things together with it such as: if someString.orEmpty().isEmpty where if you do coalescing operator you'd have to reserve to: if (someString ?? "").isEmpty neither is better or worse, just your own preference of readability. The idea for this extension method comes from Kotlin kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/is-null-or-empty.html
Nice video! A little correction String is a struct not a class. Thank you for the video! It’s very useful!
thanks for sharing. very useful!
Glad it was helpful!
It'll be really great if you can create your video with example videos like this. I've found so many good tutorials on your youtube channel. really good.
yea. That's the goal. it takes a lot of time to produce the videos but ultimately I want to switch to that format instead of just the audio.
here's another video like this! ruclips.net/video/OgUtcCIqLSM/видео.html