Одним из часто повторяющихся вопросов, который задают читатели моего блога, является вопрос о том, с чего начать, если хочется заниматься iOS-разработкой; что посмотреть, что почитать на эту тему. В этой заметке мы обстоятельно рассмотрим ответ на этот вопрос.

Зачем мне учиться программировать под iOS?

Для начала давайте ответим на вопрос “а зачем оно вообще мне надо?”. Очевидно, что изучение даже основ программирования может занять значительное время, которое можно было бы потратить на что-то другое. Так зачем же вообще учиться программировать под iOS? На мой взгляд, есть, минимум, две весомые причины, по которым стоит этим заняться:

Во-первых, это интересно. Особенно это интересно, если у Вас есть устройство от яблочной компании - представьте себе ощущение, что Вы можете достать из кармана телефон и показать своим друзьям своё собственное приложение, делающее что-то полезное (или бесполезное).

Во-вторых, за это хорошо платят. В настоящее время на рынке труда наблюдается дефицит хороших программистов для платформы iOS. Сама же платформа постоянно обрастает новыми возможностями и устройствами: с момент релиза iOS, как операционной системы первого iPhone, количество устройств работающей на этой операционной системе пополнилось не только планшетами iPad, но и часами Apple Watch, а также мультимедийной приставкой Apple TV. Для всех этих устройств уже можно писать программы! Одним словом, как я уже отмечал в своей заметке o перспективах iOS-программистов перспективы трудоустройства программистов для этой платформы самые радужные.

Что выбрать: кросс-платформенную или нативную разработку?

Надо признать, идея разработки мобильного приложения сразу для нескольких платформ (например, для iOS и Android), на первый взгляд, выглядит весьма заманчиво: пишешь код один раз, а он потом работает везде. Особенно этой идеей любят увлекаться руководители фирм или структурных подразделений компаний, которые (особенно в условиях кризиса) постоянно ищут пути сокращение издержек. Казалось бы, вот она - экономия: платишь один раз, а работает сразу на нескольких платформах! По крайней мере, в теории.

На практике, к сожалению, всё совсем не так. Не случайно говорят, что “скупой платит дважды”. И мой собственный опыт работы с кросс-платформенными решениями и рекомендации “ведущих собаководов”, работающих в отрасли профессиональной разработки мобильных приложений, однозначно свидетельствует о том, что кросс-платформенная разработка подходит только для очень простых приложений, и то не всегда. Как только у Вас или у Вашего начальства/клиентов/инвесторов возникает желание сделать что-то, что хотя бы немного выходит за рамки возможностей кросс-платформенного решения, начинаются большие проблемы и пляски с музыкальными инструментами народов Севера. В лучшем случае удаётся решить проблему написанием нативного кода для каждой отдельной платформы, который потом неким образом интегрируется в кросс-платформенное решение. В худшем - приложение переписывается для каждой платформы нативными средствами, при этом тратятся время и деньги. Таким образом, кросс-платформенная разработка не избавляет от необходимости знать, как разрабатывать приложения для каждой из поддерживаемых платформ.

Иными словами, я настоятельно не рекомендую начинать знакомство с iOS с кросс-платформенной разработки. Если же выбора у Вас нет, то из собственного опыта могу посоветовать для разработки игр обратить внимание на Unity, а для разработки неигровых приложений - на Xamarin, купленный на днях корпорацией Microsoft. Эти два решения лучше всего подходят для кросс-платформенной разработки. Всяческие Титаниумы и Фонгэпы рекомендую обходить стороной - наберётесь седых волос работать с ними.

Что нужно, чтобы начать

Для начала изучения iOS-разработки необходимо несколько стартовых условий:

1. Наличие устройства, на котором Вы будете вести разработку: Mac или, на худой конец, Хакинтош, на которые надо будет установить Xcode из Apple App Store. К сожаление, для Windows Xcode пока не выпустили, и у меня мало надежды, что он когда-либо появится. Я настоятельно рекомендую использовать Мак, а не Хакинтош, поскольку с Хакинтошем неизбежно возникнет много проблем, причём ещё на этапе его создания. Мак же подойдёт практически любой, самый бюджетный вариант - Mac Mini в минимальной комплектации, этой машинки вполне хватит для разработки мобильных приложений для iOS.

Некоторое время назад я уже описывал процесс установки Xcode на Windows с использованием Хакинтоша, однако с тех пор прошло много времени, поэтому при выборе варианта Хакинтоша, рекомендую искать более свежие инструкции в Интернете, обе мои заметки устарели.

2. Знание английского языка хотя бы на уровне чтения технической литературы. iOS-разработка весьма динамична: новая версия iOS выходит каждый год (на момент написания данной заметки актуальна iOS 9). Из-за такой частоты обновления, хорошие книги по этой области программирования просто не успевают переводить на русский язык: пока книгу пишут и переводят, выходит новая версия iOS. Во многом поэтому качественной литературы на русском языке по теме совсем немного, чуть далее я укажу основные книги, на которые стоит обратить внимание.

