⌘ kean.blog

Best Resources for iOS Engineers

  

Last week, I made a poll on Twitter asking to share the best learning materials for iOS engineers and was overwhelmed with the number of responses. It was very insightful, and I thought it would be nice to compile the results into a single post, which I did here, adding a few recommendations of my own.

There were a couple of outliers that got an absolutely massive number of recommendations.

Standford: CS193p - Developing App for iOS #

Beginner, Free

The Stanford University’s course CS193p was by far the most recommended resource. I went through the first few videos myself and was blown away by how packed they are with information.

There are a couple of things to note about this course:

  • It focuses on SwiftUI. We are still in the transition period where most companies still use UIKit, but it’s already worth investing time into SwiftUI. And you learn much more than just SwiftUI in this course.
  • The course’s primary target audience is students, and it assumes they are familiar with programming fundamentals. If you are learning programming from scratch, you might want to consider going through other resources first. Having said that, the best way to learn programming is by building things.

100 Days of Swift #

Beginner, Free

The second most recommended course is 100 Days of Swift. And it’s not the only resource on Hacking with Swift by Paul Hudson. There is a similar course on SwiftUI – 100 Days of SwiftUI, and there are a ton of other articles and videos.

Unlike Standford’s course, 100 Days of Swift focuses not on app development, but on Swift itself. If you are just starting learning programming, this course is for you.

Udemy - The Complete iOS App Development Bootcamp #

Beginner, Paid

It seems uncommon for a paid course to get a lot of recommendations, but this one is an exception and it made the shortlist. I wasn’t able to check it out myself, but if you look at the course’s content, it does look complete. I think right now it might be a better option than Standford’s CS193p if you want to focus on the current technologies, such as UIKit.

Ray Wanderlich #

Beginner/Indermediate, Free/Paid

This site doesn’t need an introduction. I often find myself using it in my daily work. Ray Wanderlich is the go-to place for finding tutorials on specific topics. But it has more than that. It also has courses, videos, articles, and even books. If there is an iOS topic you are interested in, chances are you’ll find it on this site.

First-Party Resources #

I’m surprised nobody linked official Apple documentation in the thread. If I made this poll 6-8 years ago, I’m sure a lot of people would’ve jumped in the thread recommending it. Today, there are a ton of third-party resources that can oftentimes be better than what Apple provides. But despite that, the Apple documentation will always be my primary source of all the information on Apple technologies.

  • Apple WWDC videos – probably the main source for me. You can often find information not available anywhere else. It’s a bit unfortunate because finding what you are looking for in a video can be time-consuming.
  • Apple Developer documentation – not quite as good as it used to be, but is still a valuable resource
  • Apple Tutorials: Develop Apps for iOS – Apple recent venture in the tutorial-creation business. I went through these tutorials and they are well made and informative, but a bit dry.
  • The Swift Programming Language – reading this book is how I learned Swift. It’s a concise and well-written book and is a must-read. You can learn through it instead using a course.
  • Swift Evolution – the programming guide doesn’t cover everything and sometimes the best source of information on the newest Swift features can be the Swift Evolution proposals
  • Human Interface Guidelines (HIG) – design is a major part of iOS development and engineers are often relied on to provide their input. This is a must-read resource for any Apple engineer.
  • Apple Developer News and Updates – add it to your RSS reader to learn about the latest updates on the platforms. For example, about deadlines to switching to new Xcode vresions or SDKs.
  • Swift Forums – if you want to keep be up to date with the latest proposals or even participate in discussions

There are so many technologies on Apple platforms that you can’t just go and preemptively learn everything. It’s best when you have a project and you have a need. When you have a need, you have all the motivation you need to study something. Writing an article can also be a good motivator.

Other Recommendations #

I received a ton of recommendations in the original poll. Here I’m going to list the ones that didn’t make the shortlist, in no particular order. A word of caution – Apple platforms are constantly evolving, make sure what you are reading is up-to-date.

I’d like to add a couple links myself: iOS Dev Weekly, NSHipster, Use Your Loaf, Cocoa with Love, Little Bites of Cocoa, Krzysztof Zabłocki, Ole Begemann, Increment.

Software Engineering #

