Pull to refresh
33
18.3
Send message

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

А можно присоединиться к интервью и тоже задать вопрос? Редко удаётся поговорить с настоящим knowledge‑менеджером.


Согласны ли вы, что Sharepoint это РСУБД для непрограммистов? Некоторые считают, что пользователи, в принципе, любят типизированные нормализованные таблицы, но не знают (или не хотят использовать) SQL. Или же всё наоборот, большинству пользователей хватает, условно говоря, простых таблиц в wiki-разметке? Или это разные группы пользователей? Спасибо.

Совершенно бессмысленное устройство.

Совершенно верно. Кому нужен настоящий компьютер в кармане, покупают смартфон со стилом (лучшая замена мыши на ладони), чехол с плоской OTG-клавиатурой и подключаются через RDP к домашнему/офисному компьютеру, который всегда на связи. Ещё десять лет назад Интернет-покрытия хватало, чтобы о нём не думать, а сейчас тем более. Всё это в разы дешевле и удобнее.

Современный браузер это фактически операционная система

Именно потому, что браузер по возможности реализует всё сам, он значительно меньше, чем типичная программа, опирается на функционал, предоставляемый ОС. А программа, которая меньше зависит от функционала ОС, имеет меньше причин требовать конкретную версию виндов. Что мы, собственно, и видим.

Я очень извиняюсь, но эту историю я рассказал потому, что кто-то, совершенно не зная меня, тем не менее написал: «Если бы вы хоть раз участвовали в разработке десктопных программных продуктов». (Ну, ещё я воспользовался случаем и разместил частное объявление: присоединюсь к интересному десктопному проекту, рассчитанному на большое число пользователей. Не обязательно в Mozilla. Пишите в личку).


А теперь, значит, я ещё и предлагаю делать кривую архитектуру? В то время как из статьи следует, что с текущей архитектурой всё прекрасно работает?

Несколько лет назад я работал… по сути, тимлидом маленькой группы (компания была плоская, без иерархий, и можно было написать себе в трудовой хоть «Менеджер по связям с инопланетянами»), которая разрабатывала десктопный продукт, у которого на пике был один миллион пользователей. Конечно, 1 миллион это не 360 миллионов (примерная оценка числа пользователей FF), но всё равно очень немало. Поэтому я знаю по затронутой теме вещь или две. Мне, например, звонили среди ночи и рассказывали, как из-за одной строчки, неудачно затронувшей систему обновления, мы потеряли разом десять тысяч юзеров.


Была ли эта программа сопоставима с FF по технической сложности? Вполне. Мы, например, написали подсистему оформления (т.н. theming), дающую те же возможности, что и XUL. Только, на мой нескромный взгляд, лучше, чем XUL. Мы активно сами ей пользовались и исправляли всё, что нам не нравится. Но есть и ещё одна важная метрика — необходимость интеграции с ОС. В отличие от браузера, который хорошо изолирован, наша программа была вынуждена (по функциональным требованиям) плотно взаимодействовать с разными подсистемами виндов. Причём, такими, которые от версии к версии сильно менялись и даже полностью выбрасывались. Ничего не поделать, такие были бизнес-требования. Поэтому нам приходилось гораздо труднее, чем разработчикам Mozilla.