Отсюда и требование к знанию английского: почти всё по теме - документацию от Apple, книги, тематические блоги - хороший iOS-разработчик читает на английском языке.

3. Для запуска приложений на устройстве, необходимо иметь это самое устройство, например, iPhone или iPad. Когда я начинал заниматься iOS-разработкой для запуска своих приложений на устройстве необходимо было стать зарегистрированным разработчиком и заплатить Apple 99 долларов (платятся ежегодно). С 2015 года платить стало не обязательно, но зарегистрироваться всё равно придётся. Подробнее об этом можно узнать на портале разработчиков в разделе Apple Developer Program.

Не обязательным, но крайне желательным является наличие предыдущего опыты программирования. Мобильная разработка имеет некоторую специфику по сравнению с императивным программированием на языках, которые, обычно, преподаются в школе. Например, новичку может быть совсем не очевидно, что все программы для смартфонов упрощённо представляют собой набор call-back функций: операционная система при наступлении определённых событий посылает программе сообщения, на которые программа и реагирует кодом, написанным мобильным разработчиком. Кроме того, обычно большая часть типовых задач, которые могут встать перед разработчиком, уже реализована в стандартных библиотеках (в нашем случае - Foundation, UIKit, и т.д.), новички же в силу отсутствия опыта, могут начать изобретать свои “велосипеды” вместо использования функционала этих стандартных библиотек.

Objective-C или Swift?

Если Вы начинаете изучать iOS-разработку сегодня, я бы рекомендовал изучать сразу Swift. Несмотря на то, что сама Apple не торопится переводить свои приложения на Swift, значительное количество серьёзных разработчиков уже перешли на него. После почти года разработки на Swift мне этот язык представляется гораздо более удобным и выразительным, чем Objective-C.

Заметьте, я не сказал, что он легче в изучении. В отличие от своего предшественника, Swift позволяет писать в более функциональном стиле, что для людей, знакомых с императивным подходом в программировании, может показаться сложным. Кроме того, Swift обладает более внушительным набором языковых конструкций, чем Objective-C, на его изучение может уйти больше времени. Хорошая новость, однако, состоит в том, что порог вхождения в Swift довольно низок, начать программировать на нём проще, чем на Objective-C.

Кому стоит изучать Objective-C? Если Вы уверены, что на текущем или новом месте работы Вам придётся поддерживать большое количества legacy-кода, написанного на Objective-C, то в этом случае его изучение может принести Вам пользу. Не будем забывать, что программисты на Фортране до сих пор в цене из-за существования корпоративных систем, написанных на этом языке. Полагаю, что то же самое мы будем наблюдать и через 10-15 лет с программистами, знающими Objective-C.

Книги

Начать процесс знакомства с iOS-разработкой я бы посоветовал с сайта от Apple Start Developing iOS Apps with Swift. Сайт предлагает набор последовательных туториалов по построению несложных iOS приложений и прекрасно объясняет, как устроен язык Swift, из чего состоит типичное приложение, как работать с графическим интерфейсом приложения и т.д. Также в конце предлагается список литературы для дальнейшего изучения касательно подготовки приложений к публикации в App Store, работе с различными фреймворками и прочими интересными вещами.

У меня было две книги, одну из которых я могу порекомендовать: iOS 6 SDK. Разработка приложений для iPhone, iPad и iPod touch Это очень старая версия, рекомендую по возможности найти обновлённое издание для iOS 9. С одним из авторов - Джеком Наттингом, я знаком лично, он живёт в Стокгольме. Так же рекомендую читать эту книгу, как и остальную документацию/книги, на языке оригинала, т.е. на английском - в русском переводе могут быть неточности, опечатки и прочие проблемы.

Также мне весьма понравилась книга от Аарона Хиллегасса и Джо Конвэя Программирование под iOS. Для профессионалов. Эта книга основана на популярном курсе от Big Nerd Ranch - одного из двух наиболее известных в iOS среде образовательных проектов (второй - Ray Wenderlich). Книжка последовательно поясняет, как устроен Objective-C, как работать с контроллерами представление, Core Data, геолокацией и прочими необходимыми вещами. Из недостатков - книга в настоящее время устарела, ищите более свежее издание.

Кстати говоря, англоязычные книги как от Big Nerd Ranch, так и от Рея Вендерлиха, также настоятельно рекомендую.

Видео

Из видео могу рекомендовать ежегодный курс iOS разработки в iTunes U от Стэнфордского университета. На момент написания этой заметки доступна эта итерация для iOS 8 (когда я начинал изучать iOS-разработку, они преподавали iOS 5).

В случае с Swift курсы и книги могут содержать несколько устаревшую информацию, поскольку язык активно развивается и, периодически, новые версии языка ломают совместимость со старыми. Необходимо просто иметь это в виду, и, если что-то описанное в книги или видео не получается сделать, поискать ответ в Интернете.

