Новая ОС от Microsoft с приоритетом на многоядерность

Новость можно прочитать здесь.

Цитата: "... вместо того, чтобы полностью изолировать программу от оборудования с помощью драйвера, в Barrelfish есть своего рода база данных, в которой хранится низкоуровневая информация об оборудовании. Ядро системы однопоточно и непрерывно. Планирование происходит одновременно с передачей сообщений, а получение сообщения просто активирует поток ожидания. В ОС также используются концепты микроядер, согласно которой драйвера выполняются в защищенной среде, например в L4."

- Похоже, что многопоточность реализуется по "правилу одного потока", которое следует применять при использовании Swing.

В Swing есть очередь выполнения, и есть диспетчер событий этой очереди. К этому диспетчеру событий мы можем обратиться из любого потока. Диспетчер событий просто поставит в очередь то действие, которое вы хотите чтобы оно выполнилось. Никаких обращений к компонентам Swing (хотя есть исключения, в частности некоторые read-свойства можно использовать) - только через этот диспетчер.

После постановки вашего действия в очередь событий, вы можете как "заблокироваться" на этом (дождаться выполнения, выполнение ведь, по своему характеру - является отложенным), а можете и асинхронно - выполнять что-то либо в программе, предполагая что в Swing-е со временем что-то изменится, то что вам нужно (иногда это очень удобно, например вы постоянно "пингуете" эту очередь, добавляя туда, например, новые данные индикации загрузки - на сколько система будет успевать - она будет изображать вашу индикацию загрузки).

Пример кода:

/* Без блокировки.
 * Если нужно с блокировкой, т.е. дождаться выполнения,
 * то используем метод EventQueue.invokeAndWait(...)
 */
EventQueue.invokeLater
(
    new Runnable()
    {
        public void run()
        {
            label.setText(percentage+"% выполнено");
        }
    }
);


Новая ОС, в дополнении к этому, по видимому применяет аналог транзакционной памяти, которую вводят в .NET 4.

В заключении скажу, что в J2SE 6 - добавили разработанный одним из программистов класс SwingWorker, который капельку упрощает пример, описанный выше (инкапсулирование + паттерн Template Method - проще говоря вам предоставляется метод для реализации задачи, и механизм для запуска всего).

Ну а все остальное вы найдете, как всегда, в Интернете прочитать более подробно можно в постоянно упоминаемой мною книге Хорстманна по J2SE 6 (в данном случае - в 1-ом томе ее).
Кому любопытно и кто кликнет по ссылке выше о книге - там уже появился в том числе и мой комментарий: :)

"Книга, конечно, хорошая, но объем 8-ого издания стал меньше на процентов 10%, чем в 7-ом издании (сравниваю по двум томам).
Опечаток больно много. Но, как написали ниже, все же не критично (но переводчику и корректору с большими ... ой, ушами - уши бы я открутил...)
"

Массовые недовольства среди IT-специалистов

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

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

 Вообще - что-то можно списать на осень (погода, и все такое), что-то можно списать на кризис - консолидация рынка, о которой упоминается в данной статье. Можно упомянуть о проекте Natal, который скоро будет доступен для приставки Xbox 360 и который через годик будет для PC и что большинство (если не все) крупнейших производителей игр - уже начали встраивать эту технологию в свои игры.  Можно упомянуть про дополняемую реальность. Можно сказать, что - всегда так было, что что-то отмирает, а появляется новое (один из евангелистов по Flash - перешел в евангелисты по Silverlight).

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

Поэтому... Будем надеяться на лучшее...

Ведущий специалист по АСР (автоматизированным системам расчёта)
Вакансия компании: Сумма Телеком
Создана: 17.09.2009
Регион: Москва
Требуемый опыт работы: Более 3 лет
Предполагаемый уровень месячного дохода: от 2 500  до 3 500  USD

Основные обязанности:

    * Техническое сопровождение существующей биллинговой системы.
    * Доработка программных модулей.
    * Внесение изменений в существующую информационную систему.
    * Внедрение новых услуг.
    * Написание и согласование ТЗ.
    * Подготовка отчетов из биллинговой системы.
    * Сопровождение процесса подключения клиента от поступления заявки до выставления счетов.
    * Координация работы между отделом продаж, техническими и административными службами.
    * Взаимодействие с филиалами, сопровождение и консультации.

Требования к кандидатам:

    * Высшее образование в области информационных технологий.
    * Опыт работы в телекоммуникациях (мобильные операторы, интернет-провайдеры, фиксированные операторы, системная интеграция).
    * Уверенное понимание ресурсной модели биллинга.
    * Знание других биллинговых систем является плюсом.
    * Понимание принципов бухучета
    * Уверенное знание unix подобных систем.
    * Навык работы с интеграционной шиной Jboss
    * Хорошее знанание Java, JEE
    * Хорошее знание PL/SQL.
    * Хорошее знание php.
    * Навыки в администрировании Oracle (Опыт работы Oracle DBA, знание архитектуры СУБД Oracle, мониторинг и оптимизация производительности БД).
    * Понимание ключевых бизнес-процессов в телекоммуникационных компаниях, включая биллинг, платежи, интерконнект, роуминг и их влияние на финансовую отчетность.
    * Свободное ориентирование в eTom и NGOSS.
    * Практический опыт разработки архитектурного дизайна информационных систем.
    * Практический опыт работы с действующей системой, оперирующей большими объёмами данных
    * Умение работать в команде.
    * Хороший английский, в т.ч. разговорный.

