Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to become an iOS wizard #20

Open
ahmedrezik opened this issue Jul 14, 2020 · 1 comment
Open

How to become an iOS wizard #20

ahmedrezik opened this issue Jul 14, 2020 · 1 comment
Labels
question Further information is requested

Comments

@ahmedrezik
Copy link

No description provided.

@ahmedk92
Copy link
Owner

Hi Ahmed, Thank you for dropping by.

I think you meant to open this issue here instead, but it's ok ☺️

I think the question is too broad. I'm not sure if I can define what an 'iOS wizard' is, but I'll assume you mean how to be a better iOS developer, and maybe keep getting better.

I'll just skim through concepts and skills by name. How you feel confident reading each of those is your guide. I originally intended to go into some detail in each, but that would take so long. So, maybe we can open discussions for each one if needed.

In no particular order:

Swift

  1. Value types vs reference types.
  2. Memory management (reference counting, weak/strong/unowned, what are retain cycles and how to break them).
  3. Closures (what is @escaping and capture semantics).
  4. Enums (raw types, associated values, CaseIterable, indirect enums).
  5. Computed properties.
  6. Default arguments.
  7. Type inference.
  8. Generics.
  9. Opaque return types (reverse generics).
  10. Access modifiers (why gradual access from private to open is a good thing).
  11. Protocols (protocol with associated types, conditional conformance, limiting conforming types, limiting to reference types with AnyObject).
  12. Extensions (extending generic types conditionally).
  13. Higher-order functions (map, flatMap, reduce, filter, ...etc, why use these instead of loops?)
  14. Optionals (reducing optionals).
  15. Method dispatch (static, dynamic, table).
  16. ObjC interoperability.
  17. Codable.
  18. Immutability (why it's a good thing, why let is preferred over var when possible).
  19. The standard library (important collection types: Array, Dictionary, Set, String, Slices, Ranges)
  20. Subscripts.
  21. Custom operators.
  22. Switch and pattern matching.
  23. Result<T, E: Error>
  24. Throwing functions (throws, rethrows, do, try, catch).
  25. Self-executing closures (what are they, what are their uses?).
  26. Lazy variables.
  27. Lazy sequences.
  28. Type erasure.
  29. Property observers.

Objective-C

  1. Swizzling.
  2. Selectors.
  3. atomic vs nonatomic.
  4. Categories.
  5. Runtime (objc_setAssociatedObject and objc_getAssociatedObject ).
  6. KVO and KVC.

Foundation

  1. Data.
  2. Working with date and time (Date, Calendar, DateComponents, TimeInterval).
  3. Formatters and Locale (DateFormatter, NumberFormatter).
  4. UserDefaults.
  5. NSUbiquitousKeyValueStore.
  6. URL.
  7. URLSession.
  8. Timers.
  9. NotificationCenter.

UIKit

  1. Auto Layout (layout anchors, priorities, UILayoutGuide, compression resistance, hugging priorities, intrinsic content size).
  2. Interface Builder (XIBs, Storyboards, IBDesignable).
  3. Programmatic UI.
  4. UIStackView (distribution, alignment, how to minimize constraints by using stack views, how to show/hide views by using isHidden properties of views embedded in stack views).
  5. UITableView (avoiding cell reuse issues, self-sizing cells).
  6. UICollectionView (custom layouts).
  7. Splitting view hierarchy into multiple focused view controllers.
  8. Container view controllers (UINavigationController, UITabBarController, UIPageViewController, ...etc).
  9. Custom view controller presentations.
  10. Custom view controller transitions (UIPercentDrivenInteractiveTransition).
  11. Manual layout (overriding layoutSubviews and manually calculating frames).
  12. Simple animations (UIView.animate(withDuration) and co.).
  13. Subclassing UIView (override draw(_:) or utilize Core Animation layers? see Core Graphics and Core Animation sections).
  14. Subclassing UIControl.
  15. Gesture recognizers.
  16. What is point(_ inside:)? When do we need this?
  17. Working with scroll views (scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)) and pagination.
  18. CGAffineTransform.