И что же мы делали? На тот момент роль Win 7 играла старушка XP (а последней версией виндов была «десятка»). Наши исследования показали, что 4% пользователей по каким-то своим соображениям до сих пор с неё не обновились. И мы не стали швыряться этими процентами, потому, что сорок тысяч пользователей (4% умножить на миллион) это очень много. У большинства разработчиков столько нет вообще. И если наша группа из нескольких разработчиков и двух тестировщиков это смогла, то компании типа Mozilla смогли бы и подавно. Причём, из этих разработчиков только двое (в том числе я) делали этот продукт фулл-тайм. Остальные разработчики и оба тестировщика занимались всеми продуктами компании.


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


  1. Выберите правильную платформу. Она должна быть переносима. Она должна быть надёжна. (Вот, например, компания Valve выбрала для своего Стима ненадёжную платформу в виде CEF, и теперь вынуждена просить своих пользователей уйти с Windows 7, хочет она того или нет. А лично у меня, например, портативная DIY-консоль для игры в Heroes 5, и кроме Win 7 она ничего не потянет. Что я буду делать через 149 дней? Наверно, плакать). Лучше всего, если платформа поддерживает сменные backends, например, OpenGL и Direct3D. Тогда вы сможете всегда поддерживать все ОС, где поддерживаются соответствующие бэкенды.


  2. Экранируйте с помощью #ifdef контракты (например, части интерфейсов), завязанные на функциональность, которой в соответствующих версиях ОС просто НЕТ. Если не подписываться под контрактами, которые заведомо не можешь выполнить, жизнь становится горазо легче, и это не только в программировании так.


  3. Напишите хорошие вспомогательные классы для динамического (времени выполнения) вызова функциональности, зависящей от версии ОС. Это статический класс WinVersion с методами IsXP(), IsVista() и т.д. Не повредят классы, которые абстрагируют GetProcAddress(). На самом деле, вся хитрость в том, что доля такого (опирающегося на уникальные особенности разных версий ОС) кода удивительно мала. Хотя, как я уже сказал, она в нашем продукте была значительно больше, чем у типичного десктопного продукта, особеннно такого, как браузер, который by design старается полагаться на ОС как можно меньше.


  4. Тестировщики должны быть няшами и писать план тестирования и автотесты. А на странице продукта (чем, кстати, не может похвастаться Мозилла) должна быть ссылка на форму отправки баг-репортов, генерирующая письмо тестировщикам. (Я очень хотел подписаться на эту рассылку, но наши тестировщики считали меня снежинкой и щадили мои чувства, боясь, что пользователи меня демотивируют их любить, и пересылали мне только письма, содержащие техническую информацию. Смешно! Все эти слова из фраз «@#$ ^&*$%^& @%#$^!» и «чтоб вас в $#%$%^$ @#$%, @##%%^& вы гады!» я ещё в детстве прочёл на заборе, а пользователей по определению можно только любить).



Если кто-то из читающих этот комментарий работает в Mozilla, приглашайте — поделюсь своим скромным опытом по проектированию, написанию и многолетней поддержке продуктов, работающих со всеми версиями Windows, а также научу любить юзеров и не закрывать глаза на фидбек.


2 ky0: спасибо.

Возможно. Но пока что всё, что я делал в FF 115, я продолжаю делать в FF 116. В частности, опубликовал этот текст и пишу этот комментарий.

Объясните, пожалуйста, как формальная верификация (ФВ) сочетается с проблемой остановки. Если в общем случае нельзя даже доказать, что программа не зависнет, то как ФВ вообще работает? Все наши программы принадлежат к какому-то отдельном узкому классу, или что? Спасибо.

Это очень широкий вопрос, тогда как StackOverflow отдает предпочтение более конкретным. Собственно, ответом на него может быть работа уровня диссертации.

В ответ на любой вопрос можно написать диссертацию, если есть писательский зуд и исследовательская жилка. Равно как и короткий ответ. Для примера предлагаю взять другие оптимизации: оптимизации HTTP, которые были актуальны лет 15 назад. Сколько я видел диссертаций, статей и т.п. на эту тему. А суть-то ведь простая. Там в основе один главный принцип — уменьшаем число соединений — и несколько приёмов (например, спрайты). Это очень конкретный вопрос, и мне не нужны подводки, графики и история исследований Хрома, начинающаяся со слова «Смеркалось».


Очень бы хотелось посмотреть на конкретную формулировку. Она может быть между "решите задачу за меня" до "как получить dom объект для вкладки хрома, зная pid этой вкладки".

Как два разработчика, мы оба, надеюсь, понимаем, что «получить dom объект для вкладки хрома, зная pid этой вкладки» это как раз одно из решений (потому, что pid легко получить из чего угодно, в том числе енумерированием, легко построить дерево для корневого процесса и дочерних, в соответствии с тем как устроен CEF3 и другие многопоточные Хромиумы). Меня это решение, разумеется, устроит и раз оно пришло вам в голову — значит с вопросом всё в порядке. Другое дело, что это решение к жизни, как мне кажется, вряд ли имеет отношение. Там же пулы и прочая такая техника. Вряд ли надо исходить из соответствия pid — :root. Если задача вообще имеет универсальное решение (в чём я не уверен), то оно, как мне кажется, скорее где-нибудь на уровне «послали message под виндой» или «подсунули свою dll». Я НЕ ЗНАЮ (поэтому я и спросил). А когда я не знаю, я стараюсь не строить вопрос, исходя из неверных допущений. А вообще, дёрнул меня чёрт написать, что хочу исходники Стима посмотреть.


https://stackoverflow.com/questions/1229131/how-to-declare-a-32-bit-integer-in-c
https://stackoverflow.com/questions/9278254/c-cross-platform-way-to-define-64bit-unsigned-integer

Во-первых. Мой вопрос закрыли не как дубликат этих двух, а как ненастоящий вопрос. Удивительно бесячая формулировка*, не находите? Особенно, когда вопрос для тебя самый настоящий.


Во-вторых, только во втором приводятся альтернативы (буст, что ещё хуже, и MS specific расширения, которые, кстати, выглядят хорошим решением… если только не нужна кросс-платформенность, хе-хе, из-за которой такие вопросы обычно и возникают). Но я понимаю, что пространство ответов ограничено реальностью, а не чьими-то желаниями. В любом случае, ответ «Я пытался и ничего лучше дурацкого инклюда не нашёл» меня бы устроил. А ещё больше меня бы устроило объяснение, почему до сих пор всё так печально. Потому что для меня это выглядит как невероятное упущение для начала двадцатых. Вот я думаю, в этом и секрет. Ведь такой ответ подразумевает критику языка и признание недостатков, а у кого-то, видать, сильно пригорело. Я на другом форуме потом спрашивал и там мне тоже ответили с плохо скрываемым раздражением: не нравится наш славный язык — не пользуйся. Но хоть сказали, что да, вариантов нет, придётся таскаться с этим инклудом.


UPD. *) Я перечитал бесячую формулировку. Она, как оказалось, ещё более бесячая. То ли они её потом поменяли, то ли это я такой невнимательный: This question is not reproducible or was caused by typos. By typos!!!1111одинодин Всё равно, что в лицо плюнуть. А ведь это наверняка стандартная формулировка из заданного списка. Toxicity is in their DNA. (А если кто-то скажет, что имела место первая часть, question is not reproducible, я сначала спрошу, как question вообще может быть reproducible, а потом добавлю, что это как раз и есть признак того, что SO это фастфуд и годится только для вопросов «как на языке Х сабстринг делать»).

Вам реально не нужно писать на SO, если хотите спросить, как на языке Х сабстринг делать. Приходите, когда что-то нетривиальное будет.

Какие есть принципы оптимизации CSS по перформансу? Известно же, что два декларативных SQL-запроса, дающих один результат, могут выполняться с чудовищной разницей во времени исполнения. Но про правила для SQL я знаю, где почитать, а про правила для декларативного CSS? Ненастоящий вопрос, закрыто.


Для IE когда-то был разработан инструментарий, который енумерировал все окна в системе, находил экземпляры браузера, подключался к ним и строил DOM. Есть ли такое для Хромиума? Как подключиться к его окну в готовой сборке для просмотра DOM, если автор при сборке не вывел DevTools наружу? Ненастоящий вопрос, закрыто, иди отсюда, грязный хакер.


Правильно ли я понимаю, что в плюсы так и не подвезли типы заданной битности? Есть ли альтернатива использованию int32_t с подключенным #include <cstdint> (меня удивляет зависимость для такой простой потребности)? Ненастоящий вопрос, закрыто.


Если у вас что-то нетривиальнее «как на языке Х сабстринг делать», SO просто не для вас. Он медленно деградировал с самого момента появления, когда там были интересные люди, а теперь, видимо, просто пересёк линию дна. Причём тут вообще какой-то ИИ?

В итоге половину лекции мы наблюдали обновления винды.

Надеюсь, вы многому научились.

Слегка нервирует, что наша планета всего в трех своих возрастах от всеобщего начала

Как же тогда будет нервировать то, что 95% всех звёзд Вселенной уже зажглись, и газа осталось на 5%.

Metotron0, --force-device-scale-factor, значит? Благодарю за ответ. Но меня смущает вот это =2. Я так понимаю, для 8K должно быть =4, а для FullHD должно быть =1. Пойду читать документацию, может это можно прописать без пачки условий.


RifleR, благодарю за ответ, о какой "функции изменения масштаба в браузере" идёт речь? О той, что выше, или transform, или ещё что-то?

Кстати, даже на 4К телевизорах интерфейс приложения будет FullHD — только само видео запускается в 4К.

Пользуясь случаем, хочу спросить. Как с этим в десктопных браузерах? Иными словами, можно ли прописыванием какого-то режима заставить Chrome на мониторах 4K/8K при масштабе dpi 100% в Windows отображать страницу полностью аналогично выводу на FullHD-монитор?

Крайне редко тут что-то пишу, но в данном случае не смог устоять.


