原文:Best Resources for iOS Engineers @Alex Grebenyuk
上周,我在 Twitter 上发起了一个投票,要求分享 iOS 工程师的最佳学习资源,结果得到了大量的回应。它非常有洞察力,我想着把这些结果总结成一篇文章可能会很好,我就这样做了,并添加了一些我自己的建议。
最受欢迎
有几个列表得到了大量的推荐。
Standford: CS193p - Developing App for iOS
B站视频:【中文字幕】斯坦福(Stanford)Swift 语言教程 iOS 11 开发 苹果公司 编程 CS193P
初学者、免费
斯坦福大学的 CS193p 课程是迄今为止最值得推荐的资源。我自己看了前几个视频,被它们的信息量所震撼。
关于该课程,有几件事情需要注意:
- 它专注于 SwiftUI。由于大多数公司仍在使用 UIKit 方案,所以它仍然处于过渡期,但已经值得在 SwiftUI 上投入时间。而且你在本课程中学习到的东西远远不止 SwiftUI。
- 本课程的主要目标群体是学生,并且假定他们熟悉编程基础。如果你要从头开始学习编程,你可能要考虑其他资源。说到这里,学习编程的最好方法是尝试编译一些东西。
100 Days of Swift
初学者、免费
第二大推荐的课程是 100 Days of Swift。而且这并不是 Paul Hudson 在 Hacking with Swift 上的唯一资源。在 SwiftUI 方面也有类似的课程——100 Days of SwiftUI,而且还有大量的其他文章和视频。
与 Standford 的课程不同,100 Days of Swift 关注的不是应用程序开发,而是 Swift 编程语言本身。如果你刚开始学习编程,这个课程适合你。
Udemy - The Complete iOS App Development Bootcamp
初学者、收费
一个付费课程得到大量推荐似乎并不常见,但这个课程是个例外,它进入了候选名单。我没能亲自去看,但如果你看一下课程的内容,它确实看起来很完整。我想现在,如果你想专注于当前的技术,比如 UIKit,它可能是比斯坦福的 CS193p 更好的选择。
Kodeco
译者注:Kodeco 这个网站以前叫 Ray Wanderlich。
初学者/入门者、免费/收费
这个网站不需要过多介绍。我经常发现自己在日常工作中使用它。Kodeco 是你寻找特定主题教程的首选之地。但它的内容不止于此。它还有课程、视频、文章,甚至书籍。如果你有感兴趣的 iOS 主题,你有可能在这个网站上找到它。
官方资源
我很惊讶没有人在话题中提及苹果的官方文档。如果我在 6-8 年前做这个投票,我相信很多人都会跳出来推荐它。今天,有大量的第三方资源,往往比苹果提供的更好。但尽管如此,苹果文档将永远是我获得苹果技术所有信息的主要来源。
- Apple WWDC videos - 可能是我的主要来源。你经常可以找到其他地方没有的信息。遗憾的一点是,想要在视频中找到你要找的东西可能很费时间。
- Apple Developer Documentation - 不像以前那么好了,但仍然是一个宝贵的资源。
- Apple Tutorials: Develop Apps for iOS - Apple 最近在教程创作领域的尝试。我浏览了这些教程,它们制作精良,内容丰富,但有点枯燥。
- The Swift Programming Language - 阅读这本书是我学习 Swift 的主要方式。这本书简洁明了,写得很好,是一本必读的书。你可以通过它来学习,而不是使用课程。
- Swift Evolution - 编程指南并不涵盖所有内容,有时关于 Swift 最新功能的最佳信息来源可能是 Swift Evloution。
- Human Interface Guidelines (HIG) - 设计是 iOS 开发的一个主要部分,工程师们经常被依靠来提供他们的意见。这是所有苹果工程师必读的资源。
- Apple Developer News and Updates - 添加到你的 RSS 阅读器,以了解平台上的最新更新。例如,关于切换到新的 Xcode 版本或 SDK 的最后期限。
- Swift Forums - 如果你想了解最新的建议,甚至想参与讨论,请联系我们。
Apple 平台上有这么多技术,你不可能去未雨绸缪地学习一切。最好是你有一个项目,你有一个需求。当你有需求的时候,你就有了学习某种东西的所有动力。写文章也可以是一个很好的动力。
其他推荐
在最初的投票中,我收到了大量的推荐。在这里,我将列出那些没有入围的作品,没有特别的顺序。需要提醒的是——Apple 平台在不断发展,请确保你所阅读的内容是最新的。
- objc.io
- Donny Walls’s blog and books
- Point·Free
- The Ultimate Kickstart Bundle
- Flightschool
- Swift by Sundel
- SwiftLee
- Let’s Build that App
- NSScreencast
- Big Nerd Ranch
- Sean Allen
- Essential Developer
- App Coda
- Matt Neuburg’s books
- designcode.io
- Chris Ching’s courses
- Develop in Swift Data Collections
- Swiftful Thinking
- Azam on Udemy
- Vincent Pradeilles
- Stewart Lynch
- Mark Moeykens
- Ben Scheirman
- Learn to Build iOS Apps
我想自己补充几个链接:iOS Dev Weekly, NSHipster, Use Your Loaf, Cocoa with Love, Little Bites of Cocoa, Krzysztof Zabłocki, Ole Begemann, Increment.
软件工程师
软件工程不仅仅是在你工作的平台上学习一门编程语言。如果你想在其他工程师中获得竞争优势,尤其是在你没有 CS 学位的情况下,请投入时间学习基础知识。好消息是,学位被高估了 - 你可以自学这一切,甚至更多。你也不需要任何特殊的设备或其他东西。
以下是一个不完整的清单,列出了你应该考虑学习的一切(没有特定的顺序)。
- Git。关于 Git 的资源有一大堆,但我发现 Pro Git 是最有见地的。
- 发布和分支策略。我认为 Trunk-Based Development 是最好的分支策略,特别是对于大型团队。
- 数据结构和算法。有很多方法可以学习它们。我喜欢 The Algorithm Design Manual 和 Introduction to Algorithms。前者更加平易近人。
- 终端和 Bash。对我来说,Swift 在很大程度上取代了 Bash 作为首选的脚本语言,但我仍然发现自己经常使用Bash。不管你的选择如何,学习 Rgex 也是值得的。
- 并发和响应式编程。多线程是 UI 开发中最具挑战性的方面,而且有大量的东西需要学习。Swift Structured Concurrency、Combine、并行编程、同步机制、线程。这很难,但它是随着实践而来的。
- 数据库。学习关系型数据库的基础知识, Core Data,尝试直接使用 SQLite,就移动开发而言,你基本已经准备好了。
- 持续集成和交付。这不仅仅是工具,也是一种实践。你可以通过阅读 Martin Fowler 的 articles 了解到很多。如果你想深入了解,也有几本 书籍 可以看。但这也是工具。在 iOS 上,这主要意味着学习 Fastlane 和你选择的 CI/CD 工具。你可以先在 GitHub 上创建一个示例项目,并使用 GitHub Actions 设置一个简单的管道。
- 函数式编程。它终于成为了主流。如果你使用 Swift,你已经在使用函数式编程。但是,Swift 并不是一种纯粹的函数式语言,而且学习这种语言会有很多乐趣。我推荐 Structure and Interpretation of Computer Programs (Lisp version) 或 Haskell(可能是目前最成熟、文档最完善的纯函数式编程语言)。
- 网络开发。几乎每个应用程序都会使用网络。除了基本的 HTTP 和 JSON 之外,你一般不需要知道其他东西,但学习它的底层实际上是如何工作的会很有趣。我建议学习网络协议的基础知识。TCP/IP,DNS,通过 HTTP 规范的学习。像 Charles 这样的工具可以让你检查网络流量。Wireshark可以帮助你学习网络协议。Postman 是探索和测试 API 的最好工具。OpenAPI 是你记录 API 的方式。
- 最佳实践。我认为 “最佳实践” 往往弊大于利,尤其是走到极端。但它们仍然是有价值的。我建议阅读史蒂夫-麦康奈尔(Steve McConnel)的 Code Complete,而跳过其他的东西。
- 流程。Atlassian 有一个相当好的关于 Agile 的指南。
- 软技能。这可能比清单上一半的内容更重要。我不认为学习它们有什么捷径。你必须练习,并始终密切关注你正在做的事情。阅读以下书籍可以给你一些关于工程这一方面的有价值的见解:实用主义程序员(The Pragmatic Programmer), 人月神话(The Mythical Man Month), 驾驭野猫(Herding Cats), 团队的五大机能障碍(The Five Dysfunctions of a Team)。
这个列表远非完整。软件工程有各种各样的专业。只要你用心,你可以学到任何东西。我认为增加新的视角是有价值的。例如,如果你是一名移动端工程师,这并不意味着你不能探索一下后台开发以扩大你的视野(尤其是现在可以用 Swift 来做)。
面试
所以你学会了关于 iOS 和软件工程的一切,现在你已经完成了,对吗?并非如此。有软件工程,也有软件工程面试。两者之间有一些交集,但在面试中完成编码挑战与你通常在工作中所做的非常不同。
主要的区别是速度。你不仅需要快速,能够在给定的时间内完成任务,而且还需要向面试官解释你的想法,这就更加复杂了。因此,在准备时设置一个计时器,优化速度并练习解释你正在做的事情是至关重要的。
幸运的是,有大量的工具可以帮助你准备面试。黄金标准是 Cracking the Coding Interview,这是最好的资源,可以帮助你准备。我也会推荐 leetcode。另一个伟大的资源是 Tech Interview Handbook。通过面试是一项特殊的技能,你需要分配时间来学习它,除非你想错过一些机会。
最后的思考
每个人在软件工程方面的道路都是不同的。它是高度技术性的,需要大量的时间投入。但它也可以是非常有价值和有趣的。我希望你会发现这篇文章中的一些资源是有用的,它们会激发你去学习新的东西!