Posts Tagged IBM
Сравнение Qt и Java
В этой статье сравнивается эффективность использования C++/Qt и Java/AWT/Swing для разработки программного обеспечения с пользовательским графическим интерфейсом.
1. Что мы сравниваем?
При выборе средств для разработки крупного программного проекта необходимо учесть множество различных аспектов, наиболее важнейшим из которых является язык программирования, потому что он в значительной степени определяет другие доступные средства. Например, для разработки пользовательского графического интерфейса разработчикам необходима GUI-библиотека, предоставляющая готовые элементы интерфейса, такие, как кнопки и меню. Так как выбор GUI-библиотеки оказывает большое влияние на разработку проекта, часто ее выбор осуществляется первым, а язык программирования определяется из числа доступных для этой библиотеки языков. Обычно, язык программирования определяется библиотекой однозначно.
Другие компоненты средств разработки, такие, как библиотеки доступа к базам данных или библиотеки коммуникаций, также должны быть приняты во внимание, но они не оказывают такого влияния на разработку проекта, как библиотеки GUI.
Целью этой статьи является сравнение C++/Qt и Java/AWT/Swing. Чтобы это сделать наиболее точно, мы сначала сравним языки программирования, то есть C++ и Java, а потом две GUI-библиотеки: Qt для C++ и AWT/Swing для Java.
2. Сравнение C++ и Java
Часто при обсуждении преимуществ и недостатков различных языков программирования дебаты сводятся к аргументам, основанным скорее на личном опыте и предпочтениях, чем на объективных критериях. Конечно же, при выборе языка программирования личные предпочтения и опыт разработчика должны быть учтены, но так как эти критерии субъективны, они здесь не принимаются во внимание. Вместо этого мы будем рассматривать продуктивность программирования, производительность работы приложения и эффективность использования памяти, потому что эти критерии могут быть определены количественно и могут быть исследованы с научной точки зрения, хотя мы также учтем информацию, полученную из опыта разработки проектов в нашей компании.
2.1. Продуктивность программирования
Продуктивность программирования определяет, насколько эффективно (т.е. быстро и точно) программист с определенным опытом и знаниями может решить поставленную перед ним задачу, используя заданный язык программирования. Так как оклад разработчика является главной составляющей стоимости разработки любого программного проекта, продуктивность программирования имеет большое значение. Также в определенной степени продуктивность программирования определяется доступными инструментальными средствами.
Отличительной особенностью Java в сравнении с другими языками программирования общего назначения является обеспечение высокой продуктивности программирования, нежели производительность работы приложения или эффективность использования им памяти.
Для этого Java наделена некоторыми дополнительными возможностями. Например, в отличие от C++ (или C), программист не должен в явном виде «освобождать» (возвращать) выделенную память операционной системе. Освобождение неиспользуемой памяти (сборка «мусора») автоматически обеспечивается средой выполнения Java в ущерб производительности и эффективности использования памяти (см. далее). Это освобождает программиста от утомительной задачи по слежению за освобождением памяти – главного источника ошибок в приложениях. Одна эта возможность языка должна значительно увеличить продуктивность программирования в сравнении с C++ (или C).
Однако проведенное исследование показывает, что на практике сборка «мусора» и другие возможности Java не оказывают большого влияния на продуктивность программирования. Одна из классических моделей оценки программного обеспечения CoCoMo, предложенная Barry Boehm, предопределяет стоимость и сроки разработки программного продукта на основе стоимостных коэффициентов, которые учитывают такие факторы, как суммарный опыт программирования разработчика, опыт программирования на заданном языке, желаемая надежность программы и т.д. Boehm пишет, что независимо от уровня используемого языка, начальные трудозатраты всегда высокие. Подобная методика подсчета использовалась в другом исследовании, проведенном C.E.Walston и C.P.Felix, IBM, Метод измерения и оценки программирования (A method of programming measurement and estimation) .
Оба приведенных здесь исследования появились задолго до создания Java, но несмотря на это, они демонстрируют общий принцип: сложность языка программирования общего назначения по сравнению с другими аспектами, такими как квалификация разработчика, не оказывает существенного влияния на полную стоимость разработки проекта.
Существует более позднее исследование, которое явно включает Java и которое подтверждает эту гипотезу. В Эмпирическом сравнении C, C++, Java, Perl, Python, Rexx и Tcl (An empirical comparison of C, C++, Java, Perl, Python, Rexx, and Tcl) Lutz Prechelt из университета Karlsruhe описывает проведенный им эксперимент, в котором студентам информатики поручили выполнить определенный проект и выбрать для его реализации, руководствуясь личными предпочтениями, один из языков программирования: C, C++ или Java (остальные языки были рассмотрены в другой части исследования). Собранные данные показали почти одинаковые результаты для C++ и Java (C был на третьем месте по многим параметрам). Эти результаты подтверждаются нашим собственным опытом: если программисты вольны в самостоятельном выборе языка программирования (чаще руководствуясь при этом своим опытом), программисты с равным опытом работы (например, измеренным в годах) достигают одной и той же продуктивности. Второй интересный аспект, который бы мы хотели отметить (но который не имеет формального экспериментального подтверждения), заключается в том, что менее опытные разработчики достигают лучших результатов с Java, разработчики со средним опытом разработки достигают одинаковых результатов с обоими языками программирования, опытные разработчики достигают лучших результатов с C++. Эти наблюдения могут быть объяснены тем, что для C++ доступны более совершенные средства разработки; и этот факт тоже должен быть принят во внимание.
Интересный способ определения продуктивности программирования предлагает метод функциональных единиц (Function Point), разработанный Capers Jones. Функциональная единица – это метрика программного обеспечения, которая зависит лишь от его функциональности, а не от конкретной реализации. Эта метрика позволяет использовать в качестве критерия оценки продуктивности программирования число строк кода, необходимых для обеспечения одной функциональной единицы, в свою очередь, уровень языка определяется числом функциональных единиц, которые могут быть созданы за определенное время. Интересно, что обе величины: число строк кода на единицу функциональности и уровень языка одинаковы для обоих языков (уровень языка: C++ и Java – 6, C – 3.5, Tcl – 5; число строк кода на единицу функциональности: C++ и Java – 53, C – 91, Tcl – 64).
Подводя итог: оба исследования и практика опровергают утверждение, что Java обеспечивает программистам лучшую продуктивность программирования, нежели C++.
2.2. Производительность работы приложений
Мы увидели, что преимущества продуктивности программирования на Java оказались иллюзорными. Теперь мы исследуем производительность работы приложений.
И снова Prechelt предоставляет интересные сведения. Объем предлагаемой им информации огромен, но в конечном итоге он приходит к заключению, что «Java-программы выполняются по крайней мере в 1.22 раза медленнее C/C++ программ». Заметьте, что он сказал по крайней мере; средняя же скорость работы Java-программ гораздо меньше. Наш собственный опыт показывает, что Java-программы выполняются приблизительно в 2-3 раза медленнее своих C/C++ аналогов. На задачах, ориентированных на интенсивное использование процессора, Java-программы проигрывают еще сильнее.
В случае программ с пользовательским графическим интерфейсом увеличение времени отклика интерфейса является более критичным, чем низкая производительность программы. Проведенные исследования показывают, что пользователи более терпимы к задачам, выполняющимся в течение двух или трех минут, чем к программам, которые не реагируют мгновенно на их воздействия, например, на нажатия кнопок. Эти исследования показывают, что если время отклика программы больше, чем 0,7 секунды, пользователи считают ее медленной. Мы вернемся к этой проблеме, когда будем сравнивать пользовательский графический интерфейс в программах Java и C++.
Объяснение того, почему Java-программы медленнее C++ проограмм, заключается в следующем. C++ программы компилируются компилятором C++ в двоичный формат, который затем исполняется непосредственно процессором; таким образом, выполнение программы осуществляется аппаратными средствами. (Это несколько упрощенно, так как большинство современных процессоров выполняют микрокод, но это не принципиально при обсуждении данного вопроса.) С другой стороны, компилятор Java компилирует исходный код в «байт-код», который непосредственно исполняется не процессором, а с помощью другого программного обеспечения, виртуальной машины Java (Java Virtual Machine, JVM). В свою очередь, JVM исполняется процессором. Таким образом, выполнение байт-кода Java-программ осуществляется не быстрыми аппаратными средствами, а с помощью более медленной программной эмуляции.
Для повышения производительности работы Java-программ были разработаны «Just in Time» (JIT) компиляторы, но универсального решения этой проблемы не существует.
На первый взгляд, полуинтерпретируемая природа Java-программ обеспечивает выполнение принципа «скомпилированный однажды код выполняется везде». Однажды скомпилированная в байт-код Java-программа может выполняться на любой платформе, для которой доступна JVM. На практике же, это не всегда так из-за отличий в реализациях разных JVM и из-за необходимости иногда наряду с Java-программами использовать родной, не-Java код, обычно написанный на C или C++.
Но разве использование платформенно-независимого байт-кода является верным подходом в создании кросс-платформенных приложений? С хорошим кросс-платформенным инструментарием, наподобие Qt, и хорошими компиляторами для различных платформ программисты могут достичь почти той же цели компиляцией своего исходного кода один раз для каждой из платформ: «написанный однажды код компилируется везде». Можно возразить, что для этого разработчикам потребуется доступ ко всем поддерживаемым платформам, в то время, как с Java, теоретически, разработчикам необходим доступ только к одной из платформ, имеющей средства разработки для Java и JVM. На практике же ни один из ответственных производителей программного обеспечения не будет сертифицировать свои программные продукты для платформ без предварительного их тестирования, поэтому в любом случае производителям будет необходим доступ ко всем поддерживаемым платформам.
Возникает вопрос, зачем использовать программную реализацию виртуальной машины Java, если такую же функциональность можно получить с помощью аппаратной реализации? Именно так рассуждали разработчики при создании языка Java; они предполагали, что вопрос низкой производительности будет решен, когда станет доступной аппаратная реализация JVM в виде Java-процессоров. Однако даже по прошествии пяти лет Java-процессоры не получили широкого распространения. Существуют проектные экземпляры и даже работающие прототипы Java-процессоров, однако понадобится еще немало времени, чтобы стало возможным их приобрести.
2.3. Эффективность использования памяти
Java и C++ используют различные подходы в управлении памятью. В C++ управление памятью полностью осуществляется программистом, т.е. по мере необходимости распределение и освобождение памяти должно выполняться программистом. Если программист забывает освободить ранее полученную память, возникает «утечка памяти». Если во время работы приложения произойдет лишь одна такая утечка, проблем не возникнет, так как после завершения работы приложения операционная система освободит всю ранее использованную им память. Но если утечки памяти будут происходить постоянно (например, если пользователь будет периодически выполнять определенные действия), использование памяти приложением будет расти вплоть до полного ее расхода с последующим возможным отказом системы.
Java обеспечивает автоматическое освобождение неиспользуемой памяти. Наряду с распределением памяти программистом JVM ведет учет всех используемых блоков памяти и указателей на них. Если блок памяти больше не используется, он может быть освобожден. Это обеспечивает процесс, который называется «сборкой мусора». Он периодически вызывается JVM, проверяет все используемые блоки памяти и освобождает те из них, на которые отсутствуют указатели.
Сборка мусора очень удобна, но за ее использование приходится расплачиваться большим потреблением памяти и низкой произодительностью… Программисты C++ могут (и должны) освобождать блоки памяти сразу после того, как они перестали быть нужны. С Java блоки не освобождаются до очередного вызова сборщика мусора, периодичность работы которого зависит от использумой реализации JVM. Prechtelt предоставляет цифровые данные, утверждая, что в среднем, (…) и с вероятностью 80% Java-программы используют на 32 MB (или 297%) памяти больше, чем C/C++ программы (…). Вдобавок к большому расходу памяти процесс сборки мусора требует дополнительной процессорной мощности, которая в результате становится недоступной приложению, и это приводит к замедлению его работы. Поэтому периодическая работа сборщика мусора может приводить к «замораживанию» Java-программы на несколько секунд. Лучшие реализации JVM минимизируют такие замораживания, но не устраняют их полностью.
При работе с внешними программами и устройствами, например, во время ввода/вывода или при взаимодействии с базой данных, желательно закрыть файл или соединение с базой данных сразу же после того, как они перестали быть нужны. Благодаря деструкторам C++ это происходит сразу после вызова delete. В Java закрытие произойдет лишь во время следующего цикла работы сборщика мусора. В лучшем случае это может привести к излишней блокировке ресурсов, в худшем – к нарушению целостности открытых ресурсов.
Тот факт, что Java-программы используют блоки памяти большие, чем необходимо, является особенно критичным для встраиваемых устройств, объемы памяти которых невелики. Неслучайно, что до сих пор (на время написания этой статьи) не существует полной реализации Java-платформы для встраиваемых устройств, а лишь ее частичные реализации.
Главная причина, по которой сборка мусора является более дорогостоящей, чем непосредственное управление памятью программистом, – это утрата информации. В C++ программе программист знает и местонахождение своих блоков памяти (сохраняя указатели на них), и когда они перестанут быть ему нужными. В Java-программе последняя информация недоступна для JVM (даже если она известна программисту), поэтому JVM должна перебирать все блоки на предмет отсутствующих указателей. Для того, чтобы вызвать сборку мусора вручную, Java-программист может удалить все указатели на больше ненужные ему блоки памяти. Но со стороны программиста это потребует больше усилий, чем непосредственное управление памятью в C++; и тем не менее, во время сборки мусора JVM все равно придется проверить все блоки памяти, чтобы освободить неиспользуемые.
С технической точки зрения, нет ничего такого, что бы мешало реализовать сборку мусора в C++ программах. Существуют обеспечивающие это коммерческие программы и библиотеки. Но из-за перечисленных выше недостатков немногие C++ программисты используют их. Инструментарий Qt использует более эффективный подход для упрощения задачи управления памятью: при удалении объекта все зависящие от него объекты также автоматически удаляются. Подход Qt не мешает программистам по желанию самостоятельно удалять объекты.
Так как управление памятью в C и C++ обременительно для программиста, созданное с помощью этих языков программное обеспечение обвиняется в нестабильной работе и подверженности ошибкам. Хотя некорректная работа с памятью в C и C++ может привести к более критичным ошибкам (обычно приводящим к аварийному завершению программы), хорошие знания, инструментарий и опыт могут значительно уменьшить связанный с этим риск. Изучению управления памятью должно уделяться достаточно внимания. Также существует большое число коммерческих и свободных инструментов, позволяющих программистам обеспечить отсутствие в программах ошибок при работе с памятью; например, Parasoft Insure++, Rational Purify и Electric Fence. Гибкая система управления памятью в C++ делает возможным создавать адаптированные для любого типа приложений профилировщики памяти.
В результате этого обсуждения мы убедились в том, что при сравнимой продуктивности программирования C++ обеспечивает приложениям гораздо лучшие, чем Java, производительность работы и эффективность использования памяти.
2.4. Доступные библиотеки и инструментарий
Java-платформа предлагает внушительное число пакетов, насчитывающих сотни классов для любых задач, включая пользовательский графический интерфейс, безопасность, поддержку сети и прочие. Это несомненное преимущество Java-платформы. Любому Java-пакету соответствует, как минимум, одна C++ библиотека, хотя иногда бывает очень трудно собрать в одном C++ проекте множество библиотек и заставить их вместе правильно работать.
Однако это преимущество Java является также ее недостатком. Разобраться в огромном API программисту становится все сложнее. Можете быть наверняка уверены, что для любой задачи всегда найдется уже готовое решение или, по крайней мере, решение, облегчающее выполнение этой задачи. Но найти пригодный для этого пакет и класс становится все труднее. Также с увеличением числа пакетов стремительно растет размер Java-платформы. В результате стали возникать ее «урезанные» версии, утратившие преимущества готовых решений. Таким образом, размер Java-платформы делает практически невозможным создание Java-систем небольшими производителями независимо от создателя Java Sun Microsystems, что ослабляет конкуренцию.
Если преимущества Java заключаются в доступных библиотеках, то явные преимущества C++ – в имеющихся средствах разработки. За все время существования семейства языков C и C++ было создано огромное количество самых разнообразных средств разработки, включая инструменты для дизайна, отладки и профилирования. Имеющиеся средства разработки для Java часто уступают по возможностям своим C++ -аналогам. Это справедливо даже для инструментов от одного производителя; например, сравните Java и C/C++ -версии профилировщика Rational Quantify.
Самым важным инструментом для любого разработчика, использующего компилируемые языки, является компилятор. Основным достоинством компиляторов C++ является скорость работы. Для обеспечения кросс-платформенности своих компиляторов (и других средств разработки) производители Java-инструментов часто сами используют Java, со всеми вытекающими отсюда проблемами производительности и эффективности использования памяти. Иногда встречаются Java-компиляторы, написанные на C/C++ (например, IBM Jikes), но это редкость.
3. Сравнение AWT/Swing и Qt
До сих пор мы сравнивали лишь языки программирования Java и C++. Но, как мы упомянули в начале этой статьи, язык программирования является лишь одним из аспектов, принимаемых во внимание при разработке GUI. Теперь мы сравним пакеты для разработки GUI, которые поставляются вместе с Java, т.е. AWT и Swing, и кросс-платформенный инструментарий Qt от норвежского производителя Trolltech. В сравнении мы ограничились лишь одним инструментарием C++, потому что в отличие от MFC (Microsoft Foundation Classes) и других подобных библиотек, Qt поддерживает все 32-битные Windows-платформы (кроме NT 3.5x), большинство разновидностей Unix, включая Linux, Solaris, AIX и Mac OS X, и встраиваемые платформы. Это позволяет максимально близко сопоставить платформы Java/AWT/Swing и C++/Qt.
3.1. Описание AWT, Swing и Qt
Инструментарий AWT (Abstract Windowing Toolkit) начал поставляться с самой первой версией Java. Он использует родные для платформ компоненты GUI (т.е. Win32 API для Windows и библиотеку Motif для Unix), обеспечивая таким образом переносную обертку. Это значит, что внешний вид и поведение AWT-программ будет отличаться на различных платформах, потому что именно они занимаются отрисовкой и управлением компонентов GUI. Это противоречит кросс-платформенной философии Java и может быть объяснено тем, что первая версия AWT была разработана за четырнадцать дней.
По этой и другим причинам AWT был дополнен инструментарием Swing. Swing использует AWT (и, следовательно, низкоуровневые библиотеки) только лишь для базовых операций: создания прямоугольных окон, управления событиями и отрисовки графических примитивов. Всем остальным, включая отрисовку компонентов GUI, занимается Swing. Это решает проблему отличающегося внешнего вида и поведения приложений на различных платформах. Но из-за реализации Swing-инструментария средствами Java его производительность оставляет желать лучшего. В результате Swing-программы медлительны не только во время интенсивных вычислений, но и при отрисовке элементов пользовательского интерфейса. Как уже говорилось, ничто не вызывает у пользователей такого раздражения, как большое время отклика интерфейса программ. Странно наблюдать за медлительностью перерисовки Swing -кнопки на современном оборудовании. Хотя с ростом производительности оборудования эта ситуация будет постепенно улучшаться, сложным пользовательским интерфейсам, созданным с помощью Swing, всегда будет свойственна медлительность.
При разработке инструментария Qt был использован тот же самый подход: низкоуровневые библиотеки используются только лишь для базовых операций, а отрисовкой элементов GUI занимается непосредственно Qt. Благодаря этому инструментарий Qt приобретает все преимущества Swing (например, схожесть поведения и внешнего вида приложений на различных платформах), и не имеет проблем, связанных с низкой производительностью, так как разработан на C++ и откомпилирован в машинный код. Интерфейс, созданный с помощью Qt, отличается быстрой работой, и, благодаря использованию кеширования, может быть быстрее интерфейса, разработанного стандартными средствами. Теоретически, оптимизированная не-Qt программа должна быть быстрее аналогичной Qt-программы; но на практике для оптимизации не-Qt программы потребуется больше усилий и мастерства, чем для создания оптимизированной Qt-программы.
И Qt, и Swing поддерживают технику стилей, которая позволяет программам независимо от платформы использовать один из стилей интерфейса. Это становится возможным благодаря тому, что отрисовкой элементов GUI занимаются непосредственно Qt и Swing. Вместе с Qt поставляются стили, которые эмулируют внешний вид Win32, Motif, MacOS X Aqua (в Macintosh-версии), и даже стиль, эмулирующий внешний вид Swing-программ.
3.2. Парадигмы программирования в Qt и Swing
Несмотря на то, что оценка API в определенной степени является делом личных предпочтений программиста, среди API-интерфейсов можно выделить такие, которые сделают ваш код более простым, кратким, элегантным и читаемым, чем другие. Ниже мы приводим два примера кода: первый с использованием Java/Swing, а второй с использованием C++/Qt, в которых реализуется вставка нескольких элементов в иерархическое дерево. Swing-код:
...
DefaultMutableTreeNode root = new DefaultMutableTreeNode( "Root" );
DefaultMutableTreeNode child1 = new DefaultMutableTreeNode( "Child 1" );
DefaultMutableTreeNode child2 = new DefaultMutableTreeNode( "Child 2" );
DefaultTreeModel model = new DefaultTreeModel( root );
JTree tree = new JTree( model );
model.insertNodeInto( child1, root, 0 );
model.insertNodeInto( child2, root, 1 );
...
Этот же код с использованием Qt:
...
QListView* tree = new QListView;
QListViewItem* root = new QListViewItem( tree, "Root" );
QListViewItem* child1 = new QListViewItem( root, "Child 1" );
QListViewItem* child2 = new QListViewItem( root, "Child 2" );
...
Как видите, Swing использует архитектуру Model-View-Controller (MVC), в то время как Qt ее поддерживает, но не навязывает использовать. Поэтому Qt-код более интуитивен. К такому же результату приводит сравнение кода для создания заполненной таблицы или других сложных компонентов GUI.
Вторым интересным моментом является то, как различные инструментарии связывают воздействие пользователя (например, выбор элемента в выше созданном дереве) с определенной функциональностью (вызовом функции или метода). Синтаксически в Java/Swing и C++/Qt это выглядит по-разному, но основной принцип общий. Трудно сказать, какой код является более ясным и элегантным, Swing-код:
...
tree.addTreeSelectionListener( handler );
...
или Qt-код:
...
connect( tree, SIGNAL( itemSelected( QListViewItem* ) ),
handler, SLOT( handlerMethod( QListViewItem* ) ) );
...
С одной стороны, Swing-код выглядит проще, а с другой – Qt-код более гибок. Qt позволяет программисту использовать для управляющей функции любое имя, в то время, как Swing обязывает использовать в качестве имени valueChanged() (вот почему в приведенном выше Swing-примере оно не было указано явно). Также Qt позволяет связывать событие (сигнал в терминологии Qt) с любым числом управляющих функций (слотов).
Таким образом, и Java/AWT/Swing, и C++/Qt одинаково хорошо подходят для разработки сложного пользовательского интерфейса. Главным недостатком Swing-интерфейса является низкая производительность Java.
4. Заключение
Мы сравнили две платформы: Java/AWT/Swing и C++/Qt, оценив их пригодность для эффективной разработки высокопроизводительных приложений с пользовательским графическим интерфейсом. В то время, как Java-платформа обеспечивает разработчикам сравнимую продуктивность программирования, платформа C++/Qt обеспечивает приложениям лучшую производительность и эффективность использования памяти. Также C++ выигрывает за счет более лучших средств разработки.
Что касается сравнения GUI-библиотек, Swing и Qt, то видно, что более худшая производительность Java-программ делает платформу Java/Swing менее подходящей для разработки GUI-приложений, даже при сравнимом опыте программирования. В отличие от Swing, Qt не навязывает программисту парадигму программирования Model-View-Controller, поэтому в результате Qt-программы получаются более краткими.
Независимое научное исследование и полученный практический опыт эксплуатации показывают, что предпочитаемость использования Java во многих случаях чаще всего неоправданна, а комбинация C++/Qt является более лучшей. Главными причинами этого являются более низкие производительность и эффективность использования памяти в Java (особенно при использовании инструментария Swing) при такой же обеспечиваемой продуктивности программирования. Во многих выполненных нами проектах начинающие программисты осваивали быстрее Java, более опытные и профессиональные разработчики (занимающиеся проектированием приложений и реализацией критичных участков программ) достигали быстрее лучших результатов с помощью C++.
Java/Swing может подойти для разработки некоторых программ, особенно если они без GUI-интерфейса или с ограниченной GUI-функциональностью. В целом, C++/Qt является более лучшим решением, в особенности для разработки GUI-приложений.
Источник: Сравнение Qt и Java
Будь хорошим
Примерно через месяц после запуска Y Combinator мы пришли к фразе, которая впоследствии стала нашим девизом: «Делай то, что хотят люди». С тех пор мы многому научились, но если бы я выбирал сейчас, я бы не изменил своего решения.
Ещё одна вещь, которую мы говорим основателям — не слишком беспокойтесь о бизнес-модели, по крайней мере поначалу. Не потому, что зарабатывать деньги неважно, а потому, что это гораздо легче, чем создать что-то стоящее.
Пару недель назад я понял, что если совместить две эти идеи, то выходит кое-что удивительное. Делай то, что хотят люди. Не беспокойтесь особо о зарабатывании денег. Да это ведь определение благотворительности!
Когда получаешь неожиданный результат вроде такого, это может быть как глупостью, так и новым открытием. Одно из двух: или бизнес не предполагает возможность организации в виде благотворительности, и мы доказали от противного, что один или оба принципа, с которыми мы начали, были ошибкой. Или у нас новая идея.
Подозреваю, верно второе, ведь как только у меня появилась эта мысль, целая цепочка других была расставлена по местам.
Примеры
К примеру, Craigslist. Это не благотворительная организация, но действуют они так, как будто являются ею. И они поразительно успешны. Когда просматриваешь список наиболее популярных интернет-сайтов, число работников Craigslist больше похоже на опечатку. Их доходы не так высоки, как могли бы быть, но большинство стартап-компаний были бы счастливы поменяться с ними местами.
Капитаны в романах Патрика О’Брайена (Patrick O’Brian) всегда пытались заходить с наветренной стороны своих противников. Если вы с наветренной стороны, вы принимаете решение, когда именно атаковать другой корабль. Craigslist идет по ветру огромных доходов. Они встретят некоторые трудности, если захотят зарабатывать еще больше, но это будут не те трудности, которые вы испытаете, пытаясь продвинуть паршивый продукт безразличным пользователям, потратив в десять раз больше на продажи, чем на разработку. [1]
Я не говорю, что все стартапы должны стремиться к тому, чтобы закончить как Craigslist. Он — результат необычных обстоятельств. Но он и хорошая модель для ранних стадий.
Google выглядел скорее благотворителем в начале. Они не показывали рекламу более года. В первый год Google были неотличимы от некоммерческой организации. Если некоммерческая или государственная организация начала бы проект по индексации интернета, Google в первый год был пределом того, что они могли бы сделать.
Возвращаясь назад — когда я работал над спам-фильтрами, я думал это будет хорошая идея — почтовый сервис с веб-интерфейсом с хорошей фильтрацией спама. Я не думал об этом как о компании. Я просто хотел оградить людей от потока спама. Но чем больше я думал об этом проекте, тем больше я убеждался в том, что, вероятно, это должно быть компанией. Работа этого проекта будет чего-то стоить, а финансирование посредством грантов и пожертвований будет головной болью.
Это было удивительное открытие. Компании часто утверждают, что они приносят пользу обществу, но я внезапно понял, что есть такие общественно полезные проекты, которые могут существовать, только став коммерческими компаниями.
Я не хотел создавать еще одну компанию, поэтому я этого не сделал. Но если бы кто-то сделал, то сейчас он наверное был бы довольно богат. Было окно длительностью около двух лет, когда поток спама быстро рос, а фильтры на всех крупных почтовых сервисах никуда не годились. Если бы кто-то запустил новый сервис без спама, люди побежали бы туда толпой.
Какие из этого можно сделать выводы? С разных направлений можно прийти в одну точку. Если вы начнете с успешных стартапов, вы можете найти, что они часто вели себя как некоммерческие сервисы. А если вы начнете с идей для некоммерческих сервисов, вы найдете, что из них часто могли бы получиться хорошие стартапы.
Сила
Насколько велика эта территория? Могут ли все хорошие некоммерческие организации стать хорошими коммерческими компаниями? Вероятно нет. Что сделало Google таким ценным, так это то, что его пользователи имели деньги. Если вы добились того, что люди с деньгами вас любят, вы можете надеяться получить некоторую часть их денег. Но можете ли вы создать успешный стартап, который будет вести себя как некоммерческая организация с потребителями, у которых нет денег? Можете ли вы, например, вырастить успешный стартап из лечения немодной, но смертельно опасной болезни, например малярии?
Я не уверен, но думаю что если вы вложите свои силы в идею, вы будете удивлены как далеко она пойдет. Например люди пришедшие в Y Combinator обычно не богаты, и тем не менее мы получаем прибыль помогая им, потому что с нашей помощью они могут делать деньги. Может, и с малярией можно так сделать. Возможно, организация которая помогла избавить от нее страну, сможет получить пользу от последующего роста.
Я не утверждаю что это серьезная идея, потому что я не знаю ничего о малярии. Но я работаю с идеями достаточно долго, чтобы понять, когда я натыкаюсь на стоящую.
Один из способов понять как далеко пойдет идея, это спросить себя, в какой момент вы бы сделали ставку против нее. Мысль о том, чтобы сделать ставку против доброжелательности, вызывает тревогу, примерно так же, как если вы заявите, что нечто технически невозможно. Вы просто напрашиваетесь на то, чтобы оказаться в дураках, потому что в обоих случаях вы делаете ставку против очень мощных сил. [2]
В начале я думал что этот принцип применяется только к интернет стартапам. Очевидно что это работает для Google, но что можно сказать о Microsoft? Microsoft ведь не доброжелателен? Но если посмотреть в прошлое, то я думаю они были именно такими. По сравнению с IBM они казались Робином Гудом. Когда IBM представила PC, они предполагали зарабатывать деньги продажей аппаратных частей по высоким ценам. Но получив контроль над стандартом на PC, Microsoft открыла рынок для всех производителей. Цены на аппаратную составляющую быстро упали и множество людей получили возможность приобрести компьютер, хотя раньше не могли себе этого позволить. Подобных свершений вы бы могли ожидать от Google.
Microsoft не столь великодушна сейчас. Сейчас, если подумать о том, что Microsoft делает с пользователями, все приходящие на ум слова — непечатные. [3] И тем не менее не похоже, что это окупается. Цена акций Microsoft остается постоянной уже многие годы. А в те времена, когда она была Робином Гудом, ее акции росли как сейчас у Google. Может быть здесь есть взаимосвязь?
Теперь вы видите как все обстоит. Когда ваша компания мала, вы не можете диктовать свои условия заказчикам, вы должны очаровывать их. Когда же вы становитель большой компанией, вы можете запугивать их, если захотите, и вы будете склоняться именно к этому, потому что это легче, чем удовлетворить их требования. Чтобы вырасти, нужно быть хорошим, но чтобы оставаться большим, быть хорошим уже не обязательно.
Это сходит вам с рук, пока не изменятся основные условия, после чего все ваши жертвы сбегают. Так что, возможно, лозунг «Не будь злым» (Don’t be evil) — это самое ценное, что Пол Бухайт (Paul Buchheit) сделал для Google, потому что это лозунг может оказаться эликсиром корпоративной молодости. Я думаю, сейчас они считают его большим неудобством, но подумайте как это будет ценно, если он спасет их от падения в фатальную лень, которая поразила Microsoft и IBM.
Любопытно то, что этот эликсир свободно доступен любой другой компании. Кто угодно может принять девиз «Не будь злым». Проблема в том, что ему потом придется следовать, иначе вас не поймут. Так что я не думаю, что рекорд-лейблы или табачные компании смогут использовать эту находку.
Боевой дух
Есть много внешних признаков, что доброжелательность работает. Но как работает? Одно из преимуществ инвестирования в большое количество стартапов в том, что ты получаешь большой объем данных о том как они работают. Из того, что мы видим, стремление быть хорошими помогает стартапам в трех направлениях: это повышает их мораль, это побуждает других людей помогать им, и прежде всего, это помогает им быть решительными.
Мораль чрезвычайно важна для стартапа — настолько важна, что ее одной почти всегда достаточно для достижения успеха. Стартапы часто описываются как русские горки. В одно мгновение ты владеешь миром, в следующее — ты обречен. Проблема с чувством обреченности не только в том, что это делает тебя несчастным, но и в том, что останавливает твою работу. Так что спуск по русским горкам чаще исполняемое пророчество, чем подъем. Если чувство того, что ты двигаешься к успеху дает тебе силы работатать усерднее, что наверняка увеличивает шансы на конечный успех, то ощущение надвигающегося провала делает невозможным продолжение работы, что практически гарантирует его.
Это и есть то место, где доброта приходит на помощь. Если ты чувствуешь, что реально помогаешь людям, ты продолжаешь работать несмотря на то, что все указывает на то, что стартап проваливается. Большинство из нас имеют некоторое количество доброты от природы. Сам факт того, что кто-то нуждается в вас, заставляет вас захотеть помочь им. Так что если вы начинает такой стартап, куда пользователи возвращаются каждый день, вы фактически строите гигантский тамагочи. Вы делаете нечто, о чем вам нужно заботиться.
Blogger — известный пример стартапа, который прошел через действительно самую нижнюю точку и выжил. В один момент у них кончились деньги и все покинули стартап. Эван Вильямс (Evan Williams) пришел на работу на следующий день, на рабочем месте не было никого кроме него. Что остановило его от ухода? Частично то, что пользователи нуждались в нем. Он обслуживал хостинг тысяч пользовательских блогов. Он не мог позволить сайту умереть.
Есть много преимуществ быстрого запуска, но важнейшим может быть то, что как только у вас появляются пользователи — эффект тамагочи запускается. Как только появляются пользователи, о которых надо заботиться, вы усиленно стараетесь понять то, что сделает их счастливыми, и это действительно очень важная информация.
Дополнительная уверенность, которая приходит вместе с попытками помочь людям, также может помочь вам и с инвесторами. Один из основателей Chatterous сказал мне недавно, что он и его партнер были уверены, что их сервис то, в чем мир нуждался, так что они продолжали работать над ним не смотря на то, что им пришлось вернуться в Канаду и жить у своих родителей.
Как только они поняли это, они перестали так сильно беспокоиться от том, что думают о них инвесторы. Они продолжали с ними встречаться, но они не собирались закрываться, если не получат денег. И знаете что? Инвесторы стали намного более заинтересованными. Они поняли, что Chatterous собираются сделать этот стартап, с ними или без них.
Если вы действительно преданы своему делу и расходы на работу вашего стартапа невелики, ваше предприятие будет очень живучим. Практически все стартапы, даже самые успешные, в какой-то момент близки к провалу. Таким образом ощущение того, что вы помогаете людям, делает вас сильнее, что само по себе с лихвой компенсирует любые потери от того, что вы не выбрали более эгоистичный проект.
Помощь
Другое преимущество «быть хорошим» — это то, что другие люди хотят помочь вам. Это также выглядит врожденной чертой в людях.
Один из стартапов, который мы финансировали, Octopart, сейчас находится в состоянии классического противоборства между добром и злом. Они предоставляют собой поисковый сайт для промышленных компонентов. Многим людям нужен такой поиск, и до появления Octopart хорошего поиска не существовало. Как выяснилось, это было не случайно.
Octopart организовали правильный способ для поиска компонентов. Пользователям понравилось это, и их количество стало стремительно расти. И большую часть жизни Octopart, крупнейший дистрибьютор, Digi-Key, старался заставить их убрать цены с сайта. Octopart направлял пользователей к ним бесплатно, но все же Digi-Key старался остановить этот поток. Почему? Потому что основа их бизнес-модели — переплата, которую делают люди, не владеющие полной информацией по ценам. Они не хотят, чтобы поиск работал.
Ребята из Octopart лучшие в мире. Они бросили докторскую программу по физике в Беркли, чтобы сделать это. Они всего лишь хотели решить проблему, с которой они столкнулись в своем исследовании. Представьте сколько времени вы поможете сэкономить инженерам во всем мире, если дать им возможность искать в онлайн. Так что, когда я услышал, что большая злая компания пытается остановить их, хочет, чтобы их поиск не работал, мне действительно захотелось помочь им. Это заставило меня тратить больше времени на Octopart, чем на другие стартапы, которые мы финансируем. Это только что заставило меня потратить несколько минут на то, чтобы рассказать вам какие они замечательные. Почему? А потому что они хорошие ребята, и пытаются сделать что-то хорошее.
Если вы доброжелательны, люди собираются вокруг вас: инвесторы, клиенты, другие компании и потенциальные работники. В долгосрочной перспективе наиболее важными могут оказаться потенциальные сотрудники. Я думаю что теперь все знают, что хорошие хакеры намного лучше посредственностей. Если вы сможете привлечь лучших специалистов, как смогла Google, у вас есть большое преимущество. А самые лучшие хакеры часто бывают идеалистами. Им не надо искать работу, поэтому они могут работать там, где хотят. Так что большинство из них хотят работать над вещами, которые делают мир лучше.
Примеры
Но самое большое преимущество «быть хорошим» — оно действует как компас. Одна из самых сложных особенностей при работе в стартапе — очень много ситуаций, где надо делать выбор. Вас всего двое или трое, и есть тысячи вещей, которые можно сделать. Как вы будете выбирать?
Ответ таков — делайте то, что лучше всего для ваших пользователей. Вы можете держаться за это как за трос во время урагана, и это спасет вас, если вас вообще возможно спасти. Следуйте этому принципу и он проведет вас через все, что необходимо сделать.
Это даже служит ответом на вопросы, выглядящие не относящимися к делу, например, как убедить инвестора дать вам денег. Если вы хороший продавец, то вы можете просто попробовать уговорить их. Но более надежный путь — убедить их с помощью ваших пользователей: если вы делаете что-то, что нравится пользователям настолько, что они хотят рассказать об этом своим друзьям — вы растете экспоненциально, а это убедит любого инвестора.
«Быть хорошим» очень полезная стратегия для принятия решения в сложных ситуациях, потому что она не зависит от предыдущих действий. Это как говорить правду. Проблема с враньем в том, что нужно помнить все, что сказал в прошлом, и быть уверенным в том, что не противоречишь себе. Если же вы сказали правду, вам не нужно ничего помнить, и это действительно полезное свойство в области, где события происходят быстро.
К примеру, Y Combinator к настоящему моменту инвестировал в 80 стартапов, 57 из них до сих живы. (Остальные либо закрылись, либо слились или были поглощены другими компаниями.) Когда вы пытаетесь консультировать 57 стартапов, получается, что вы должны иметь алгоритм без состояний. Вы не можете иметь скрытых мотивов, когда у вас есть 57 событий, происходящих одновременно, потому что вы не можете запомнить их. Так что наше правило состоит всего лишь в том, чтобы делать то, что лучше всего для основателей стартапа. Не потому, что мы какие-то особенно хорошие, а потому, что это единственный алгоритм, который работает в подобном масштабе.
Когда вы пишете о том, что людям нужно быть хорошими, выглядит так, как будто вы заявляете, что и сами хороший. Я хочу сказать определенно, что я не достаточно хороший. Когда я был ребенком, я крепко засел в лагере плохих. В ситуациях, когда взрослые использовали слово хороший, выглядело так, как будто это синоним слова «кроткий», так что я вырос недоверчивым к нему.
Вы знаете, что бывают такие люди — когда их имя всплывает в разговоре, каждый говорит: «он такой замечательный». Люди никогда не говорили так обо мне. Лучшее, что говорили про меня — «у него хорошие намерения». Я не заявляю, что я хороший. В лучшем случае, я могу заставить себя быть хорошим.
Я не предлагаю быть хорошим в обычном ханжеском смысле. Я предлагаю это, потому что оно работает. Это будет работать не только как заявление о «ценностях,» но и как руководство к выбору стратегии, и даже как спецификация на дизайн приложения. Не просто «не будь злым.» Будь хорошим.
Примечания
[1] 50 лет назад выглядело бы шокирующим, если бы публичная компания не платила дивиденды. Сейчас многие технические компании их не платят. Кажется, рынки научились оценивать потенциальные дивиденды. Вполне может быть, что и это не последний шаг в этой эволюции. Может быть в конечном счёте рынки будут удовлетворены потенциальными заработками. (Венчурные капиталисты уже так работают, и по крайней мере некоторые из них последовательно зарабатывают деньги.)
Я понимаю, что это звучит так же, как все эти разговоры про «новую экономику» во времена пузыря доткомов. Поверьте мне, тогда я не был одним из слепо верующих. Но я убежден, что в пузыре были и [ссылка]хорошие идеи[/ссылка]. Например, что нормально сфокусироваться на росте, а не на прибыли — но только если это настоящий рост. Пользователей нельзя покупать, иначе это будет пирамидой. Но компания с быстрым и настоящим ростом имеет ценность, а любая настоящая ценность будет в какой-то момент распознана рынком.
[2] Идея основать компанию с добрыми целями сейчас недооценена, потому что тот тип людей, которые в наше время объявляют это своей целью, обычно не слишком хорошо работают.
Для трастоманов (trustafarians) начать некий вродебыполезный бизнес — один из стандартных путей развития. Проблема большинства из них в том, что они либо действуют по фиктивной политической программе, либо слабо исполнены. Предки трастоманов не стали богатыми, сохраняя свою традиционную культуру; может люди из Боливии не хотят этого тоже. И даже строя органическую ферму, несмотря на то, что это прямое благо, они не помогают людям в том масштабе, в котором это делает Google.
Большинство демонстративно доброжелательных проектов не является достаточно открытыми. Они действуют так, как будто хороших намерений достаточно, чтобы гарантировать хорошие результаты.
[3] Пользователям настолько не нравится их новая ОС, что они пишут петиции, чтобы сохранить предыдущую версию. Хотя и предыдущая версия не представляет из себя ничего особенного. Хакеры из Microsoft наверняка в глубине души понимают, что если бы компания действительно заботилась о своих пользователях, она бы просто предложила им переключиться на OSX.
Спасибо тем, кто читал предварительные версии этой статьи. Это Trevor Blackwell, Paul Buchheit, Jessica Livingston и Robert Morris.
Источник: Будь хорошим
Оригинал: Be Good
Свежие комментарии