Заметка “Вернут ли нетбуки старые-добрые времена?” к моему удивлению и удовольствию вызвала активное обсуждение. Что приятно. Но я не раскрыл в ней всех причин, подтолкнувших меня к ее написанию. Благодаря комментарию Skynin, я решился развить эту тему.
Но прежде, чем углубиться в основное повествование, скажу пару слов по поводу:
Давно наблюдаю, как "нативные" программисты живут в каком-то
кошмаре "конца света", "последних времен" (Хорошие времена были...
прошли... Кали-Юга...) и потому светлом и напряженном ожидании
пришествия спасения в виде "C++ + Qt". (у "функциональщиков" схожее
ощущение - императищина гниет, ...). С психологической точки зрения
вызвано ощущением - "маргинальности", и "аутсайдерства".
Чувство маргинальности, несомненно, присутствует. А вот чувство аутсайдерства -- нет :) Но больше меня волнует тенденция постоянного расслоения программистов по прикладным специализациям. В начале 90-х мне казалось, что программист легко может менять языки программирования и проекты – сначала заниматься задачами реального времени на автокоде Эльбруса, затем делать бухучет на FoxBase в MS-DOS, затем ГИС под Windows, затем драйвера под Linux… Но время идет. И теперь сложно даже представить, сколько усилий Web-программисту потребуется, чтобы переквалифицироваться в драйверописатели или АСУТП-шники (и наоборот). В 90-е годы далеко не каждый программист был способен на это – только самые лучшие. Они и сейчас могут это сделать. Но сейчас барьер при переходе из одной области в другую очень высок и он все время растет. Поэтому, чем дольше я специализируюсь в своей нише, тем больше беспокойство я испытываю, когда думаю, что какой-нибудь большой приплыздец случится… В общем, специалист подобен флюсу, как говаривал Козьма Прутков.
Ну а теперь вернемся к нейтиву и не нейтиву (то бишь native code vs managed code). Прежде чем продолжать разговор, нужно определиться, что будет считаться нативным кодом, а что не будет. Я не спец по определениям, поэтому здесь у меня возникли изрядные трудности. Java уже давно не простой интерпретатор, а .NET (насколько я помню) никогда им и не был. И для Java, и для .NET существует возможность предварительной компиляции в нативный код (для Java в виде GNU-того компилятора, для .NET, если не ошибаюсь, встроенный во фреймворк Ngen). В тоже время для нейтива разрабатывались подходы, когда после компиляции строится объектный код некоей виртуальной машины, преобразуемый в родной код конкретной платформы при развертывании приложения. Так что граница между нейтивом и не нейтивом уже давно сильно размыта. А в контексте данного разговора я проведу ее следующим образом:
Нейтив подразумевает запуск на исполнение родного для конкретной платформы кода без помощи вспомогательной прослойки в виде какого-нибудь фреймворка или виртуальной машины. Запущенное приложение обращается к функциям ОС, а не к функциям базового фреймворка. Приложение содержит в себе все необходимые части и сторонние динамически-загружаемые библиотеки и не требует для своей работы установки какого-либо базового фреймворка/виртуальной машины.
Сразу подчеркну, что я не являюсь противником управляемого кода. Более того, я даже в чем-то любитель управляемого кода (порядком и с удовольствием попрограммировал на Ruby). Управляемый код очень хорош во многих случаях. Например, скрипты. Одним из самых важных достоинств моей системы сборки Mxx_ru для меня является то, что ее исходный код всегда присутствует и доступен для быстрой правки, если вдруг на какой-то машине что-то пошло не так. Еще один пример: server-side системы режима 24x7. Организовать в них “горячую замену” кода на управляемом динамически-типизированном языке (типа Erlang, Ruby или Python) гораздо проще, чем на статически-типизированном. Или, к примеру, возможности для метапрограммирования, которые есть в Ruby и Python как-раз из-за того, что это управляемые языки. Хотя, чем больше используется управляемого кода, тем больше ресурсов потребляют приложения. Этого не отнять.
В принципе, всему есть свое место – и нейтиву, и не нейтиву. Если без фанатизма. А вот фанатизм, имхо, таки присутствует. Что наблюдается в ползучем распространении Java/.NET, Ruby, Python, JavaScript, Flash, …, you name it. А так же тем, что в области нейтива за последние 15-20 лет не возникло ни одного успешного C++киллера (ну не считаю я таковыми ни Eiffel, ни Ada, ни OCaml, ни D, ни Haskell).
И тут самое время задаться вопросом: “Если C++киллера так и не появилось, то нужен ли он вообще и зачем?” В эту же тему очередная цитата из комментария Skynin:
Если программист готов бесплатно "заморачиваться эффективным и компактным приложением" – пусть изменит мир.
Собственно, в этом все дело. Мне действительно хочется, чтобы мир изменился. Поскольку то, что в нем происходит сейчас мне не кажется нормальным. Складывается впечатление, что производители делают “то, что можно сделать”, а не то, что “хотелось бы иметь” пользователям. Пара примеров.
Летом в стиральной машине полетел насос. Вызвали мастера, он его заменил. Спросил, сколько лет машине. Семь, отвечаем. Ну понятно, говорит, почти евростандарт – современные бытовые приборы (холодильники, стиральные машины, телевизоры и т.д.) расчитаны на семь лет эксплутации. Мол производителям выгоднее менять линейку продукции раз в несколько лет, а покупателям проще выбрасывать 4-5 летнюю технику и покупать совершенно новую, чем выпускать модели, способные работать по 15-20 лет.
Или производители мобильных телефонов. Прогресс в них идет такими гигантскими темпами, что моральное устаревание телефонов происходит еще быстрее, чем когда-то персональных компьютеров. Но вот интересно, какой процент пользователей мобильников использует их возможности на всю катушку? И какой процент покупателей предпочли бы иметь простой и надежный аппарат с минимумом возможностей? И как просто сейчас выбрать мобильный телефон для пожилого человека?
В области персональных компьютеров для меня явно выделялись две стадии – когда их мощность была явно недостаточной и когда их мощность уже достигла видимости достаточности. Первая стадия очень хорошо просматривалась во время гонок 86, 286б 386, 486, 486DX-2, 486DX-4, P-I-66, P-I-100,…, P-I-200-MMX, P-II, P-III. До 486-х скорость была явно недостаточна. Скажем 200-страничный документ в Word-е на 486 еще как-то можно было написать, а вот на 386 – уже фигушки. И где-то до P-II рост производительности компьтеров явным образом наблюдался. Переход на новую железку сразу сказывался на повышении скорости работы и ее комфортности (музыку в фоне можно было слушать, несколько процессов параллельно работали не тормозя друг друга, потом видео появилось). Но где-то с рубежа P-II или P-III стало заметно, что такого серьезного прироста скорости/комфортности работы при смене компьютера уже нет (очевидно, из-за нового софта). Начался выход персоналок в категорию “достаточно производительных”. Если до P-IV имело смысл менять железо раз в год-полтора, то сейчас это не так. Для многих классов задач возможностей существующих машин уже хватает и даже с запасом. Т.е. игры или HPC все еще насилуют процессоры/память/видеокарты по полной программе, но вот для “бытовых” нужд (электронная почта, интернет, skype, офис,…) вполне хватает даже P-IV с 2Gb RAM.
Т.е. в области персоналок уже складывается ситуация, когда пользователю не нужно менять железо раз в год для того, чтобы его почтовый клиент не тормозил. Производительность перестает быть главным критерием выбора нового компьютера/ноутбука. А раз так, то не начинается ли пора, когда человек покупает себе машинку не на 2-3 года, а на 5-6-7-и-более лет? И если она начинается, то нужно ли разработчикам задумываться о том, чтобы экономить ресурсы пользователя?
Мне кажется, что нужно. Причем, под ресурсами здесь понимается не только использование процессора и памяти пользовательской машины. Но и объем скачиваемого дистрибутива (вы бы выбрали аудиоплейер с дистрибутивом в 2Mb или в 22Mb, или в 222Mb?) и объем сопутствующих виртуальных машин/фреймворков.
А если нужно экономить ресурсы, то как это сделать? Например, использовать нативные языки программирования. Которые, (нормальными руками) позволяют делать быстрые и компактные программы. Не требующие сторонних многомегабайтных дистрибутивов. Быстро стартующие, оперативно откликающиеся, экономно расходующие ресурсы (я набираю этот текст в Windows Live Writer-е, который на Core2Duo 2.4MHz с 4Gb памяти стартует секунд 10, а затем отжирает 55Mb памяти и работает не очень шустро, да и подглючивает). /Примечание. На более совершенном, чем C++, языке это вполне возможно и с такими же трудозатратами, как на управляемых языках. На C++ возможно то же, но это сложно. Так что речь не о C++./
Еще один вопрос: а верю ли я сам в то, что подобный разворот событий произойдет? Что пользователи будут покупать компьютеры на 10 лет? Что они будут работать в одной и той же версии своей любимой программы в течении нескольких лет (т.е. эпизодически это уже и сейчас происходит, но не массово)? Что пользователи будут смотреть, жрет ли программа 10Mb во время работы или 100Mb?
Не сильно, но хотелось бы. Ведь в конце-концов должны же мы начать считать свои и чужие деньги. Вон за океаном, многие не думали про бесплатный сыр в мышеловке, брали и давали кредиты без оглядки. Сейчас оказались в заднице, и не только они. А все по той же причине – позволяли себе то, что можно было позволить, а не то, что следовало бы…
При чем же здесь нетбуки? Да так – отличный повод разработчикам начать задумываться о ресурсах пользователя ;) Ну и поворчать о старых-добрых временах ;)