There is more to software engineering than learning a programming language and a platform you are working on. If you want to get a competitive advantage among other engineers, especially if you don’t have a CS degree, invest time in learning the fundamentals. The good news is that degrees are overrated – you can learn everything they do and more by yourself. It’s not like you need any special equipment or anything.

An incomplete list of everything that you should consider learning (in no particular order):

  • Git. There are a ton of resources on Git, but I found Pro Git to be the most insightful.
  • Release and Branching Strategies. I think Trunk-Based Development is hands down the best branching strategy, especially for larger teams.
  • Algorithms and Data Structures. There are many ways to learn them. I like The Algorithm Design Manual, Steven Skiena and Introduction to Algorithms, Thomas H. Cormen. The former is more approachable.
  • Terminal and Bash. For me, Swift largely replaced Bash as a scripting language of choice, but I still find myself using Bash often enough. Regardless of your choice, it’s also always worth learning regex.
  • Concurrency and Reactive Programming. Concurrency is hands down the most challenging aspect of UI development, and there are a ton of things to learn: Swift Structured Concurrency, Combine, parallel programming, synchronization mechanisms, threading. It’s hard, but it comes with practice.
  • Databases. Learn the basics of relational databases, Core Data, try using SQLite directly, and you are mostly set as far as mobile development goes.
  • Continuous Integration and Delivery. It’s not just the tools, it’s the practice. You can learn a lot about it by reading Martin Fowler’s articles. If you want to dive deeper, there are a few good books available too. But it’s also tools. On iOS, it largely means learning Fastlane and a CI/CD tool of your choice. You can start by creating a sample project on GitHub and setting up a simple pipeline using GitHub Actions.
  • Functional Programming. It’s finally mainstream. If you use Swift, you are already using functional programming. But Swift isn’t a pure functional language and it can be a lot of fun learning one. I recommend Structure and Interpretation of Computer Programs (Lisp version) or Haskell (probably the most well-established and well-documented pure functional language out there).
  • Software Networking. Almost every app uses networking. You generally don’t need to know anything beyond basics HTTP and JSON, but it’s a lot of fun learning how it actually works under the hood. I suggest learning the basics of the networking protocols: TCP/IP, DNS, go through the HTTP specs. Tools like Charles allow you to inspect network traffic. Wireshark can help you learn network protocols. Postman is the best tool to explore and test APIs. OpenAPI is how you document the APIs.
  • Best Practices. I think “best practices” often do more harm than good, especially taken to the extreme. But they can still be valuable. I would suggest going through Code Complete by Steve McConnel and skipping everything else.
  • Processes. Atlassian has a pretty good guide on Agile.
  • Soft Skills. This is probably more important than half of the list. I don’t think there is a shortcut to learning them. You have to practice and always pay close attention to what you are doing. Reading the following books can give you some valuable insights about this side of engineering: The Pragmatic Programmer, The Mythical Man Month, Herding Cats, The Five Dysfunctions of a Team.

This list is far from being complete. There are a variety of specializations in software engineering. You can learn anything if you put your mind to it. I think adding new perspectives is valuable. For example, if you are a mobile engineer, it doesn’t mean that you can’t explore a bit of backend development to expand your perspective (especially now that’s it can be done in Swift).

Interviews #

So you learned everything about iOS and software engineering, now you are done, right? Not quite. There is software engineering, and there are software engineering interviews. There is some intersection between the two, but completing coding challenges on an interview is very different from what you typically do at work.

The main difference is speed. Not only do you need to be quick to be able to complete a task within a given timeframe, but you also need to explain your thinking to the interviewer, making it even more complicated. So it’s crucial to set a timer when you are preparing and optimize for speed and practice explaining what you are doing.

Fortunately, there are a ton of tools to help you prepare for interviews. The gold standard is Cracking the Coding Interview, this is hands down the best resource that can help you prepare. I would also recommend leetcode. Another great resource is Tech Interview Handbook. Passing interviews is a special skill and you need to allocate time into learning it unless you want to miss out on some opportunities.

Final Thoughts #

Everyone’s path in software engineering is different. It’s highly technical and it requires a ton of time investment. But it can also be extremely rewarding and fun. I hope you’ll find some of the resources from this post useful and they’ll inspire you to learn something new!

If you have any suggestions to the list, feel free to open a PR on GitHub or reach out to me on Twitter. I intend on keeping this post up-to-date.