Core Graphics

  1. What is a graphics context?
  2. Filling rectangles and drawing shapes with paths.
  3. Off-screen rendering (drawing NSAttributedString to image contexts, and building bitmaps of complex hierarchies in advance for performance gains).

Core Animation

  1. Drawing non-rectangular views with CAShapeLayer.
  2. CAGradientLayer.
  3. Drawing vast areas asynchronously with CATiledLayer.
  4. Syncing with screen refreshes with CADisplayLink.
  5. Masking (drawing holes) with CALayer and co.
  6. Animation classes (CABasicAnimation, CAKeyframeAnimation).

Concurrency

  1. Why go concurrent? for speed? for responsiveness? for both?
  2. What is the significance of the main thread?
  3. Serial and concurrent queues.
  4. DispatchQueue.sync vs DispatchQueue.async.
  5. What is thread safety? how to achieve it? is it worth it every time?
  6. What is locking? why we needed it? how to lock resources? does it introduce other problems? what is a deadlock?
  7. What is priority inversion? how can it happen? how to avoid it?
  8. What is DispatchGroup? it it relevant in the presence of FRP frameworks? (for FRP see later sections).

Persistence

  1. When does UserDefaults stop being a good persistence solution?
  2. What Core Data is good for? is it a general purpose database?
  3. Is sqlite still relevant? are you familiar with relational databases?
  4. CloudKit integration.

Patterns

  1. Delegation
  2. DataSource
  3. Observers

Anti-Patterns

  1. Why singletons are dangerous?

Concepts and Paradigms

  1. Functional programming.
  2. (Functional-)Reactive programming.
  3. Why use functional-reactive programming frameworks opposed to custom-tailored observers or NotificationCenter.
  4. Protocol-oriented programming.
  5. Why string-typing is bad? What can we do to limit it?
  6. Composition over inheritance? and why?

Architectures

  1. MVC (what went wrong with Apple's MVC?)
  2. MVP, MVVM, VIP, VIPER. What do they solve? how do they differ? what do you prefer and why?

Build

  1. CocoaPods. Is it only for using libraries? can we split our projects into private pods? (same for Swift Package Manager)

Testing

  1. Pyramid of testing (unit, integration, and UI/end-to-end tests).
  2. What is code coverage? why is it important? is it really important?
  3. What is the purpose of unit testing if we're not testing real data?
  4. What is mocking? why some people don't like it?
  5. How to test async code?

CI/CD

  1. What?
  2. Why?

Debugging

  1. Breakpoints, step over, step into, step out, backtrace.
  2. Are you familiar with lldb commands?
  3. Do you use Objective-C exception breakpoints/Swift Errors/Symbolic break points?
  4. Do you use Xcode's View hierarchy debugger?

Git

  1. What?
  2. Why?
  3. How do you organize your branches? What do you think about GitFlow?

How to broaden your knowledge

  1. Browse top voted iOS-related Stack Overflow questions. Read every answer and comment. Take your time.
  2. Browse the Swift forums often.
  3. Follow some newsletters (iOS Goodies, iOS Dev Weekly, Swift Weekly Brief)
  4. Follow popular iOS-related blogs (Swift By Sundell, Hacking with Swift, NSHipster, ObjC IO, ...etc).
  5. Watch WWDC videos.
  6. Watch top conferences talks.
  7. Read open source code (begin with the libraries you use). Read issues and discussion between contributers.

Hone your skills

  1. Write code every day. If not possible: think about code every day.
  2. If you find a problem in an open source library you use, investigate it, and submit a PR when you reach a solution.
  3. Try to engage with the iOS community and maybe help answers other people's questions.

@ahmedk92 ahmedk92 changed the title How to become an iOS wizard How to become an iOS wizard (Reader Submitted) Jul 22, 2020
@ahmedk92 ahmedk92 added the question Further information is requested label Jul 24, 2020
@ahmedk92 ahmedk92 changed the title How to become an iOS wizard (Reader Submitted) How to become an iOS wizard Jul 24, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants