Пользователь
1,6
рейтинг
6 сентября 2010 в 23:07

Байки о несовместимых приложениях перевод

Это отрывки из бесплатной главы из бумажной книги «The Old New Thing». Они ничему не пытаются научить; это просто короткие забавные эпизоды из будней борцов за совместимость новых версий Windows со старыми приложениями.

Изменяем номер версии Windows


Изменить номер версии, который Windows сообщает программам, не просто, как кажется. Например, некоторые программы проверяют номер версии так:
UINT Ver = GetVersion();
UINT MajorVersion = LOBYTE(uVer);
UINT MinorVersion = HIBYTE(uVer);
if (MajorVersion < 3 || MinorVersion < 10) {
    Error("This program requires Windows 3.1");
}

Представьте себе, как этот код отработает на Windows 95, у которой номер версии 4.0. Вторая проверка срабатывает из-за того, что 0 меньше 10.
И ладно бы программа просто выводила сообщение об ошибке и завершалась. Многие рушились: очевидно было, что их поведение на «неподдерживаемых» версиях Windows никогда не тестировалось.

Таких программ оказалось настолько много, что мы перестали исправлять их по одной, и просто изменили возвращаемый номер версии с 4.0 на 3.95.

Программы для MS-DOS тоже не все гладко реагировали на изменение версии ОС. Это удивительно потому, что к тому времени у MS-DOS уже были десятки выпущенных версий и под-версий, и разработчикам пора было бы уже научиться проверять номер версии. Но например, один пакет программ использовал номер версии DOS как индекс в таблице функций: по собственной функции для каждой вышедшей версии. В таблице было пять функций: от MS-DOS 1.x до 5.x. Когда программа запускалась под MS-DOS 6.0, она вызывала адрес за пределами таблицы, и рушилась.

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

Сообщаем разработчикам о баге в их программе


Конкретно этот разговор вымышлен, но похожие по сути разговоры случались не единожды.

—Алло?
—Здравствуйте, это такой-то, из отдела совместимости Microsoft Windows. Мы нашли в вашей программе баг, из-за которого она не работала. Мы были вынуждены добавить в Windows 95 код для обхода этого бага, чтобы ваша программа продолжала работать.
—Замечательно, большое вам спасибо! До свидания. (Короткие гудки.)
(Набираем номер снова.)
—Алло?
—Алло, ээ… Вы даже не хотите узнать, какой был баг?
—Какая разница? Вы же всё исправили. Спасибо! Что бы мы без вас делали!
—Но, ээ, код в обход бага будет работать только с текущей версией вашей программы. Когда вы выпустите следующую версию, она не заработает.
—Вот оно как?.. Ну, подождите, я свяжу вас с нашими программистами.

Разработчики совершенно не обращают на вас внимания, пока вы не упомянете, что их программа перестанет работать.

Когда я занимался обратной совместимостью с программами для MS-DOS (в основном это были игры), часто бывало, что я звонил сообщить разработчикам, что их программа не работает под Windows 95. Многие разработчики отвечали просто «Так и есть, мы не работаем с Windows.»

Напоминаем пользователям действовать строго по инструкции


Сосед одного из наших разработчиков купил программу, которая рушилась сразу же при запуске. Разработчик и его коллеги начали со стандартной процедуры — меняли драйвера, запускали на другом компьютере — но ничего не помогало. Отчаявшись справиться с проблемой своими силами, они позвонили разработчикам.

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

Ставим телегу впереди лошади


Иногда в программах обнаруживаются такие жуткие баги, что непонятно, как они вообще работают.

Установщик одной популярной программы пытается заменить системный файл собственной версией. Он заменяет файл, даже если эта собственная версия старее, чем уже установленная в системе: установщик не заморачивается проверкой версий.
Отлично, система защиты файлов Windows внимательно следит за такими программами, и она восстановит правильную версию, как только установка завершится. Проблема не в этом.

Если системный файл, который установщик пытается заменить, занят, то установщик перезаписывает его с опцией MOVEFILE_DELAY_UNTIL_REBOOT — чтобы занятый файл заменился при перезагрузке системы:
// Код упрощен для ясности
MoveFileEx("sysfile.new", "sysfile.dll", MOVEFILE_DELAY_UNTIL_REBOOT);
CopyFile("D:\\CDROM\\INSTALL\\sysfile.dll", "sysfile.new");

Так и есть — программа пытается копировать файл, которого ещё не существует!
Этот код действительно работал на Windows NT, потому что там функция MoveFileEx, когда её вызывали с MOVEFILE_DELAY_UNTIL_REBOOT, не проверяла, существует ли копируемый файл. В бета-версии Windows 2000 мы добавили более строгую проверку параметров; теперь MoveFileEx возвращала ошибку. Установщик считал эту ошибку фатальной, и прекращал установку.

Пришлось в Windows 2000 разрешить копирование несуществующих файлов с опцией MOVEFILE_DELAY_UNTIL_REBOOT. MoveFileEx рапортует об успешном выполнении — в надежде, что ко времени перезагрузки копируемый файл действительно появится.

Самый странный способ проверки успешности вызова


Понятия не имею, о чём думали разработчики одной мультимедиа-программы, которая, проверяя успех вызова мультимедиа-функций, не сравнивала возвращаемый MMRESULT с MMSYSERR_NOERROR, а получала для номера ошибки текстовое описание, и затем сравнивала эту строку с «The specified command complete successfully.»
На самом деле, она сравнивала только первые шестнадцать символов с «The specified co» — наверное, кто-то просматривал код и решил оптимизировать это место.
В одной из версий Windows, когда мы немного перефразировали это сообщение, программа перестала работать. Нет нужды говорить, что на не-английских версиях Windows она никогда не работала.

Более странный, чем самый странный, способ проверки успешности вызова


