Разработка
Почему приложение Facebook для iOS такое большое?
Недавно в Reddit кто-то спросил – «Почему приложение Facebook такое большое?». Правда, неужели для одной из лучших IT-компаний в мире 110 Мб для «простого» iOS-приложения это предел мечтаний?
Недавно в Reddit кто-то спросил – «Почему приложение Facebook такое большое?». Правда, неужели для одной из лучших IT-компаний в мире 110 Мб для «простого» iOS-приложения это предел мечтаний?
Тут же хакеры выяснили, что скрывается за всеми этими мегабайтами. Программу быстро дизассемблировали и оказалось, что в приложении Facebook более 18,000 классов (все вы можете посмотреть тут). Среди них, например, FBFeedAwesomeizer – собрание 74 классов и протоколов. Гигантское количество, но правда ли объем приложения связан с этим и все ли классы действительно нужны для функционирования приложения социальной сети на такой мощной системе, как iOS? Ответ оказался гораздо глубже, чем казалось пользователям Reddit.
iOS просто не может справиться с масштабом Facebook
Симон Вайтекер, инженер из лондонского офиса компании, опубликовал превосходную презентацию, в которой объясняет происходящее с приложением и то, почему на самом деле Facebook на iOS занимает столько места.
Первый ключ к ответу находится… в PHP. Да, социальная сеть на 1.5 миллиарда человек начиналась на самом «клоунском» (простите, цитата) программном языке, известном человечеству. Это было прагматичным подходом и многое объясняет в культуре Facebook. Конечно, сейчас чистый PHP больше не используется, на смену ему пришел Hack, собственный улучшенный язык Facebook (кстати, адрес штаб-квартиры — 1 Hacker Way, Menlo Park, CA). Хакерство, в хорошем смысле этого слова — основа культурной парадигмы компании Facebook, и это проявляется во всем, от языка программирования до адреса.
Так почему 18,000 классов? Среди них, безусловно, есть дубли, устаревший код, быстрые хаки для получения результатов. В одну из недель августа в iOS приложение было сделано 2823 коммита! В 6 раз больше, чем для ядра Linux и почти в 10 раз больше, чем для Cocoapods. Всего 429 контрибьюторов работают над мобильным приложением. Приложение правда БОЛЬШОЕ, это один из самых больших и занятых программных проектов в мире.
Но главное в том, что Facebook вынужден был дублировать множество функций, с которыми iOS просто не справляется и о которых другим разработчикам просто не приходится задумываться.
Core Data не может справиться с данными Facebook. Вместо него был написан Mem Models, адекватно справляющийся с обновлением данных.
UIKit не справляется с обработкой ленты и быстрым обновлением, когда пользователи скроллируют ее. Вместо него был написан ComponentKit, на котором строится весь UI. Вся разметка делается в фоновом режиме, и это позволяет достичь скорости в 60 кадров в секунду со сложным интерфейсом даже на старых устройствах. И даже этого недостаточно – у Facebook как минимум два других фреймворка для работы фоновых потоков отрисовки интерфейса. Для работы paper был написан AsyncDisplayKit. Для более эффективной кроссплафторменной разработки был написан React Native.
По тем же причинам не используется Auto Layout – его работа не прогнозируема и ее нельзя вынести в бэкграунд, что плохо для фида и других частей приложения, где важна скорость отрисовки.
И даже Xcode, оказывается, не подходит для работы в Facebook! 18,000 классов невозможно долго загружаются и компилируются. Уменьшить количество классов? Не очень то по-хакерски. Facebook написал собственную IDE – Nuclide, основанную на Atom.
Ключевым фактором в разработке Nuclide было то, чтобы результат был взламываемым, — Майкл Болин, ведущий инженер Nuclide.
Что еще? Git не работает, работает Mercurial – он взламываем. Для отслеживания изменений в файлах компания написала и открыла watchman, а для уменьшения нагрузки на сеть при передаче файлов – remotefilelog.
Теперь более менее понятно, куда ушли 18,000 классов, но на самом деле работа еще не закончена. Для поиска ошибок Facebook сделал Infer, для анимаций pop, Chisel для отладки и несколько других системных утилит.
Более подробно за iOS разработкой вы можете следить на официальной странице: code.facebook.com/ios.
Добро пожаловать в Clowntown
Значит ли это, что разработчики Facebook настоящие супергерои, не боящиеся переписывать iOS с нуля и выжимающие последнюю каплю быстродействия из системы? Конечно нет. Все делают ошибки. Говорят, что где-то в Калифорнии есть городок Клоунтаун, куда иногда попадают и заслуженные разработчики.
С комментариями, подобными этому:
// Hack to support launch, will fix next week
Или такими параметрами:
У 18,000 классов наверняка найдутся авторы из Клоунтауна. Но приложение Facebook сделано не клоунами, оно сделано талантливыми разработчиками, которым всегда мало того, что предоставляет им система. Хакерами, которых удалось собрать компании Facebook, собрать и поставить задачи, которых еще никто не решал. Для этого нужно много кода. И вот он теперь перед вами.
Отображение постов с котиками не Rocket Science, но дело, конечно, не в образе, а в культуре. Глядя на то, как инженеры Facebook подходят к решению таких задач, можно сказать, что в их силах и послать человека на Марс. Было бы желание. «Двигайся быстро и изменяй вещи».