Ссылка: http://hh.ru/vacancy.do?vacancyId=2286425

Юмор белорусских программистов

О!!! Мы тоже как-то о РТС мечтали. Или пошаговой. Есть офигенные идеи. Например, сделать чудеса света - библиотека, телебашня, ледовые дворцы, спутник, и т д...

Ресурсы: крыжачок, сэм, нефть, и тд...

Слегка уже прорабатывали идею

Начинаем игру с управления колхозом. Цель игры - достичь президентского кресла, и продеражаться.

Уровень воровства в колхозе, уровень пьянства, взяточничества и тд...

Дарю идею... Кто сделает - озолотиться 100%. Главное - что бы не посадили раньше

IT в России. Мрачные перспективы

Вот уже и Молдавия планирует присоединиться к ЕС (ссылка).

Странно, что никто в ЕС не попирает ее государственность при этом, никто не говорит про "имперские амбиции" ЕС.

Никто странам Прибалтики не предложил присоединиться к ЕС только на условии, фактическом, присоединении их земель к Германии...

А ведь в Европе тоже деньги считают, как и в России. И все предкризисные годы в Европе жизнь только ухудшалась (в Германии, в Италии, массовые и постоянные забастовки во Франции).

Белоруссия в "полуотколовшемся" положении...

Петля медленно и верно сжимается...

Лично я, как белорусский программист, живущий и работающий уже года 4 в Москве - совершенно не хочу российского гражданства. А вот если Белоруссия присоединиться к ЕС - буду БЕЗМЕРНО рад.

Особенно после "молочной войны".

В два счета соберу свои манатки и буду жить в Европе.

А ведь я, именно я, когда-то, в белорусском Интернете - убеждал всех в гнилости белорусской оппозиции, убеждал в правильности подходов Александра Григорьевича... Теперь и сам Александр Григорьевич может "почесать тыковку" и перенять опыт всех своих соседей - будем жить братьями через границу, что ж такого, НАТО теперь к России претензий, фактически, не имеет, чуть ли не друзья уже навек, ну так и...

К слову - во МНОГИХ IT-фирмах Москвы - есть мои братья-белоруссы, которые работают программистами или начальниками среднего звена (а в верхушке, часто - вообще "южане", вы этого не знали? - поверьте мне, я многое повидал тут, сменяя языки программирования). - Думаю, что и они, остальные мои соотечественники - с удовольствием "свалят" назад в Белоруссию, если бы она вошла в ЕС...

Между тем в России, по официальным данным, в ближайшем будущем - будет нехватка 500.000 IT-специалистов.

Это без учета всего вышесказанного.

И без учета всего вышесказанного, по тем же официальным данным в России через 3-4 года - число студентов уменьшится в 2 раза.

Т.е. и тут надежды нет.

UPD 1. Публикация в новостях - "Молдавия выступает за углубление отношений с НАТО".

UPD 2. Публикация в новостях - "Председатель Европарламента: ЕС предоставит Молдавии финпомощь". Цитата - "Кроме того, ЕС начнет переговоры с Молдавией по новому соглашению об ассоциированном членстве."

UPD 3. Публикация в новостях - "В Восточной Европе растет политическая нестабильность".

UPD 4. Публикация в новостях - "Moody's отзывает рейтинги Молдавии".

См. так же - "Минск и Москва. Начало конца".

Тонкости программирования. Неконтролируемые исключения в Java

Вычитал у Хорстманна следующую вещь - в переопределяемом методе подкласса нельзя указывать throws, если у такого же метода суперкласса throws не указан.

Это то понятно. Нюанс вот в чем - если уж так сложилось, то на самом деле - можно. Речь идет о том, что в подклассе можно указать throws RuntimeException (это один из двух видов неконтролируемых исключений, 1-ый вид неконтролируемых исключений - Error).

Пример полностью корректного кода (проверил в Eclipse):

class AnyClass
{
   public static void main(String [] args)
    {
        System.out.println("AnyClass.main()");
       
        AnyClass anyClass= new AnyClass();
        anyClass.testInnerValue();
       
   }
 
   void testInnerValue()
   {
        InnerB ib = new InnerB();
       
        try
        {
            int iv = ib.getInnerValue();
        }
        catch (Exception e)
        {
            System.out.println("Test testInnerValue() is OK.");
        }
   }
  
   class InnerA
   {
        // В методе подкласса исключения throws нет.
        public int getInnerValue()
        {
            return 5;
        }
    }
   
    class InnerB extends InnerA
    {
        /* В переопределяемом методе суперкласса
        исключение throws есть. */
        @Override
        public int getInnerValue() throws RuntimeException
        {
            throw new RuntimeException("bla-bla-bla");
        }
    }

}

Еще Хорстманн пишет, что исключения, расширяющие RuntimeException - это исключения, свидетельствующие о возможных ошибках программирования (выход за границы массива и т.д.) и заведомое указание в коде перехвата ошибки выхода за границу массива - плохая практика программирования.