2000-й или 2001-й год. Весёлое время WinAPI/ATL/MFC. А также Ultimate Toolbox, BCG, CodeJock и прочих улучшайзеров. Я ещё толком не знаю C++, но изучаю его по хардкору, на примерах из Direct3D (конечно же IM, а не RM) и пишу свой 3D Studio MAX, с блэкджеком, проекционным полиэкраном, импортом 3DS, окном свойств, редактором объектов и мегафичей — ТУМАНОМ.


Приложение написано за месяц, да вот беда — оно запускается слишком быстро, и сплэш-скрин с маскотом (низкополигональным ГНОМОМ), которого нарисовал коллега, не удаётся рассмотреть. А ещё на сплэш-скрине внизу есть компонент progress bar'а, который одна из библиотек (уже не помню, Ultimate Toolbox, кажется) слямзила из новинки тех времён, браузера Netscape Navigator. (Для самых маленьких радиослушателей: по горизонтальной полоске влево-вправо ездил серый градиент, точнее, его пик насыщенности). И его тоже не удаётся рассмотреть, что обидно вдвойне.


Тогда я добавляю в Init() кучу Sleep()'ов, но вдруг вижу, что градиент перестаёт ездить, а картинка при щелчке становится белой. Еду в библиотеку, зарываюсь в книжки, и узнаю, что есть, оказывается, такая штука — МНОГОПОТОЧНОСТЬ. И если сделать Sleep() в главном потоке UI, то градиент (как и картинка) перестаёт перерисовываться.


Архитектура срочно меняется на многопоточную. Заодно в свете новых знаний движок переписывается с нуля. И вот, наконец, сплэш-скрин висит секунд десять, всё тормозит, как в лучших домах Лондона и Парижа, сразу видно — СЕРЬЁЗНЫЙ ПРОДУКТ. Но чего-то не хватает. Чего? А вот чего: экран висит, градиент ползает, а индикатор жёсткого диска не моргает! Липа, короче. Фейк.


Штош, начинаю создавать в отдельном потоке кучу файлов и писать в них rnd(). Заодно узнаю, как правильно работать с папкой tmp, с каталогами юзерского профиля, что нельзя писать в Program Files и т.д. Опять переписываю движок.


Наконец, всё готово. Экран не только тормозит, но и отчаянно трещит жёстким диском. Ну прямо Microsoft Word и Adobe Photoshop. С этим приложением я иду в одну контору, показываю его на собеседосе, и меня берут, несмотря на малый возраст, писать софт для трёхмерной визуализации месторождений. Хэппи енд.

Я извиняюсь за оффтоп, а RSDN работает? Третий день выдаёт мне 404, а на почту приходят ответы, как-то, значит, на него заходят. Через Home?

Её будет определять эксперт в суде?

Её будет будет определять суд. Это и называется «судебная власть». Понятие, мало знакомое россиянам. Нет ничего страшного в том, чтобы избранный народом человек, которому доверяют, решал бы в каждом отдельном случае, пытался ты выдать игрушку за настоящее оружие или нет. Поскольку россияне по опыту знают, что суд не работает, они интуитивно начинают усложнять правила, расписывая количество заклёпок и оттенок RGB, начиная с которого подделка считается подделкой. Помогает это не очень.


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

Я думаю, что если бы большая часть приложений переехала на сервер, Chrome'у бы недолго осталось жить, как рендереру HTML. HTML на сервере рендерили бы чем-нибудь более вменяемым, что не тащило бы за собой такой чудовищный оверхед.

как же он на сервере всё это добро будет генерить? Увы, сложность не уменьшится, а переместится.

«Добро» генерирует не сервер, а разработчик. И он может захотеть просто не генерировать его. Как? А отдать, например, контекст/канвас в стороннюю библиотеку. Может быть, обернув его в wrapper. Всё это прекрасно работает, я могу хоть сейчас запустить по RDP что угодно, хоть WordStar через DOSBox. Потому, что RDC не задаёт глупых вопросов и не требует генерировать гипермедиа.


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


настоящая революция … обратная совместимость не позволит это сделать.

Обратная совместимость не позволит на сервере запускать сборку CEF, рендерить картинку и отправлять её клиенту? В том и прикол, что сделать это проще простого. Можно даже для начала только этим и ограничиться. Венчурные инвесторы, ау!

Я правильно посчитал, что плотность Бетельгейзе 1.42*18/(764^3) == 5.73E-8 г/см^3? Там как вообще реакции идут?

Information

Rating
423-rd
Registered
Activity