Если Вы знаете хороший видео-курс (или книгу), помимо перечисленных здесь, напишите мне, я добавлю его в список.

Тематические блоги

Вокруг iOS-разработки за более, чем десятилетие её существования сложилось большое дружное коммьюнити, поэтому совершенно не удивительно, что существует значительное количество блогов с качественной информацией по теме. Перечислим лишь некоторые из них. Обращаю особое внимание, что перечисленные блоги будут интересны скорее разработчикам с некоторым опытом разработки для iOS, а не совсем новичкам.

  • NSHipster - блог, созданный Мэттом Томпсоном, в настоящее время имеет и других контрибьюторов. Имеет солидную базу статей касательно фреймворков, объектов стандартных фреймворков, Objective-C, Swift, Xcode, open-source проектов, включая CocoaPods, ReactiveCocoa, AFNetworking, Alamofire и прочего другого.

  • Natasha The Robot - отличный блог от Наташи Мурашевой (Natasha Murashev, надеюсь не переврал имя и фамилию в процессе обратного перевода на русский), содержит большое количество полезной информации об особенностях работы со Swift и не только.

  • Ray Wenderlich - уже упоминавшийся ранее прекрасный ресурс со значительным количеством туториалов, доступных бесплатно. Прекрасно подойдёт даже для опытного разработчика, желающего быстро ознакомиться с новым для него фреймворком или сторонней библиотекой.

  • NSBlog от Майка Эша. Подойдёт для разработчиков с опытом, поскольку темы, о которых пишет автор, обычно требуют достаточно глубокого понимания того, как устроена платформа iOS, а также объектная модель стандартных библиотек, Objective-C runtime и так далее.

  • Little Bites of Cocoa - представляет собой блог с мини-туториалами на определённую тему, начиная с того, как работать с оператором guard в Swift, заканчивая тем, как правильно отправлять баг-репорты в Apple. В силу разнообразия рассматриваемых тем блог подойдёт как начинающим разработчикам, так и опытным.

  • iOS Dev Weekly - это, на самом деле, не столько блог, сколько еженедельная почтовая рассылка, на которую можно подписаться и получать самые интересные новости (с точки зрения куратора рассылки - Дэйва Вервера) из мира iOS разработки за прошедшую неделю каждую пятницу в свой электронный почтовый ящик. Удобно, интересно, рекомендую.

И что мне со всем этим делать?

Как видите, возможностей для изучения iOS-разработки существует великое множество. Если у Вас уже кружится голова от всего перечисленного, не волнуйтесь, у меня есть простой алгоритм обучения iOS-разработке:

  1. Найдите себе интересную задачу, которую могло бы решить мобильное приложение для платформы iOS. Задача должна быть решаемой в обозримой перспективе, но не тривиальной.
  2. Пройдите курс от Apple Start Developing iOS Apps with Swift, чтобы получить базовое представление о том, как написать простейшее iOS-приложение.
  3. Попробуйте решить свою задачу из шага 1 при помощи полученных знаний. Скорее всего, если задача более или менее не тривиальна, у Вас что-то не получится. В этом случае, разбейте то, что не получается, на несколько логических подзадач и переходите к шагу 4.
  4. Для каждой подзадачи из шага 3 найдите книгу/видео/статью в Интернете о том, как её решить.
  5. Повторяйте шаг 4 до полного решения Вашей задачи.

Обычно самое сложное в процессе обучения iOS-разработке - это начать. Как только у Вас появляется общее понимание того, как устроено мобильное приложение и как его запустить на устройстве, дальнейшая работа становится гораздо легче.

После того, как Вы ознакомились с базовыми навыками разработки и пришли к выводу, что Вам это нравится и Вы хотите этим заниматься профессионально, я настоятельно рекомендую прочитать хорошую книгу по теме и/или посмотреть целиком Стэнфордский курс лекций. Это необходимо для выработки системного понимания процесса разработки для платформы iOS. Без него Вы рискуете пополнить ряды многочисленных copy-paste программистов, ведущих разработку на языке StackOverflow, чего ни мне, ни Вам, совершенно не нужно. Мне не нужно по причине того, что я не хочу работать с такими ужасными разработчиками (язык не поворачивается назвать их “программистами”). Вам это не нужно потому, что найти работу с такими навыками Вам будет крайне трудно.

А дальше надо писать код (много кода); думать; переписывать старый код; читать, что пишут другие, более опытные разработчики; участвовать в open-source проектах или хотя бы читать чужой код в этих open-source проектах и т.д..

Именно практика делает начинающих разработчиков профессионалами.

Если у Вас возникли идеи или соображения по поводу написанного, а также, если Вы хотите предложить книгу, курс видео, или хороший блог для улучшения данной заметки, напишите мне на hello[at]maxmikheev[dot]org.