В данном же случае... Про то генеральная линия партии предельно четко в книге не обозначена, но из текста подразумевается, что "в крайнем случае, уж, вот так". И в самом деле - попробуйте применить полиморфизм к ссылочной переменной такого суперкласса и с неожидаемым, вдруг, исключением, если инстанцирован такой вот подкласс с хаками...

Электронное правительство 3. Тектонические сдвиги

В Госдуму внесен законопроект о введении электронного документооборота в бухгалтерском учете (ссылка) .

Несомненно, принятие таких законопроектов - позволит не только упростить нашу жизнь в будущем, но и... подсадить еще больше общество на IT-иглу (что не может не радовать лично меня, как IT-специалиста).

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

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

Электронное правительство 2

Похоже критика президента, показанная по телевидению, в адрес из рук вон плохой разработки электронного правительства (в сортирах никого мочить не собираются, но и - наверняка все это тоже имеют в виду) - придали верное направление бюрократической системе (рука тянулась убрать слова "после пендаля", но так и "не дотянулась" в итоге).

Список доступных социально-значимых услуг, которые должны вводиться в первую очередь - летом насчитывал 46 позиций, а сейчас - уже 73 (по состоянию на 18 сентября 2009 г.). Ну и вообще придали всему этому - системообразующий характер.

Для информации: всего социально значимых услуг у государства имеется 4 тысячи, и только к 2015 г. мы увидим в Интернете первые из них (пока собираются вводить - заполнение, ряда бумажек, по Интернету).

Более подробное - см. новость 1 и новость 2.

Parallel-Ax и Кей Хорстманн

Кей Хорстманн (Cay Horstmann) получил большую известность в мире Java-разработчиков благодаря своей книге по J2SE (Том 1 и Том 2), написанной им в соавторстве с Гари Корнеллом (Gary Cornell). Книга выдержала уже 8 изданий и до сих пор является одной из лучших.
Можно отметить и другую книгу, написанную Хорстманном (в соавторстве с другим автором) - "JavaServer Faces", но разговор сейчас не о ней.

В 8-ом издании вышеозначенной книги по J2SE - наткнулся на интересный момент в описании многопоточности (не поленился, открыл 7-ое издание - не так понятно этот момент описан), цитата (стр. 763 русского издания):

"Блокирующие очереди.

Теперь вы знакомы со всеми низкоуровневыми строительными блоками, формирующими основы параллельного программирования в Java. Однако в практическом программировании вы предпочтете держаться насколько возможно, дальше от низкоуровневых конструкций. Гораздо проще и безопаснее работать со структурами более высокого уровня, реализованными экспертами в области параллелизма.

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

- Другими словами речь идет о том, что с помощью ООП - можно решить большинство проблем, связанных с многопоточностью. Один из главных принципов - потоки обмениваются сообщениями (как у меня описано), ну а для реализации отправки сообщений - можно, часто, воспользоваться очередями сообщений (а вот тут можно дистанцироваться от конкретного поставщика, который предоставляет такие очереди и сервис по ним - например ребята из JBoss Community используют такие крайне правильные принципы в своих разработках). В контексте цитаты из книги - блокирующие очереди являются одним из решений (решения под конкретные задачи - могут быть и не c блокирующими очередями).

Я не придумал какие-то фундаментальные принципы, более того - в описании моей архитектуры Parallel-Ax указана, в разделе "Литература", - одна из отличнейших книг по архитектурам систем, основанных на обмене сообщениями.

Мне просто показалось странным, что люди упираются в какие-то "ворота", представляя все в "плоском 2D-измерении" (это имеет смысл при какой-то оптимизации процесса).

Вот я "взял и придумал", конкретное архитектурное решение.

ООП снимает покров мистической чудодейственной силы, приписываемой ФП, :) а теперь и (Хорстманну вы наверняка поверите больше, чем мне) убирает большинство проблем, связанных с многопоточностью.

Seam и Java-разработчики

Смотреть на мир как можно шире – естественное желание. Охотник ты, дичь, не столь и важно. Важно вовремя заметить объект, а уж затем поступать по обстановке. Бежать к или от.

И потому родные просторы внушают чувство сродни религиозному. Вот она, видимость миллион на миллион! Душа поет! Никто не подкрадется, не съест – по крайней мере, внезапно. Есть время дослать патрон в патронник. ...

Василий Щепетнев, "Компьютерра-online".

Купив за мая-август месяцы этого года примерно 200 учебников по IT-технологиям (есть свидетели - предыдущий начальник заходил домой, на тот момент примерно 120 учебников было) обнаружил, что тираж большинства из них составляет от 1500 до 2500 шт. И это в то время, когда одних только Java-разработчиков - сотни тысяч.

Я конечно не такой полиглот, да и, бывало, и по пол года ничего не учил...

Но мне искренне непонятно, почему так медленно ползет вверх процент использования фреймворка JBoss Seam среди JEE-разработчиков. Уж на что удобная вещь, придумать более качественное, полезное, легкое в использование и с потрясающими возможностями - по моему просто невозможно.

В то же время читаешь:

Вакансия компании: Luxoft
Создана: 10.09.2009
Регион: Москва
Требуемый опыт работы: Более 1 года
Предполагаемый уровень месячного дохода: не указан
Responsibilities:
  • Java system level development (for BEA Weblogic AS)
  • Application DEV, UAT and PROD support
Basic Skills / Knowledge:
  • Java, J2EE(2+)
  • Spring Framework(1+)
  • Hibernate Framework 2.x and 3.x (1+)
  • JDBC(2+)
  • UNIX (Solaris) shell scripting (at least one year)
Additional Skills / Knowledge (optional):
  • Struts 1, Wicket (at least one year)
  • Oracle RDBMS (at least one year, 2+ preferable)
  • BEA Web Logic AS (at least one year)
- Ну просто садомазохисты, люди. Помню месяц назад на ЛОРе вышел спор, что круче - Спринг/Стратс или JBoss Seam. Спор закончился очень быстро. Да тут и спорить то не о чем... И... что мы видим... Мазохистов стало меньше, но цифра все равно уверенно переваливает за 50%, но где-то останавливается у 70% (раньше - уверенно переваливала за 95%).

Когда ж будет мировое счастье... Когда...

Телепатия и программирование.

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

Ну... А во что он одет - я приметил... И, думаю - зайду днем в Скайп, сделаю вид, что сегодня у всех все угадываю... И опишу ему его одежду...

Сказано - сделано (программист сказал, программист сделал).

Добрался через пару часов до Скайпа... Пишу ему -- Сегодня у меня какие-то супер экстрасенсорные способности... Уже трех человек удивил. Угадываю, то что сам выберу - 100% вероятности.

Чем дело кончилось - вы уже догадываетесь! :) Угадал, 100%-ный результат. ;)

P.S. А вообще - раньше в самом деле часто по многим угадывал. Кое-кого из программистов, кого даже вообще ни разу в жизни не видел, только по Интернету общались - помнится, удивил - угадал часть его мыслей... Девушке однажды одной написал, забеспокоился ее внутренним состоянием (а я ее всего несколько раз видел, в компаниях, и все) - сказала что да - в 2 часа ночи пила шампанское и нервы у нее в ту ночь были на пределе... тютелька-в-тютельку совпало с моим описанием. Потом как-то угадал по соседу с подъезда, который перевелся в нашу группу в ВУЗе с заочного - предсказал, что он вылетит на зимней сессии. Сказал об этом только одному человеку, другу. Все так и произошло.
Помнится, давно уже правда - даже завел форум. Что - угадываю. Состояние человека и его будущее. Теоретически этот форум можно даже отыскать. Практически - лень. Да и давно уже не угадывал ничего...

Электронное правительство

Медведев уже не первый раз пендалей дает чиновникам, итак, что же мы имеем... вернее - что мы будем иметь в следующем году, потому что сейчас все вообще "никак".

Идем на сайт http://www.gosuslugi.ru/, который будет, в будущем (в светлом, само собой) - единой точкой доступа. Пока там заставка, но, как показали в итоговой программе "Вести" за эту неделю - там уже что-то есть (в закрытом режиме)...

И... что же там, что там пока тестируется? - С изумлением увидел в правой части экрана (просто представьте) - вертикальный список со ссылками вида "Скачать бланк" такой-то...

Это нас и ждет. Мы скачиваем бланк, заполняем его, и отсылаем "электронному правительству" по e-mail...

Плакать не нужно... Убожество решения видно невооруженным глазом. Почему, нет вы мне скажите - почему, почему нельзя сделать GUI для заполнения этих бланков?!

В руках государства и всех его структур - ВСЕ ПРАВА И ПОЛНОМОЧИЯ утверждать порядок предоставления информации.

Зачем, зачем обычному человеку - вообще знать, что есть "формат документа утвержденной формы образца..." - ?

Почему не в БД сразу заносить информацию? А от туда уже, если уж так чиновникам нужно - пересылать ее в формах установленного образца.

Что вообще нужно знать о гражданине - государству? - ФИО, дата рождения, дата выдачи паспорта. Все остальное - уже "дополнительная" информация, относящаяся к этому гражданину - рагистрация автомобиля, информация по налогам и т.д.

Почему нельзя сразу сделать авторизационную форму, с ФИО? Внедрить самые передовые методы по безопасности? Да даже туда обычный гражданин чтобы ничего особо не вводил - есть информация в БД, чиновники ею и пользуются. Гражданин прошел ТО со своим автомобилем - инспектор ГИБДД заносит в своем терминале данные, информацию.

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

Все бумажки как нужны были чиновникам, и как выдавались чиновниками - так пускай и "крутятся" между ними, если уж им так нужно.

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

Первыми программистами могли быть... динозавры.

Попалась на глаза презабавнейшая статья "Диван vs Коллайдер", в "Компьютерре-онлайн" (прежде чем читать далее - лучше ознакомиться с ней).

Автор выводит свою "теорию" гибели динозавров, основываясь на, возможно, непостоянной гравитационной составляющей, присутствующей в нашем мире.

Идя "впереди мысли" автора статьи, можно предположить, что из-за огромной величины мозга динозавров - они могли:

а) Погибнуть, все, из-за ментальной войны между ними. Если вы когда-нибудь "натыкались" на слова "и волшебники вели ожесточенную войну друг с другом, пока, в результате, почти все не погибли в ней" - то вы поймете, о чем я...

б) Огромная величина их мозга - могла быть причиной многих неразгаданных загадок наших дней. Кто "придумал" пирамиды? Откуда у множества человеческих цивилизаций древности - были открытия и знания, до которых современная наука додумалась только совсем недавно? - Вы, наверное, читали про подобные, слабо объяснимые факты развития науки и других областей знания, которые были у древних, если иногда смотрите фильмы в духе "загадки исчезнувших цивилизаций". Даже если полагать, что мозг динозавров был несовершенен - все равно огромный компьютер мог давать сравнительно неплохие результаты. Если предположить, что древние человеческие цивилизации использовали открытия именно динозавров (вариант с инопланетянами даже более неправдоподобен), то динозавры должны были использовать какие-то считающие устройства. Вполне возможно, что специфика развития их - могла привести и к появлению таких методов подсчета (программирования) - о которых мы ничего не знаем... А может и знаем, возможно древнейшие математики - получили некоторые начальные знания, или готовые концепции - от исследователей той эпохи, которые приносили "умным людям" (математикам) - какие-то артефакты или иные свидетельства некоторых открытий / знаний.

Древние компьютеры вообще могли состоять из органических материалов (мы к этому сейчас только подходим), поэтому и не уцелели до наших дней. К тому же человечество сейчас вовсю озабочено энергосбережением (70% - 90% анонсов компьютерного "железа" сейчас пестрит упоминаем этого, прямо всеобщее помешательство какое-то, видать тайфуны достали таки США до "самого-самого"), а так же применением утилизируемых материалов и конструкций, содержащих их.

P.S. Лично у меня с детства была голова немного больше, чем у других. Вот я и намякиваю... ;) Что объем мозга динозавров мог приводить к каким-то "последствиям" этого, ведь не так много нужно мозга, чтобы обсчитывать кол-во лиан и деревьев на пути, куда-то должно было "деваться" остальное...

UPD 1. Смутно припоминаю, что за последние 7 лет - где-то мелькнула новость, на счет компьютеров динозавров. Какая-та часть его уцелела, вроде. Что-то такое говорилось, что определили возраст устройство, и, по видимому, это только часть устройства. И что-то говорилось на счет органического происхождения, возможного, всей конструкции. А эта часть не то окаменела, не то в пластах там чего-то... Возможно описание было такое - что-то, напоминающее дудку, с отверстиями. Возможно это отнесли к вспомогательному устройству (если честно - совершенно не помню, но что-то вот близкое или напоминающее это...)

UPD 2. Смотрю фильм "Мерлин и война драконов". Драконы всегда обладали магией... по сказаниям... и Илья Муромец, или кто там - с драконом воевал... Хм...

Parallel-Ax

Логическим продолжением цикла статей-обсуждений "Многопоточность - проще не бывает" - стала "консолидация" всего материала и описание его в Викизнаниях.

Ссылка на Parallel-Ax.

UPD 1. Смотри также "Parallel-Ax и Кей Хорстманн".

Многопоточность - проще не бывает 3.

(Начало статьи - смотрите в 1-ой части и во 2-ой части).

Другими словами, та проблема, которая перед нами стоит - это как эффективно использовать многоядерность процессоров и потоков данных. Потому что тактовые частоты процессоров уже почти не получается увеличивать, на данный день, чтобы обспечить этим основной прирост производительности. Вот я и предлагаю - перейти к асинхронной модели программирования на потоках. Взаимодействие между которыми - событийное. Это сразу решает большинство проблем, связанных с многопоточностью. Да и... а как оно в жизни то - один программист - прочитал 1 учебник за год, другое - 4 учебника. - Конечно их пути развития - асинхронны, их нельзя свести к одинаковой величине через год. И что нам тут мешает? - Да практически ничего. Организуем ветки, петли выполнения программ, на каждом потоке. Включая и то, что, популярное нынче "низкрогранулированное" "решение" построения фреймворков - представляет собой набор подсистем. Почему каждая из подсистем - не может "крутиться" в своем потоке, вот вы мне скажите? При событийной модели (и такие примеры, отличнейшие, правда пока без такой многопоточности) - уже есть - взять фреймворк JBoss Seam. - Типичнейший пример, с отличной системой генерации событий и "низкогранурированностью".

Значит проблемы нет? Раз уже есть "подходящие" фреймворки, которые могут задействовать сотни потоков одновременно.

Вы хотите сказать, что есть, например, такие высоконагруженные операции, как вывод графики, и как же тогда там? Что значит - "высоконагруженные операции графики" - вы ДЕКОМПОЗИРУЙТЕ задачу. На сотню отдельных составляющих. Каждая из которых будет крутиться в своем потоке. Нужно отрендерить "задний план", на картинке? - Пускай это сделает отдельный подузел. Если у нас есть 50 потоков для рендеринга заднего плана - декомпозируйте еще. Вплоть до обсчета 2x2 пикселя в левом верхнем углу одним из них.

Вы хотите сказать - а как же эффекты, как же - текстуры, накладываемые после, как же - шейдеры? - Блин, ну а как же организован конвейер на любом заводе? Есть 10-100 автоматов, каждый из которых - "существует в отдельном потоке" (в свою очередь каждый такой автомат - может состоять из еще - множества различных узлов его).

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

А если нужно преобразовать какой-то сигнал, то можно поделить его рабочую частоту - на кол-во доступных потоков, чтобы каждый "обсчитывал" свою часть.

Первое правило - декомпозиция, как метод борьбы со сложностью. Ну и запускайте каждый "декомпозированный" элемент - в отдельном потоке. Если у нас может быть, иногда, 25 потоков, для какой-то подсистемы, доступно, а может быть что и 450 потоков будет доступно (на каком-то там готовящемся к выходу процессоре) - пожалуйста - заложите в конструкцию, что если 25 потоков - то Система декомпозируется на 12 подсистем + еще 13 потоков можно "передать" на декомпозицию некоторым из них. Если у нас 450 потоков - тогда 12 подсистем (на деле, каждая из которых еще декомпозируется на сотни более мелких) - большинство из них получат свои потоки.

Тут уже и архитектура вырисовывается... новых фреймворков...

Многопоточность - проще не бывает 2.

1-ая часть статьи, "протестированная" в "узком" кругу, побудила сразу написать 2-ую часть статьи, которая будет состоять из "пояснений", а не обзоров других задач по многопоточности, как я планировал сначала...

Итак. В чем же проблема, связанная с многопоточностью.

1) Любой объект, у которого есть внутренние переменные, потенциально может хранить состояние данного объекта.

2) Если объект может сохранять свое состояние, то тогда он потенциально "потокоуязвим". - Представим объект Муж. Который принес зарплату. И у которого, незаметно для него, вынимает часть этих денег - объект Жена. Объект Муж утром пошел за покупками, а денег то - уже нет...

3) Именно поэтому функциональный язык программирования F# и "отлично подходит" для работы с многопоточностью - там нет постоянных объектов с внутренними переменными в них - есть только методы (содержащие локальные переменные "на стеке"). Нет сохраняемых данных - нет и проблем с синхронизаций. Вообще я почти не знаю F#, но уверен, что основное "преимущество" его, в вопросах многопоточности - именно это. - Но, согласитесь, что это - извращение в самом прямом смысле этого слова. - Они бы еще от компьютеров отказались, не только от классов, лишь бы "не было проблем с многопоточностью". :)


Решение проблемы.

1) Я предлагаю - не "барахтаться" в терминах "вот у нас есть функция, она, де, изменит данные, состояние объекта". - Я предлагаю не хранить деньги в карманах объекта Муж, а создать НАДО ВСЕМ ЭТИМ (с делегированием полномочий) объект СемейныйСовет. Который и будет давать добро или отказывать - на те или иные финансовые операции в семье.

2) В объекте СемейныйСовет будут свои внутренние данные (локальная база данных, образно говоря). Которая будет в поддержку "системе принятия решения".

3) "Фишка" в том, что у нас уже НЕТ разделяемых данных (карманов объекта Муж). - Объект СемейныйСовет накапливают всю информацию о текущих финансовых операциях и сам все решает - на что, куда и как. Именно в объекте СемейныйСовет ЕСТЬ все данные, необходимые для принятия решения (но не сами деньги).

4) СемейныйСовет - действует по "событийной" модели - дал добро на покупку пиццы, или отклонил покупку мороженого.

5) Еще раз. Потоки САМИ НЕ МОГУТ просто вот так брать данные из РАЗДЕЛЯЕМЫХ между несколькими потоками данных. Они сначала должны получить "добро". При ЗАПРОСЕ на ИЗМЕНЕНИЕ разделяемых данных - управляющий объект ДОЛЖЕН УЧЕСТЬ общую ситуацию в системе. А потоки - должны быть готовы, что может быть добро, а может быть и отказ (с соотв. обработкой таких ситуаций). Или же управляющий объект - ПОДСКАЖЕТ - что же делать. Вы видите, что мы разделяем, декомпозируем сложность. Управляющему объекту, в этом месте - мы дадим бизнес-правила, как же он должен поступать, как оценивать ситуацию.

Многопоточность - проще не бывает.

Понимаю, что проблемы века - только мне решать одному, давайте тогда решим их.

Мне кажется, что все эти семафоры (из устаревших подходов), транзакционная память (из более новых, в mainstream-программировании) - имеют под собой одну нехорошую черту. Все это - пережитки тех мастеров жанра, кто до сих пор мыслит в... функционально-процедурном стиле программирования...

Давайте раскатаем их "в губу" и покажем преимущества ООП-подхода.

Задача 1.

1
Есть объект Поставщик и есть объект Потребитель.
2 В каждом из них - есть по одному полю данных (любой объект может состоять из двух вещей - данных и методов работы с этими данными).
3 Требуется организовать обмен данными между этими двумя объектами. Проще говоря - когда у Поставщика его поле становится равным 1 (т.е. у него что-то есть) - это значение нужно "перебросить" Потребителю. При этом, после "переброски" - у Поставщика значение этого поля становится равным 0.
4 При этом Потребитель не должен ждать, он должен "что-то свое делать".