Что бы вы думали? Есть ещё более странный способ. Как минимум, прошлая программа работала с возвращаемым кодом ошибки. Другая программа, которая пользовалась MCI для проигрывания видеороликов, полностью игнорировала значение, возвращаемое вызовом MCIWndOpen. Вместо этого она читала заголовок MCI-окна, и сравнивала его со строкой «No Device», чтобы определить, удалось ли открытие файла.

В Windows 95 заголовок MCI-окна при открытии файла устанавливался с небольшой задержкой. Теперь та программа не могла открыть видеоролики: она проверяла заголовок окна слишком рано.

Как допустить ошибку в функции из одной строчки


Однажды ко мне в офис зашёл сотрудник, и спросил: «Эй, хочешь звуковую карту?» Своей звуковой карты у меня не было, так что я согласился.

Оказалось, он отдал мне эту карту не просто так: ему не удавалось заставить её работать под Windows 95. Теперь не он, а я был неудачником со сломанной звуковухой. Вскоре я понял, почему он так хотел от неё избавиться: периодически она рушила всю систему. На моей машине была установлена отладочная версия Windows, так что я смог выяснить причину падений.

Разработчики драйвера для этой звуковой карты взяли функцию из одной строчки, образец которой приведён в DDK, — и им удалось допустить в ней ошибку.
Вот образец функции в DDK:
void FAR PASCAL midiCallback(NPPORTALLOC pPortAlloc, WORD msg,
                             DWORD dwParam1, DWORD dwParm2) {
  if (pPostAlloc->dwCallback)
    DriverCallBack(pPortalloc->dwCallback, HIWORD(pPortalloc->dwFlags),
                   pPortalloc->hMidi, msg, dwParam1, dwParam2);
}
Она вызывается системой при аппаратном прерывании.

Вот так выглядела эта функция в том драйвере:
void FAR PASCAL midiCallback(NPPORTALLOC pPortAlloc, WORD msg,
                             DWORD dwParam1, DWORD dwParm2) {
  char szBuf[80];
  if (pPostAlloc->dwCallback) {
    wsprintf(szBuf, " Dc(hMidi=%X,wMsg=%X)", pPortalloc->hMidi, msg);
#ifdef DEBUG
    OutputDebugString(szBuf);
#endif
    DriverCallBack(pPortalloc->dwCallback, HIWORD(pPortalloc->dwFlags),
                   pPortalloc->hMidi, msg, dwParam1, dwParam2);
  }
}

Они не только оставили в окончательной версии драйвера остатки отладочного кода; во время аппаратного прерывания они вызывают функцию, которую в этот момент вызывать нельзя. Если wsprintf выгружена из памяти, то система во время аппаратного прерывания получает новое прерывание «отсутствующий сегмент», — и всё, конец. Даже если повезло, и wsprintf находится в памяти — эта функция изменяет верхнее слово 32-битных регистров, а обработчик аппаратных прерываний сохраняет только нижнее слово. Это означает, что прерванный код ждёт весьма грубое пробуждение, когда обработка прерывания завершится.

Несмотря на всё это, звуковая карта получила награду одного популярного компьютерного журнала.
Но этим несправедливость не ограничилась: производитель карты хотел, чтобы в Windows 95 вошла новая версия их драйвера. И что же мы увидели в новой версии? Тот самый баг, рушащий систему — тот самый, который мы показали их программистам несколько месяцев назад. Как можно догадаться, новая версия драйвера в Windows 95 не вошла.

Редактор звуков и назойливый паразит


Нам попалась одна обучающая программа, паразитирующая на стандартном Редакторе звуков, и вцепившаяся в него так глубоко, что чем дальше мы её изучали, тем больше поражались.

Первая проблема была банальной: программа запускала Редактор звуков по имени его 16-битной версии, SOUNDREC.EXE. В Windows 95 Редактор звуков был 32-битным, и назывался SNDREC32.EXE — так же, как в Windows NT. Мы переименовали файл обратно в 16-битное имя, и полагали, что теперь программа заработает.

Но она не заработала. Успешно запустив редактор, программа ищет его окно по заголовку. Сначала она пробует найти английский заголовок, потом итальянский (программа разрабатывалась для итальянцев). Не так уж и плохо: многие разработчики вовсе не задумывались о поддержке локализованных выпусков Windows. Правда, итальянцы, живущие, скажем, во Франции, воспользоваться этой программой не смогут; но это не наша забота.
В Windows 95 заголовок Редактора звуков поменялся: мы добавили туда имя открытого файла. Теперь программа не могла найти окно редактора, который запустила.

Тогда мы поменяли заголовок 16-битного Редактора звуков, чтобы он в точности совпадал с заголовком, бывшим в Windows 3.1. Наконец-то программа запустилась. Мы проследили за ней, и обнаружили, что она никогда не пользуется запущенным редактором! Зачем же она его запускала?

Оказалось, в определённых условиях она им действительно пользуется. Обычно она проигрывает звуки при помощи специального компонента (видимо, это был VBX), который поддерживает асинхронные драйвера звуковых карт, но не поддерживает синхронный драйвер SPEAKER.DRV, позволявший на компьютерах без звуковой карты проигрывать звуки через спикер.
Разработчики искали что-нибудь, что сможет работать с этим синхронным драйвером, — и нашли Редактор звуков. Сымитировать нажатия клавиш в его окне — и готова дешёвая замена компоненту-проигрывателю.

Но если обратить внимание в момент запуска программы, можно заметить, как окно Редактора звуков мелькает и сразу же пропадает, оставив лишь полосочку слева экрана. Программисты не хотели, чтоб окно редактора было видно. Но они не знали, как сделать окно невидимым, поэтому они сделали всё, что было в их силах: «утащили» окно за пределы экрана. Ну, почти за пределы. Они не умели даже переместить окно программно, поэтому они имитировали клики и движения мыши, как будто перетаскивают окно за заголовок. Когда на экране остаётся только узкая полоска, которую мышью уже не утащить дальше влево, программисты считают свою задачу выполненной: «Мы убрали окно за экран — наверное, никто его не заметит.»