Решения:

1.1 Когда у Поставщика появляются данные - он "шлет" сообщение Потребителю. Потребитель забирает данные, обнуляет соотв. поле у Поставщика. Паттерн "Observer" ("Наблюдатель"). Все. Все, задача уже решена.

1.2. То же самое решение, что и 1.1, отличие только в том, что используем, в добавок, паттерн "Command". Чтобы инкапсулировать передачу данных (тогда можем "прямо и пересылать, сколько нужно, какую-то величину, например"). Можно еще использовать, при этом, паттерн "Object Value" (Фаулер пишет, что по поводу "Object Value" - могут возникать разночтения - есть два разных паттерна, названных так).


Задача 2.

Та же самая задача, что и задача 1, отличие только в том, что, пускай еще будет 1 объект Поставщик. Итого - 2 объекта класса Поставщика и 1 объект класса Потребителя. Потребитель должен "забирать бабло" у обоих Поставщиков.

Решения:

Те же самые, что и к задаче 1.


Задача 3.

Та же самая задача, что и задача 2, отличие только в том, что есть еще один объект Потребителя. Итого - 2 объекта класса Поставщик и 2 объекта класса Потребитель. Ну и есть какое-то правило - как, когда и сколько - должны забирать данные объекты Потребители.

Решения:

Те же самые, что и к задаче 1 + нужно добавить диспетчеры, координаторы или еще что хотите - на любой вкус и цвет. Здесь нужно отметить, что есть ОЧЕНЬ много паттернов проектирования, относящиеся к системам, основанным на обмене сообщениями. Да хоть очереди сообщений тут внедряйте, да хоть - пускайте тестовые сообщения, - к ним еще дроссели прикрутите к системе, можете добавить пулы, можете добавить балансировку нагрузки - ну о-о-очень много вариантов реализации, на любой вкус и цвет...


Слышу голоса -- А где же потоки??? - Ладно, будут вам и потоки...

Задача 4.

Есть объект Склад. На который "складирует" объект Поставщик (выполняющийся в своем потоке) и с которого забирает данные объект Потребитель (выполняющийся в другом потоке).

Решения:

Те же самые, что и к задаче 3.


Задача 5.

То же самое, что и задача 4. Отличие только в том, что у всех-всех-всех объектов - есть по 10 полей данных (мука, кукуруза, сгущенка, хлеб и т.д.) Требуются какие-то скоординированно-согласованные действия.

Решения:

А как же в жизни то бывает? - Есть некий нач. склада. Который принимает квитанции о приходе, принимает квитанции об убытии. И "рулит" все правила. - Кому, сколько, когда. Другими словами - нужна целая подсистема, которая будет рассылать события и в которой и будут "прописаны" все правила.

А теперь - типичная "функционально-процедурная постановка" задачи про "сложности" с многопоточностью:

"Рассмотрим, например, класс, реализующий набор банковских счетов. В этом классе имеются две безопасные для потоков управления операции Deposit и Withdraw, предназначенные для зачисления денег на счет и снятия их со счета соответственно. Предположим, что требуется произвести композицию этих операций в безопасную для потоков операцию Transfer, которая переводит деньги с одного счета на другой. Промежуточное состояние, когда деньги сняты с одного счета и не зачислены на другой счет, не должно быть видимым для других потоков управления (т.е. перевод должен быть атомарным). Поскольку в операциях Deposit и Withdraw счет блокируется только на время их выполнения, для правильной реализации операции Transfer требуется понять дисциплину блокировок, используемую в данном классе, и изменить ее путем добавления метода для блокировки всех счетов или какого-нибудь одного счета. Последний подход позволяет выполнять параллельно операции переводов с разными счетами, но при этом появляется возможность синхронизационного тупика, если выполнение операции перевода со счета A на счет B перекрывается во времени с выполнением операции перевода со счета B на счет A. "

- Другими словами, авторы примера - объединяют 2 атомарные операции - в одну (снятие денег с одного счета + зачисление денег на другой счет = перевод денег), при этом, само собой - сложность увеличивается (в противоположность декомпозиции сложности, как методу решения задач). Само собой, если думать в 3D-измерении (а не "размазывать" все в 2D-измерении), то нужен какой-то НАДО ВСЕМ ЭТИМ - управляющий центр. У которого должна быть система правил. Авторы про это и намекают, вернее - задаются мыслью ("требуется понять дисциплину блокировок ... и изменить ее"), что чего б такого придумать, в данной ситуации.

Управляющий центр операции перевода денег. Центр. Объект. Координатор. В который закладываем систему правил. Возможно и как "конечный автомат".

Центру поступила команда -- "Перевести с одного банка 100 долларов на другой, но убедиться, и соблюсти. Что деньги перечислились. После этого уже - инкремировать один счет и декримировать - другой счет".

Ну и что может быть проще?

Центру поступил event (событие). Центр послал event одному банку, с номером ТЕКУЩЕГО трансфера и Центр послал, одновременно - второй event, второму банку, с номером все того же ТЕКУЩЕГО трансфера. Один банк прислал ответ - "Деньги получены!" - Хорошо, ОК, теперь Центр шлет обоим банкам еще по одному событию, чтобы реально уже списали/зачислили.

На деле механизм событий может быть оптимизирован ("размазан в 2D") - если точно известно, что эта операция - высоконагруженная, тогда чтобы симитировать события - можно воспользоваться несколькими регистрами. Если они принимают какие-то значения, значит "что-то состоялось". Если они в состоянии "не определены", значит операция еще "в процессе". При чем, как мне кажется - можно использовать именно группы таких регистров (переменных). - Все вместе они будут характеризовать состояние операции (грубо говоря - это что-то вроде мини-СУБД, к которой может обращаться Центр и "считать себе", анализировать, что ему надо).

А знаете как на деле происходит, если, например, вы расплачиваетесь кредиткой Visa Electron от Альфа-банка (не забыть сгрести от них бабло, за рекламу) - чтобы купить что-то в Интернете на одном из аукционов или просто какую-то книжку в Интернет-магазине?

- А происходит вот что - вы кликнули на сайте на кнопку покупки, далее Альфа-банк замораживает у себя сумму, эквивиалентную сумме вашей покупки. После этого банк и Интернет-магазин - производят свою банковскую операцию. Если все удачно, то у вас эту, ранее замороженную сумму - списывают. Все, ее уже нет. Если же что-то "пошло не так" - трансферинг денег между этими платежными системами - будет отменен. И вашу эту сумму - разморозят. А замораживали ее для того, чтобы вы не накликали на миллион долларов. И потому что операция перечисления денег - не мгновенная (это в теории только - два байта переслать, на деле нужны еще всякие подтверждения).

- Так вот. Бизнес-требования банка, к данной операции - известны. В данном случае управляющий объект, Центр координации - расположен в банке. Это его правила - замораживать сумму, или нет. Вы только, образно говоря - запустили всю программу на выполнение (метод main()).

Какой-то банк - еще и письменное подтверждение ждать будет. Или если Вы перечисляете 1.000.000 долларов - то Вашего личного присутствия будет ждать. И подписи. А не просто "клик-клик" по Инету. А могут быть еще и всякие федеральные органы, регулирующие права "хозяйствующих субъектов". Банк еще может и аудиторам свой отчет слать. Ну и т.д.

Если у вас что-то не совсем сложилось в голове - как это все запрограммировать - то спрашивайте, не стесняйтесь. Лично мне так сразу понятно, как и что...

UPD 2. Вышло продолжение, 2-ая часть статьи.

Человеческий фактор и SQL.

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

А у меня сразу вопросы:

1) Разве известен объем дисковых накопителей, на этапе разработки enterprise-проекта, что можно уже "мерять" и "примерять"? Да пока разработка завершится (структура СУБД проектируется отнюдь не в последние дни, обычно - в первый, максимум - во второй месяц разработки) - доступное решение, по емкости, может быть в 1.5 раза выше, чем можно "наблюдать сейчас". Тем более во многие проекты стараются закладывать "переносимость", по СУБД. Т.е. вообще ничего по емкости не известно (в контексте самой задачи).
Кто-то хочет сказать, что уже "есть готовый сервер" под СУБД? А когда он наполнится, данными? Через год, сразу после завершения проекта? Разве? Через 2-3 года, "если проектировать безвольно, не учитывая". Что значит "не учитывая"? Кто ж проектирует, не оптимизируя? Вопрос в том - что значат эти подсчеты? Плавно переходим ко 2-му пункту.

2) Ну, хорошо, система проектируется из расчета - 1.500.000 пользователей. И? Что значат подсчеты? Подсчитывается, обычно, все по нескольким таблицам. На первом месяце разработки. А кто подсчитает ВСЕ ОСТАЛЬНОЕ? Когда бизнес-требования изменятся? Разработка ведь - носит (в наши времена) - в большинстве случаев - итеративный характер. Что можно считать НА ПЕРВОМ МЕСЯЦЕ разработки? Ну вот что?
Это все равно, что на первом месяце разработки - прикидывать, в уме (на листике) - закрома Родины через 4 года. Ну столько факторов, которые могут все увеличить в 2-3 раза, или уменьшить - что просто не передать словами. Цену на нефть кто-нибудь знает, какой она будет через 2 года? И сколько миллиардов инвестируется в отечественный автопром - через 3 года? Точную цифру назвать можете? А, что так? Слабо на листике подсчитать? Достаточно сказать, что колебания курса на рынке Форекс - уже сама по себе нетривиальная функция. На которую нужно опираться, в расчетах.
Так же и здесь. 1.500.000 пользователей в таблицах user_accounts, user_payments и 50 бизнес-требований, которыми вас "наградят" (начальство, аналитики, партнеры) через 3 месяца.

Я понимаю - задать ограничения на максимальную длину отдельных текстовых полей. Но при этом никто не смотрит "сколько байтиков займет". Можно (и нужно) проектировать эффективное приложение. По сотне самых разных факторов и показателей (выбор СУБД, например). Но считать число байт, по какой-то одной или 2-3 таблицам - ммм...