Советую глянуть заодно мой прошлый перевод — Любимый «железный» баг
Перевод: Raymond Chen
@tyomitch
карма
273,5
рейтинг 1,6
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (144)

  • –30
    Короче, все прелести закрытых исходных текстов. Вместо того, чтобы пропатчить и пересобрать, городят феерическую херню для закрытия чужих багов методом извращения своего кода.
    • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
        • НЛО прилетело и опубликовало эту надпись здесь
      • +5
        дак эклипс явно написали те же индусы про которых написано в этой статье. по крайней мере ошибки один в один.
        • 0
          ОК, придумайте другой способ отличать Sun JDK от какого-нибудь OpenJDK, кроме как по изучению их названия? Проверка нужна для того, чтобы задействовать специфические для каждой машины оптимизации.
          • +1
            Хм, а почему бы не через одно из этих свойств:

            System.getProperty(«java.vendor»);
            System.getProperty(«java.specification.vendor»);
            System.getProperty(«java.vm.specification.vendor»);
            • +2
              Именно через них и делалось.
              И java.vendor внезапно вернул «Oracle» вместо «Sun». Всё и поломалось — ожидаемо вполне.

              Где там чего именно от этого зависит и обломилось — не скажу сейчас нужно отдельно посмотреть.
              • 0
                именно с ваших слов из предыдущего каммента следует что в данной ситуации просто не должны были задействоваться некие оптимизации. а в данном же случае индусский код был таким индусским что приложение вылетало с ошибкой в полуобморочном состоянии, при том что ява была точно такой же и поддерживала те же функции. в большинстве более нормального кода о поддержке «оптимизаций» судят по самому факту существования этой поддержки, т.е. проверяют есть ли нужная функция, и если есть то она включается, а тут функции проверяют по наличию слова «Sun». эпично.
                И самое вопиющее что при этом вместо того чтобы исправить ошибку в эклипсе, оракел был вынужден делать специальную заглушку в жабе. Насколько же там индусский быдлокод.
                • +1
                  Заглушка — временная мера, чтобы дать время распространить исправления в эклипсе: https://bugs.eclipse.org/bugs/show_bug.cgi?id=319514
                  Патч пришёл через два часа после открытия бага.

                  Насколько я понял в ходе беглого просмотра, у JVM от Sun нужен какой-то свой, специфический метод выставления свойства MaxPermSize при загрузке. Этого не происходило, и программа вылетала.

                  К слову. Загрузчик Eclipse, как выяснилось, платформоспецифичен и написан на C, простая проверка через System.getProperty не подходит.
              • 0
                Нет. Делалось через анализ EXE файла.

                habrahabr.ru/blogs/eclipse/101847/

                Отдел инжиниринга при этом отмечает, что: в Java значения параметром java.vendor и java.vm.vendor не изменятся ни в одном из релизов jdk6 и будут по-прежнему иметь вид “Sun Microsystems, Inc.”. Было выяснено, что имя поставщика критически влияет на работоспособность целого ряда программ. А в Windows проблемой явилось явно указываемое для exe/dll поле “COMPANY”, которое и явилось источником проблемы.
                • 0
                  Спасибо, я тоже уже нашёл этот код.

                  Как конкретно связаны невыставляющийся MaxPermSize и функция IsSunVM(), не просветите?
                  • +1
                    Насколько я понимаю в сановской машине просто значение MaxPermSize по умолчанию слишком малое для Eclipse. Загрузчик пытается его увеличить. Код я не читал, так что не сажу о деталях.
          • +1
            Извини, но с такой логикой вам на полуостров индостан нужно ехать. Это хаки и костыли, причем очень грубые и грязные, от них запашок очень такой скверный разит.
    • +12
      Уверен, любому программисту доводилось извращать свой код, чтобы обойти чужие баги.
      • –13
        Разумеется. Но только MS это объявило своей идеологией. «Не уроним ни одного чужого бага, пусть у нас будет неразумная и кривая система, но тупая некорректно написанная софтина будет падать там, где всегда, а не сразу при запуске».
        • +12
          Если после апгрейда Windows перестала работать ваша любимая игруха, кого вы будете винить: хитрозадых геймдевов, обращающихся к ОС в обход всех документированных интерфейсов, чтоб выжать лишнюю пару фпс; или злого Билла, который «опять сломал софт конкурентов»?
          • –5
            Понимаете, у меня нет виндов, так что проблемы их апдейта меня касаются только в смысле ошмётков старой работы.

            А так, если я обнаруживаю багу, то я обычно её исследую и пишу багрепорт. Устраняется баг в том софте, где был допущен, а не где попало вокруг.

            Мне представляется, что исправлять баги в софте, а не подлаживать под баги операционную систему — это… ну… некое естественное поведение.

            Хотя, разумеется, я могу знать, что «после апдейта 2.6.34-3 у вайна ломается вывод иконок в игре, так что пока вайн не починят, я посижу на 2.6.34-3». Но опять же, это проблема именно багованного софта, а не всех остальных разработчиков.

            Про это я и писал в первом комментарии. Баги надо править там, где они есть, а не там, где получится.
            • +9
              Я понимаю, что в идеальном мире разработчики кушают радугу, не допускают багов, и оставляют исходники открытыми, чтоб их всегда можно было исправить.

              В суровой реальности пользователю всё равно, чей баг. Ему нужно, чтоб работали его программы. Он платит за то, чтоб программы работали. Если под новой ОС старые программы не работают, то её не купят.
              • +5
                кстати, на счет «платит»! если программа с багом бесплатная, то тем больше вероятность, что винить будут Windows, т.к. раз за нее уплачены деньги, то и спрос больше.
                • –5
                  Ага. И это проблема для виндов. Потому-то они и вынуждены творить херню.

                  Ведь нужно понимать, что все эти совместимости и специальные ошибки ради совместимости со старыми системами не бесплатны. Они сильно увеличивают размер кода, его сложность и неочевидность. Итог — больше багов, меньше фич. А реализованные фичи жрут больше процессора и памяти. Потому что линукс может себе позволить при компиляции выкинуть к ебеней фене тот код, который не нужен (вообще исключить), а МС вынуждена держать. Итог — объективное, неисправимое никакими методами, снижение производительности и рост размера бинарников.
                  • 0
                    Но и на старуху бывает проруха. Все помнят разборки и срач в LKML из за работы подсистемы TTY и отвалившегося kdesu?
                    • 0
                      Кстати, чем там закончилось-то, а то я запамятовал? У меня в памяти, что баг-таки починили, и кдешникам пришлось пофиксить kdesu, чтобы то работало прямо. Или склероз меня подвёл?
                  • +8
                    Вы правда уверены, что линукс мог бы себе это позволить, если бы он стоял на 90% десктопов в мире?
                    • –5
                      Да. Потому что в линуксах принята модель, когда ПО ставится из репозиториев и обновляется оттуда же. Смена какой-то фичи ядра привела бы лишь к необходимости обновить весь софт, завязанный на неё.
                      • +7
                        Вы живете в каком-то идеальном мире, где все ПО в репозиториях сразу будет проапдейчено после изменений в ядре.
                        И не надо говорить, что Вася Пупкин, который в жизни не написал ни одной строчки кода, сможет пофиксить баг в любимом медиаплеере, когда он отвалится в следующий раз, потому что у медиаплеера открытые исходники. Плевать Васе на то, какие там исходники.
                        • 0
                          Это сделает мейнтейнер. Мой опыт наблюдения за дебианом показывает, что все регрессии из-за фиксов багов исправляются в течение нескольких дней.

                          А в новых релизах всё это проверяется. Понимаете, в отличие от виндов, так не бывает, чтобы ОС обновлялась отдельно от ПО. Если кто-то захочет, он так может сделать, но штатно, у всех binary дистрибьютивов обновление ОС обновляет и ПО.
                          • +1
                            Это следствие того, что доля линукса — 1%, софта под него не очень много, потому мейнтейнер и имеет возможность проследить за этим. Если бы линукс занимал 90% рынка, софта было бы значительно больше и уследить за ним было бы просто нереально.
                            • –1
                              Доля линукса 1%? В продажах — да. В установках — разумеется, нет. Сервера, сотовые телефоны, эмбеддед железки, нетбуки, планшеты, десктопы, тонкие клиенты… Мне кажется, вы путаете долю продаж и долю установок.

                              А софта под линукс, за вычетом игр, более чем.
                              • 0
                                Ниже вам уже давали ссылку: www.netmarketshare.com/report.aspx?qprid=8&qptimeframe=M&qpsp=129
                                Это статистика посещений сайтов, а не продаж.
                                Более чем что? Более чем достаточно? Возможно. Но в сравнении с количеством софта под win — это капля в море.
                                • +1
                                  Ну как можно верить счетчику на отдельном сайте, да еще и узконаправленном? На Лоре вот доля линукса в разы выше и что?
                                  Если сравнивать количество ХОРОШЕГО софта, то разница уже не столь астрономическая. По сути дела для не искушенного пользователя есть аналоги для всего. Про профессионалов говорить не стану, для них стоимость винды копейки по сравнению с ценой софта, но таких же немного, не так ли?
                                  • +1
                                    About our Methodology:
                                    We collect data from the browsers of site visitors to our exclusive on-demand network of HitsLink Analytics and SharePost clients. The network includes over 40,000 websites, and spans the globe

                                    Где вы увидели отдельный сайт?
                                    Кстати, даже на ЛОРе пользователей винды почти 60%: top.mail.ru/oses?id=71642&period=0&date=2010-09-07&

                                    Сначала надо определить критерий, по которому софт считается хорошим.
                                    • +1
                                      А то и 70%, если взять полный месяц: top.mail.ru/oses?id=71642&period=2&date=2010-08-17&gender=0&agegroup=0&
                                    • –1
                                      И где тогда список этих over 40 000 websites?
                                      Я пока не увидел однозначных подтверждений объективности выборки

                                      >Сначала надо определить критерий, по которому софт считается хорошим.

                                      Ну выполняет он возложенные на него обязанности (в том числе быть простым и понятным) или нет?
                                      • +2
                                        Кругом враги? Всемирный заговор против Линукса? Кому вообще можно верить? :)

                                        Ну вы пока посчитайте сколько такого софта под линукс и сколько под виндовс, а я пойду поработаю :)
                                        • 0
                                          Какой заговор? Я ниже объяснил причину сильных погрешностей счетчиков. В логах апача на виденых мной сайтах несколько другие цифры, но увы, они не доступны публично.

                                          >Ну вы пока посчитайте сколько такого софта под линукс и сколько под виндовс, а я пойду поработаю :)

                                          А теперь сравните время затрачиваемое на поиск софта в Вин и в Лин… Ха, да в Лине софт в разы быстрее находится.
                            • –1
                              1% это в самых ангажированных счетчиках.
                              • 0
                                ввязались, так давайте доказывайте ангажированность
                                где неангажированные?
                                • +1
                                  Нигде, нет таких и нету никакой возможности точно подсчитать через интернет счетчики. К примеру подавляющее большинство пользователей мобильных браузеров да и почти все линуксоиды к чертям отрубают эти счетчики и они ничего уже не возращают.
                                  Более объективными могут быть логи апача, etc, но по ним мало кто публикует данные, и нет возможности собрать эти данные по всем сайтам.
                          • +4
                            >>Это сделает мейнтейнер
                            В идеальном мире — да
                            В реальном же после апдейта Ubuntu у меня отвалилась сеть. Натрахавшись с сетевой картой я поставил Висту :)
                            Как потом выяснилось, в том апдейте убунты мейнтейнер выкатил кривую сборку, и проблемы с сетью были у многих.
                  • 0
                    Объем этой «херни для совместимости» мал в сравнении со всем кодом.
                    • +1
                      Кстати, нет. Ко времени Windows 2000, код чуть менее чем наполовину состоял из заплаток, накопившихся ещё с MS-DOS.

                      Поэтому в Windows XP они выделили все заплатки из основного кода в отдельную базу, и обновляют её с апдейтами системы.
                      Теперь «херня для совместимости» — это небольшой универсальный компонент, который опознаёт программу по базе и патчит её в известном месте; никаких вывихов логики.
                      • 0
                        Ок, был неправ )
              • +3
                В этом и фича. Линукс денег не стоит, и развивается не исходя из вечной макйрософтовской драмы «новая ос будет как XP или как ME?» а из соображений общей гармонии. Итог — майкрософт вынуждена латать дыры за криворуких индусов (что только стимулирует индусов быть криворукими), а линукс может себе возволить менять ABI, если старое показалось по тем или иным соображениям не очень удачным.
                • +8
                  Все классно, но если взглянуть на xorg, то там примерно такой же бардак.
                  • –2
                    Есть такая проблема. Причина — очень специфичная модель и неготовность к смене архитектуры. Впрочем, некоторые подвижки есть, как только окружающие фреймворки окончательно стабилируются (хоть бы даже и d-bus, который всем не нравится), то есть вероятность перехода на следующую версию.

                    Впрочем, x-server это лишь одна из программ. В остальном — линукс имеет больше свободы для развития. А совместимость обеспечивается козырной фичей, которой нет у MS — ./configure & make. Которая позволяет в случае смены ABI не изобретать wow32, а просто пересобрать софт под новую платформу или новое API.
                    • +4
                      >или новое API.

                      Размечтались. При смене ABI то конечно одной пересборкой обойдешься, а вот если API поменялось то всё, нужно сырцы патчить.
                      • 0
                        Смена API — это проблема. Однако, в случае открытых исходных текстов она решается пробще, чем в случае бинарника (для которого всё заканчивается очередным wow, то бишь эмулирующей прослойкой).

                        Грубо говоря, майкрософт всё делает из кирпичей. Которые вынимаются из старого здания и вставляются в новое. И задача архитектора учесть форму кирпичей. А линукс — цельнолитое бетонное сооружение, которое отливается каждый раз заново. Эта разница не решит проблемы конкретного криворучки, не умеющего посчитать свод арки, но вот проблему «мне бы тут нужно 2 см, а кирпичи по 3, так что пусть тут будет 6 см, потому что 6 см кратно и 2 и 3».
                        • 0
                          А Вы, я вижу, перфекционист…
            • 0
              Мсье не вкурил, что описанное в статье относится к минимум десятилетней давности делам?
              • +4
                глядя на висту, я думаю это и по сей день актуально )
              • –2
                Но ведь майкрософт ЭТО поддерживает до сих пор, нет?
                • 0
                  95'е и 98'е винды давно канули в Лету.
                  Майкрософт и от поддержки ИЕ6 отказался (слава Аллаху!)
                  Правда, эволюция софта происходит и не так быстро, как хотелось бы.
                  • 0
                    Софт для 3.11 работает в 7? Если да, то поддержка по-прежнему есть.
    • +13
      Это прелести низкоквалифицированных «программистов», а не закрытости исходного кода.
      • +4
        Ага, только в открытом коде ты можешь после того, как вдоволь выматеришься, найти багу, исправить её и отослать патч разрабам со словами «вы что с ума там посходили?».
      • +3
        … И майкрософт прикладывает все усилия, чтобы кривые программы от кривых программистов продолжали работать. Вместо того, чтобы поощрять программистов, которые делают правильно.
        • +5
          Немалая проблема в том, что далеко не всегда программистам есть дело до своего софта (сделал и забыл). А вот MS очень важно, чтобы софт продолжал работать.
          • +6
            Тыг! Про это и речь. В случае ПО с закрытыми исходными текстами, если автор забил на ПО, то сколько бы пользователей не хотело им пользоваться, всё, сайонара.

            А в случае открытого ПО можно смело продолжать развивать ПО. Или в крайнем случае форкнуть. То же касается, кстати, и ситуации, когда софт начинает идти в bloatware — в случае софта типа windows 7 или nero остаётся только смириться, а в случае СПО можно форкнуть тонкую версию и бэкпортить только нужные фичи из «толстого собрата».
            • +1
              Вы можете написать тысячу постов о том, что ПО с открытым кодом круче чем с закрытым, но от этого последнего меньше не станет.
              • +3
                Грамотная идеология значит очень много. Вон, майкрсофот сначала игнорировала линукс, потом плевалась на него, а сейчас внезапно полюбила открытые исходные тексты.

                Сила опенсорса и свободного софта в том, что он не должен иметь «конкурентных преимуществ». Он должен просто делать то, что должен. Второй момент: можно купить конкурента, купить же GPL не получится. Это гарантия того, что софт останется доступным и его можно будет использовать даже если автор потеряет к нему интерес.
                • +1
                  Идеология это конечно хорошо, но она часто далека от реальности. Красивые игры (для примера) с хорошей графикой бесплатно делать никто не будет, поэтому они всегда будут с закрытым кодом и стоить денег. С другой стороны, если MS откажутся от поддержки большого числа игр в новой версии Windows, то она будет очередным «мастдаем» ни на что нигодным. Отсюда и рождается вынужденная совместимость, которая и спасает продукт.
                  • 0
                    Ну а что мешает допустим пилить GPL движок для игры, а сами ресурсы за деньги продавать?
                    • +2
                      иногда ничего не мешает, а иногда движок тоже может быть коммерческим продуктом и его разработчики желают кушать и отдыхать на островах.
                      • –1
                        Ну вот допустим есть крупная контора, она этих самых разрабов движка кормит/оплачивает и т.д. и сама же пишет игры на этом движке. Плюс можно сделать не весь движок с LGPL лицензией, а только базовую часть, а продавать уже приятные расширения.
                        • +1
                          ну это уже касается политики самой компании, но при вышесказанном варианте возвращаемся в началу — на базе открытого ПО будут продаваться доработанные вещи с закрытым ПО. Получается, что никуда от этого зла не деться =)
    • +12
      Но факт то остается, именно такой подход позволил винде занять свои 90%, победив os/2 и прочих.

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

        Закладка «Совместимость», апдейты со списком хаков для старых приложений…
      • 0
        Полуось — конечно. Потому что это был противник того же типа. Закрытый исходный текст ОС и приложений под неё.
        • 0
          не вижу, что сейчас открытый код, при всех его достоинствах типа возможности самостоятельно патчить, начинает побеждать закрытый
          • –3
            Скажите, вы пробуете анализировать цифры или нет? Понятно, что продажи системы, которую можно скачать и установить бесплатно, будут низкие. Вопрос в количестве установок, а не в сравнении «мы продали платных виндов больше, чем бесплатного линукса».
            • 0
              При чем здесь продажи?
              We collect data from the browsers of site visitors to our exclusive on-demand network of HitsLink Analytics and SharePost clients. The network includes over 40,000 websites, and spans the globe.
              • –1
                Т.е. меня они не считают? У меня как бы показ счётчиков и прочего мусора на веб-страницах отключен.
                • +1
                  Боюсь вас огорчить, но доля таких пользователей как вы в рамках статистической погрешности.
                  • –2
                    Почему вы считаете, что количество пользователей линукс с установленным adblock в рамках статистической погрешности? На чём эти цифры основываются?
                    • +5
                      количество пользователей линукс с установленным adblock порядка 300К: https://addons.mozilla.org/en-US/statistics/addon/1865 Если допустить, что пользователей Интернета в мире один миллиард, то это 0,03%
                      • 0
                        Туда входят те, кто делают sudo apt-get install adblock-plus?
                        • +1
                          Да. Это Active Daily Users а не количество скачиваний.
                          • –1
                            А данные об операционных системах там говорят, что Линукса 3%, а Макоси 4%
                            • +3
                              Это потому что там только пользователи ФФ. Учитывая то, что 70% пользователей Интернета сидят не под ФФ, то эти 3% — меньше чем 1% от общего количества. Плюс Хромиум, Опера и другие браузеры — получается 1% плюс-минус пару десятых.
                              • –4
                                Нет, автоматически не получается. Эти выкладки не более, чем демагогия.
                                • +3
                                  Я так понимаю, никаких обоснований, фактов и ссылок у вас нету?
                                  • –2
                                    Да пожалуйста, вот еще статистика с совсем другими цифрами (как раз полученными в результате анализа логов апача)
                                    www.w3schools.com/browsers/browsers_os.asp
                                    первая же ссылка в гугле, надо заметить.
                                    • +3
                                      Это статистика только сайта W3C — ресурса, на который ходят почти исключительно веб-разработчики. Она совершенно не релевантна.
                                      • –1
                                        А чем тогда более релевантны статистики, основывающиеся на непонятных счетчиках, которые любыми банерорезалками и кешированием выключаются?
                                        • 0
                                          Релевантность — это соответствие результатов реальной ситуации.
                                          Давайте возьмем такой пример. Есть 10 различных офисов по 20 человек. Решили получить статистику по использованию веб-браузеров в этих офисах и привлекли две независимые группы экспертов:
                                            1-я группа взяла из одного офиса (с программистами, к примеру) 40 человек
                                            2-я группа взяла из 9-ти офисов (в основном бухгалтеры, использующие ослик) по 10 человек (из которых двое не захотели идти)

                                          Итак, вопрос, какая статистика более релеванта?

                                          Я надеюсь вы поймете, что количество посетителей netmarketshare (и смежных сайтов) гораздо больше чем количество посетителей на сайте w3cshools. А еще я надеюсь, вы поймете, что процент использующих банерорезки тоже чрезвычайно низок.
                                          • 0
                                            Я первый раз слышу про эти сайты. Вот статистике гугля я поверю. А эти — кто они, что они — не видел, не слышал.

                                            (зато я видел статистику хабра — и там совсем другие цифры).
                                            • 0
                                              Ну да, хабр как бы айтишный ресурс и было бы глупо ожидать, что на хабре процент линуксоидов будет меньше 1%.
                                              А если вы хотите опровергнуть заявление «этих», то пожалуйста — давайте ссылку на другую статистику, но которая не берется с тематического айтишного ресурса.
                                            • 0
                                              Хабр — тематический IT ресурс. А по поводу верить/не верить — все решается очень просто: приводится ссылка на нормальную статистику взятую не с тематического айти ресурса.
                  • НЛО прилетело и опубликовало эту надпись здесь
          • 0
            Хаха! Юзеров iOS (iPhone) больше, чем линуксоидов. Ололо!
    • +2
      И еще, в те времена не существовало никакой инфраструктуры доставки апдейтов (интернета не было), то есть человек покупал/брал у знакомого программу, и следующий апдейт получал в лучшем случае после получения следующей мажорной версии.

      Как в этом случае работает ваша модель открытого кода?

      А сейчас… сейчас и в МСФТ и в винде все тоже очень сильно изменилось
      • –4
        ./configure & make. Я уже говорил. Технологию обеспечения совместимости ПО с тысячью разных юниксов придумали ещё до того, как Гейтс cp/m на 86 портировал.
        • +3
          как это сделать, если нет доступа к репозиторию со свежей версией?
          Каждому самому патчить?
      • +1
        Тогда даже уже в редхате сделали свой rpm, а в дебиане deb. Но даже тогда уже Линукс был беспомощным без интернета и как следствие весьма нераспространённым.
    • 0
      кстати, тоже согласен с амрао. Расскажу историю. Сделал я ошибку и решил использовать Виндоус для одной из систем, система должна была работать 24/7. И в одном из драйверов оказался баг, который подвешивал систему напрочь. Уверен, что баг в одну строчку, но исходники закрыты, пришлось городить супер систему со сторожевой собакой, которая автоматически делала ресет, когда дрейвер убивал всю систему. С другой стороны, работал я со встроенным линуксом, и в драйвере сетевой карты тоже был, баг, который вылечился до смешного просто, исправлением его в драйвере и пересборкой ядра.
      • +13
        >до смешного просто
        >исправлением его в драйвере и пересборкой ядра.

        Да уж, проще некуда.
        • 0
          я этим не занимался, но со стороны это выглядело так: мой коллега довольно таки долго гуглил, а потом исправил один макрос, дал команду что-то типа make и перепрошил прибор.
        • 0
          Вы, возможно, не поверите, но это проще, чем городить хардварно-софтварную «сторожевую собаку» для ресета.
  • +11
    Вот работа у людей — в чужих софтинах искать баги и способы их обхода в своей ОСи! :)
    • +1
      Это работа по увеличению энтропии и багов.
    • +3
      Если задуматься, то другого выхода просто нет. Люди не могут воспользоваться какой-то программой, потому что она косячная, но разве кто-то задумывается о таких глупостях? Все сразу во всем винят ОС. А ждать от некоторых разработчиков активности в исправлении своих ошибок не стоит. Вот и слышится изо всех щелей: «Microsoft Windows — один сплошной баг!».
      • –2
        Разумеется. Потому что из-за вот таких изгибов логики винды напоминают взыв на макаронной фабрике.
        • –1
          Как ба Вы ни плевались винды были, есть и будут.
          Остаётся просто смириться и не очень громко скрипеть зубами.
          • –1
            *бы
            Извиняюсь за косяки «быстрого» набора.
          • –1
            Ну, как я уже сказал, ошмётки моей старой работы всё ещё связаны с виндами. Но за вычетом этого меня просто не волнуют проблемы майкрософта (примерно так же, как вас не волнуют проблемы выхода новых версий z/OS у IBM).
  • 0
    интересно, в Apple этим занимаются — патчат ли Mac OS, чтобы вылечить баги сторонних программ?
    • +3
      Скорее всего быстро пропатчат для программ, которые очень популярны. Для продуктов Adobe или MS Office, например.
    • +1
      Совсем недавно Apple выпустил апдейт для Mac OS X 10.6 Snow Leopard, который устраняет ряд проблем со StarCraft 2, Team Fortress 2, Portal, and Aperture 3.
      • +2
        А вы уверены, что это был не косяк Apple например в openGL либе?
        • 0
          Логично, что если у разных разработчиков стороннего ПО один и тот же косяк под одной ОС, то виноват ни кто иной, как разработчик ОС.
      • 0
        > Portal, and Aperture 3

        Долго думал, потом загуглил, отлегло :)
    • 0
      они умудряются даже со своими программами на такие же грабли наступать
      так что ждем патча Mac OS :)
    • +2
      И да и нет. С одной стороны, как написано ниже, последний апдейт устраняет проблемы с игрулями и апертурой.

      С другой стороны, в первые недели релиза Snow Leo работать было невозможно — сломалось очень много софта, потому что у Эппл политика грубее — вот вам была бетка, там бы и отлаживали. А если мы, мол, сделали что-то deprecated, значит мы правда снесем это нафиг в ближайшей версии, избавляйтесь.

      Часто они наотрез отказываются исправлять чужие ошибки, как это было с очень глючащим с Expose фотошопом, где адобе напортачили с API и все мучались. (Правда в SL половина бага все же куда-то пропала)

      Идеологически-то они правы, но мне как пользователю было очень неприятно.

      Тем временем айтюнс обновился до 10ой версии, а всё ещё на старом API Carbon.

      • 0
        Зато Макось заметно быстрее грузится и вообще заметно легковеснее винды
  • +6
    В JVM очень интересный способ определения домашнего каталога пользователя под Windows. У меня рабочий стол находится в каталоге D:\Desktop\. Когда ставил Net Beans и Eclipse очень удивился, что они свои пользовательские файлы создали в корне диска D. Оказалось, что они берут путь к рабочему столу и поднимаются на один уровень вверх. Красота :) Пришлось перемещать рабочий стол обратно в Documents and Settings, а оттуда уже симлинк на старый каталог.
    • +7
      Zend Studio 7 под линуксом созадёт в /home/%username%/Documents/ очень весёлые папки:
      «C:\Documents and Settings\David Coleman\Zend\workspaces\DefaultWorkspace7» либо, ещё более смешную «C:\Documents and Settings\Администратор\Zend\workspaces\DefaultWorkspace».
      И это не wine-версия, а именно линуховая :)
      з.ы. ОС Kubuntu
    • +5
      почему-то другие программы на ява все делают правильно
      есть переменная окружения USERPROFILE=C:\Documents and Settings\${userName}
      так что это ваши нетбинсы и эклипсы виноваты ;)
  • 0
    Адаптируя свой код под код Идиота, вы пускаете его часть в себя.
    • +3
      Но и наоборот тоже, делая мир лучше. В этом и дзен.
  • +4
    «Изменяем номер версии Windows»
    Именно поэтому у Windows 7 версия, как ни странно, 6.1 :)
    • 0
      так вот оно что :)
  • –1
    Кастую Aux в тред.
  • 0
    Правильно. Карл украл у Клары кораллы — добавим в закон исключение для Карла, а то он в своей среде популярен, общественность вознегодуэ, если Карл сядет. Вася убил Петю — напишем Васе, что он сделал не очень правильно и, вероятно, переименуем пару статей уголовного кодекса, а то Вася не может найти их заголовку. Всё равно не находит. Значит, удалим эти статьи…
  • +3
    Замечательная статья, на одном дыхании читается.
  • 0
    Когда я занимался обратной совместимостью с программами для MS-DOS (в основном это были игры), часто бывало, что я звонил сообщить разработчикам, что их программа не работает под Windows 95. Многие разработчики отвечали просто «Так и есть, мы не работаем с Windows.»

    Как я понимаю, речь в статье про те времена, когда DOS был популярнее Windows. Поэтому спокойствие разработчиков игр вполне объяснимо. Непонятно, почему автор оригинального текста (который из Microsoft) эти заявления пытается представить как шокирующие
    • +1
      Разработчику говорят: «ваша прога могла бы работать ещё под одной платформой, но не работает из-за вашего бага.»
      Разработчик отвечает: «а ну и ладно, нам не очень-то и хотелось.»

      Речь же не о том, что Рэймонд предлагал сделать отдельную Windows-версию, а те отказывались.
      • 0
        Поддержка программы под новую платформу — дело серьезное. Как я понимаю, суть была в том, что они не собирались поддерживать свои игры под Windows в принципе. Не из-за одного бага, а из-за того, что, например, много где использовали особенности своей платформы (DOS).
        Хотя истинного положения вещей мы сейчас, конечно же, по одной фразе не восстановим)
  • +1
    что-то я не понял:
    кто ж вот так версию ОС проверяет?
    if (MajorVersion < 3 || MinorVersion < 10) { /* error */ }
    программист сам дурак в этом случае. зачем ж под них подстраиваться-то?

    должно быть типа так:
    if (MajorVersion < 3 || MajorVersion == 3 && MinorVersion < 10) { /* error */ }
    не?
    • +4
      потому что программист дурак, но

      — программой его пользуются
      — пропатчить программу затратно или сосвем невозможно
      — чтобы не вопили «новый виндовс все поломал» патч вставляют в виндовс
    • 0
      Нуда, но так некрасиво и править потом неудобно
  • +2
    Не забывайте, что не всегда баг в коде свидетельствует о том, что программист дурак.

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

    Даже если программист знает, что у него бажный компилятор и бажные библиотеки, у него часто нет выбора. Новый компилятор стоит денег, и скорее всего не окупится (особенно для продуктов Open Source!) Новая библиотека может быть несовместима с выбранным компилятором или с другими используемыми библиотеками, и так далее.

    Совсем недавно я видел живой OSS-проект, который собирается на MSVC 4.0 выпуска 1996 г.
    Другой пример — в Windows Research Kernel (урезанные исходники ядра Win2003 SP1) я видел заплатку для программ на VB6, хотя официальная поддержка VB6 к тому моменту уже прекратилась.
    • 0
      Ну у нас в коде бывает редко, но встречаются костыли для компиляторов, а что делать?
  • +2
    Мне кажется, некоторый народ не понимает, зачем вообще мелкомягкие пытаются встроить патчи для починки сторонных приложений в новой версии ОС.

    Это маркетинговый ход.

    Представьте, пишите вы новую ОС. Переписали с сотню функций. А оказалось, что есть 10-20% программ, которые использовали эти функции не стандартно. И в новой ОС они не работают. 10-20%. 100-1000 компаний. Вы представляете, как обьяснить 100-1000 компаниям и их пользователям, что теперь этот софт не работает в новой версии ОС потому, что он использует не стандартные подходы? Да зафукают!
  • 0
    Задумался, что иногда такая политика — когда любая программа, прежде чем оказаться в %аппсторе% проходит ревью автора платформы — оправдана.

    дисклеймер: я не люблю Apple, не эпплофаг и пр.
    • 0
      В Appstore отправляются не исходники, в бинарники. Поэтому там тоже нет никакой возможности оценить совместимость с будущими версиями ОС.
      • 0
        Ну уж такие вещи, как запуск «soundrec» и программные клики его кнопок они бы уж увидели :) И потом — я в приницпе о подходе, не только о совместимости с будущими версиями. О соответствии стандартам — вообще.
    • +1
      Собственно, Microsoft такую возможность тоже предоставляет.
      Можно сдать программу на проверку, и получить право налепить на коробку наклейку «Designed for Windows».

      Часто вы видели эту наклейку?
      • НЛО прилетело и опубликовало эту надпись здесь
        • +1
          Пишут, бесплатная.
          Best of all, there’s no charge to submit. Once your application passes the logo requirements, you simply submit for the logo and will begin receiving the benefits above.
          msdn.microsoft.com/en-us/windows/dd203105.aspx
        • 0
          > он должен обязательно (!) иметь bluetooth приемник и SSD-накопитель

          вероятно, речь там про SSD не шла. у меня в ноуте блутух есть, а SSD и не пахнет.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Здесь на лицо проблема MIcrosoft в обучении программистов. Надо бы им задуматься о том как лучше писать документацию, либо дополнить документацию большим числом примеров.
    Взять к примеру документацию по EXСEL VBA в Microsoft Office — это же надо так сухо и кратко давать материал без концепций программирования, что приходится большую часть примеров выискивать в интернете.
    Примеров не только мало их фактически нет.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.