-неизвестно

 -Поиск по дневнику

Поиск сообщений в ATUM

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.02.2006
Записей:
Комментариев:
Написано: 1138




Мечты составляют половину реальности....(Жозеф ЖУБЕР) В этом мире все когда-то было мечтой...

...

Четверг, 31 Марта 2022 г. 15:10 + в цитатник
Сцена у железной дороги, Перов, 1868


Метки:  

...

Понедельник, 26 Апреля 2021 г. 11:44 + в цитатник
если хотите одну хорошую вещь получить – заказывайте русским, если десять – кому угодно, только не русским.

Метки:  

...

Понедельник, 26 Апреля 2021 г. 11:36 + в цитатник
«Русские думают, что они самый восточный из западных народов, а между тем, они самый западный среди восточных»

Метки:  

...

Среда, 17 Марта 2021 г. 10:48 + в цитатник
В женщине должна быть загадка, при этом женщина должна помнить: мужчины не
любят старых... загадок.
-- Евгений Кащеев

...

Пятница, 12 Марта 2021 г. 09:41 + в цитатник
Со счастьем дело обстоит как с часами: чем проще механизм, тем реже он портится.
-- Н. Шамфор

...

Пятница, 12 Марта 2021 г. 09:40 + в цитатник
Лучше быть врагом хорошего человека, чем другом плохого.
-- Японская пословица

...

Среда, 02 Декабря 2020 г. 11:23 + в цитатник
Мне совершенно безразлично, если кто-нибудь упрям; но если он дерзок,
то это имеет уже для меня большое значение. Первый защищает свои
взгляды, а это - его достояние. Второй нападает на мнения других, а
это - уже достояние общее.
-- Монтескье

...

Среда, 14 Октября 2020 г. 11:07 + в цитатник
Все, что создается плотью, умирает, как и она сама; все, что создается разумом, нетленно,
как сам разум.
-- Шатобриан

Метки:  

Понравилось: 2 пользователям

...

Среда, 28 Февраля 2018 г. 14:51 + в цитатник
«Уходя, попытайтесь оставить этот мир немного лучше/чище, чем он был до вашего прихода»

Метки:  

Понравилось: 24 пользователям

Бизнес идея

Понедельник, 28 Августа 2017 г. 09:47 + в цитатник
по аналогии с карточными играми запустить игру
с людьми из списка

https://www.forbes.com/billionaires/list/2/#version:static_country:United%20States

https://www.forbes.com/profile/larry-ellison/?list=billionaires

Метки:  

java keystore и его особенности

Пятница, 02 Июня 2017 г. 10:26 + в цитатник
http://itech-notes.blogspot.ru/2013/02/java-keystore.html

http://itech-notes.blogspot.ru/2013/02/keytool.html


вторник, 19 февраля 2013 г.
keytool: управление ключами и сертификатами
keytool - это утилита для работы с ключами и сертификатами из стандартного дистрибутива java. Она позволяет генерировать новые пары закрытых/открытых ключей, управлять ими, создавать запросы на подпись, экспортировать и импортировать сертификаты; иными словами, она умеет делать практически всё, кроме подписывания запросов на подпись сертификата.
Далее в посте - перечень наиболее часто используемых и самых полезных команд этой классной утилиты.


N.B.#1. Как рассказывалось в предыдущем посте, хранилище ключей keystore может иметь различные реализации. Так вот, keytool может работать с любым файловым хранилищем, при наличии соответствующих библиотек; для этого нужно указать тип хранилища (например, keystore.type=jks).

N.B.#2. По умолчанию - если не задать путь - создаваемое хранилище размещается в файле .keystore в домашней директории пользователя; если хранилище с указанным именем не существует, то оно будет создано.

N.B.#3. Ключ -v (verbose) включает вывод подробной информации. Иногда весьма полезно и интересно.

* Создание хранилища и генерация пары ключей (закрытый ключ сохраняется под паролем, открытый ключ "оборачивается" в самоподписанный сертификат).
Первым показан самый простой вариант команды, когда мы только просим сгенерировать ключ; некоторая дополнительная информация при этом будет запрошена интерактивно в процессе выполнения, а многие параметры используются с дефолтными значениями (например, алиас - mykey, хранилище - .keystore в домашней директории пользователя, алгоритм шифрвания - SHA1withDSA и пр.).
Все параметры могут указывать сразу в строке команды; так, во втором варианте примера задаётся информация о компании и пр., название алиаса, тип и размещение хранилища, срок действия, алгоритм для генерации ключей, размер ключа, пароли на хранилище и на ключ.
keytool -genkey

keytool -v -genkey -dname "CN=company.ru, OU=dept, O=company, L=city, C=BY" -alias father -storetype jks -keystore teststore.jks -validity 180 -keyalg RSA -keysize 2048 -storepass mystorepass -keypass mykeypass

* Ключи в хранилище - это хорошо. Но как достать данные из него? Для этого полезен экспорт сертификата из хранилища. Первая команда выведет сертификат в бинарном виде DER; вторая - то же, но в base64-кодированном формате; ну, а третья создаст файл sert.crt с base64-сертификатом (сам сертификат размещается между "-----BEGIN CERTIFICATE-----" и "-----END CERTIFICATE-----").
keytool -v -exportcert -alias father -keystore store.jks

keytool -v -exportcert -alias father -keystore store.jks –rfc

keytool -v -exportcert -alias father -keystore store.jks -rfc -file sert.crt

* Файл сертификата получен, внутри - много символов, которые человеку ничего не говорят. Просмотр файла сертификата поможет извлечь информацию. Команда выведет на экран информацию о владельце сертификата, срок действия, отпечатки сертификата и другие данные. Таким же образом можно просмотреть не только созданный нами, но и любой другой сертификат.
keytool -v -printcert -file sert.crt

* Если требуется просмотр сертификата непосредственно в хранилище или содержимого всего хранилища:
keytool -v -list -keystore store.jks -storepass mystorepass -alias father

keytool -v -list -keystore store.jks -storepass mystorepass

* Что можно сделать с файлом сертификата? Можно посмотреть сертификат в операционной системе, можно установить его в доверенные сертификаты браузера, импортировать в другое хранилище как доверенный (об этом чуть позже). Однако пока наш сертификат "самоподписанный", т. е. "мы его сделали, и сами же его удостоверили, и обещаем, что он хорош". Однако на практике, думается, многие не будут доверять такому сертификату (и правильно сделают). Чтобы обеспечить доверие, надо подписать наш сертификат в каком-нибудь CA - центре сертификации (thawte, verisign ипр.), которому все доверяют. Для начала требует сгенерировать запрос на подпись сертификата (certificate signing request, CSR). В результате выполнения будет создан файл testcsr.csr, тот самый, который нужно будет передать в CA для подписи нашего сертификата.
keytool -v -certreq -alias father -keystore store.jks -file testcsr.csr -storepass mystorepass -keypass mykeypass

* Положим, мы прошли процедуру проверки нашего сертификата выбранным CA и получили назад удостоверенный и подписанный сертификат. Теперь необходим импорт сертификата в хранилище. Но перед этим - что очень важно - надо импортировать все доверенные сертификаты (корневые и промежуточные) центра сертификации. Это необходимо для того, чтобы удалось построить цепочку: наш сертификат подписан CA#1, в свою очередь тот подписан CA#2 и т. д. до корневого CA, которому мы верим "на слово", потому что он известен всем.
keytool -v -importcert -keystore store.jks -alias cacert-root -file cacert-root.crt
keytool -v -importcert -keystore store.jks -alias cacert-intm -file cacert-intermediate.crt
keytool -v -importcert -keystore store.jks -alias father -file testcsr-signed.crt

* Также могут оказаться полезными следующие команды:
- удаление сертификата из хранилища (например, он был отозван)
keytool -v -delete -alias mydomain -keystore keystore.jks
- изменение пароля на keystore-хранилище
keytool -storepasswd -storepass mystorepass -new mystorepass12 -keystore store.jks
- просмотр списка сертификатов доверенных центров CA
keytool -v -list -keystore $JAVA_HOME/jre/lib/security/cacerts
- импорт нового CA в стандартное хранилище доверенных сертификатов
keytool -import -trustcacerts -file /path/to/ca/ca.pem -alias CA_ALIAS -keystore $JAVA_HOME/jre/lib/security/cacerts


Другой инструментарий по теме

Метки:  

removeAll retainAll

Вторник, 30 Мая 2017 г. 08:59 + в цитатник
Предположим у вас коллекция есть:
code:

ArrayList listFirst = new ArrayList();
listFirst .add("White");
listFirst .add("Black");
listFirst .add("Red");


и вторая:
code:

ArrayList listSecond = new ArrayList();

listSecond .add("Green");
listSecond .add("Red");
listSecond .add("White");
Тогда после listFirst .retainAll(listSecond ) в listFirst останется:


"White"
"Red"
Так как удалился "Black", которого нет в listSecond.

Но после listFirst .removeAll(listSecond ) в listFirst останется:

"Black"
Удалились все элементы, которые есть в listSecond.

Метки:  

COCHRANE GAMBIT русская партия шахматы

Четверг, 26 Января 2017 г. 15:13 + в цитатник

Метки:  

ssh copy

Вторник, 10 Января 2017 г. 14:06 + в цитатник

Метки:  

mysql replication load-balanced-connections

Понедельник, 09 Января 2017 г. 12:05 + в цитатник

Метки:  

html css print

Понедельник, 09 Января 2017 г. 11:17 + в цитатник

Метки:  

ссылки

Четверг, 06 Октября 2016 г. 09:55 + в цитатник
How to get a range of items from stream using Java 8 lambda?

http://stackoverflow.com/questions/22917270/how-to...rom-stream-using-java-8-lambda


How to multiply values in a list using java 8 streams

listOfIntegers.stream()
.map(BigInteger::valueOf)
.reduce(BigInteger.ONE, BigInteger::multiply);


https://www.coursera.org/learn/machine-learning/lecture/2DKxQ/normal-equation

Adding the Two-Factor Authentication Filter
http://blog.awnry.com/post/16183749439/two-factor-...tication-and-spring-security-3

extjs
https://dzone.com/articles/extjs-42-spring-mvc-324-and

Метки:  

алгоритмы

Четверг, 06 Октября 2016 г. 09:03 + в цитатник

Метки:  

ResultSet

Четверг, 29 Сентября 2016 г. 15:42 + в цитатник

Метки:  

Без заголовка

Среда, 03 Августа 2016 г. 10:00 + в цитатник
http://citforum.ru/SE/project/psychology/

Психология управления программными проектами

Эссе
С.Архипенков

О чем и зачем

Почему эссе? Потому, что этот материал на достаточно частную тему – психологические аспекты управления программными проектами. Потому, что трактовка рассмотренных вопросов отражает субъективный опыт автора и не претендует на полноту.

Для чего написана эта статья? Для того чтобы обнародовать еще одну попытку ответить на традиционные для России вопросы: «кто виноват?» и «что делать?». Вдруг кто-нибудь еще не знает правильных ответов? 1

Кто виноват в том, что, спустя 30 лет после объявления «кризиса программирования», компания Standish Group, проанализировав работу 364 американских корпораций и итоги выполнения более 23 тысяч проектов, связанных с разработкой ПО, в своем докладе с красноречивым названием «Хаос» [1] пришла к следующим неутешительным выводам.

«Только 16,2% проектов завершились в срок, не превысили запланированный бюджет и реализовали все требуемые функции и возможности; 52,7% проектов завершились с опозданием, расходы превысили запланированный бюджет, требуемые функции не были реализованы в полном объеме; 31,1% проектов были аннулированы до завершения. Для проектов, которые завершились с опозданием или были аннулированы до завершения, бюджет среднего проекта оказался превышенным на 89%, а срок выполнения - на 122%»?

Что делать, для того, чтобы, все-таки, производить необходимые программные продукты с удовлетворительным качеством и в приемлемые сроки?

Начну сразу с ответов.

Кто виноват? Никто. Как никто не виноват в том, что на небе тучи, что идет дождь, что дует ветер. Поскольку самого-то кризиса не было, и нет, а есть лишь Богом данная (для атеистов - объективная) реальность, которая заключена в особой специфике производства программ, по сравнению с любой другой производственной деятельностью. И с этой спецификой мы обязаны считаться, если, конечно, не хотим «дуть против ветра».

Что делать? Управлять людьми. Успех, а равно и провал, проектов по производству ПО на 100% лежит в области психологии.

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

Как должно солидным людям, давайте договоримся о понятиях. Поскольку была выбрана форма эссе, а не академической монографии, то автор может позволить себе вольность и дать свои определения терминов, которыми нам предстоит оперировать, не приводя многочисленное цитирование первоисточников и углубленный анализ различных трактовок понятий. 2 Разумеется, это не мои определения, а то, что сложилось и укрепилось в голове под влиянием многих авторов за годы программирования.

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

Цели могут быть любые: воспроизведение звука в динамике ПК, расчет траектории полета космического аппарата на Марс, печать годового балансового отчета и т.д. Важно то, что они должны быть определены. Это звучит банально, но сколько бы раз об этом не твердили ранее, по-прежнему, приходится сталкиваться с программными проектами, в которых отсутствуют какие-либо определенные цели 3.

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

Профессиональное программирование (синоним производство программ) – деятельность, направленная на получение доходов при помощи программирования.

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

Профессиональный программист – человек, который занимается профессиональным программированием. Профессионального программиста следует отличать от профессионала (мастера в программировании). Разброс профессионального мастерства в программировании достаточно широк и далеко не каждый, кто зарабатывает на жизнь программированием, является мастером, но об этом позже.

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

Моцарт и Сальери

Гуру программирования Ф. Брукс в 1975 году писал [2]: «Программист, подобно поэту, работает почти непосредственно с чистой мыслью. Он строит свои замки в воздухе и из воздуха, творя силой воображения. Трудно найти другой материал, используемый в творчестве, который столь же гибок, прост для шлифовки или переработки и доступен для воплощения грандиозных замыслов». Некоторые психологи, которые работают с программистами, идут дальше и даже утверждают, что программирование – это высшая форма творчества [3].

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

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

Факт 1. Программирование было, есть и останется в обозримом будущем творческой деятельностью.

Творчество неразрывно связано с вдохновением, а это субстанция капризная и непредсказуемая (помните знаменитый сон Д. И. Менделеева, про Периодическую таблицу элементов его имени?). Знаю только, что без вдохновения в программировании не обойтись. И чем сложнее задача, тем труднее извлечь это вдохновение из подсознания. Иногда для этого требуются часы, а иногда недели 5.

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

Программирование это не наука. Наработки математиков в области логики, теории информации, численных методов, реляционной алгебры, теории графов и некоторых других дисциплинах на долю процента не покрывают сложность программистских задач. В программировании нет системы знаний о закономерностях создания программ. Даже выдающиеся программисты не возьмут на себя смелость утверждать об архитектуре новой программной системы то, что она будет успешной. Хотя в программировании уже накоплен определенный опыт провалов, который может позволить искушенному программисту увидеть в архитектуре новой системы антипаттерны - источники серьезных будущих проблем. Но не более того. Существующее состояние Software Engineering напоминает мне большую поваренную книгу с многочисленными описаниями рецептов однажды успешно приготовленных блюд из ингредиентов, которых у меня никогда в будущем не будет. Завтра в моей новой системе будут другие вычислительные машины, технологии, языки программирования, инструменты и окружающее ПО, новые проблемы взаимодействия с которыми мне обязательно придется решать.

Факт 2. Программирование - не искусство и не наука – это ремесло. Сегодня мы так же далеки от индустриальной разработки программ, как и 50 лет назад.

А поскольку это ремесло, то человек, научившийся писать программы на C ++, будет также далек от профессионала, как ученик третьего класса средней школы, научившийся писать по-русски, от А. С. Пушкина или Ф. М. Достоевского. Путь к мастерству в ремесле лежит только через опыт. Нельзя научиться программированию, читая книги. Как нельзя по книгам научиться писать романы, картины, стихи, музыку. А еще программистам нужен постоянный труд самоусовершенствования и саморазвития. Поэтому далеко не все, кто пишет программы, становятся профессионалами.

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

Хотите, меряйте производительность в строках исходного кода, хотите – в функциональных точках.

Почему-то, если мы говорим о поэтах, художниках, композиторах, то разброс творческой производительности никого не удивляет. «Творческий полет», «творческий застой» - это про деятелей искусства. А когда говорим о неравномерности производительности программистов, то многие менеджеры начинают с этим спорить, и пытаются «пинать» программистов, как будто это заставит их думать быстрей. Не заставит. Но может заставить уйти или заняться имитацией работы.

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

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

Упрощенно, путь от идеи до ее реализации в этих отраслях выглядит следующим образом: НИР-ОКР-завод. В верхней части этой пирамиды находятся отраслевые НИИ, которые производят идеи и занимаются проектированием новых изделий. На втором этаже пирамиды работают конструкторы в конструкторских бюро, в задачу которых входит реализация нового проекта в чертежах деталей и технологиях изготовления и сборки. На нижнем уровне находятся производственные мощности - заводы, на которых инженеры и рабочие воплощают «в железе» чертежи и технологии.

Если проводить аналогию, то программисты работают исключительно на вершине описанной пирамиды. Программирование – это проектирование и только проектирование. Роль конструкторского бюро для программного проекта выполняют компилятор и сборщик программ. А программистским аналогом завода, который переводит конструкторскую документацию в продукт, доступный потребителю, служит вычислительный комплекс, на котором выполняется созданная программа.

А теперь давайте вспомним, сколько НИР так и остались на бумаге, не дойдя до ОКР, и сколько еще ОКР закончилось закрытием тематики. Я думаю, что процент инноваций, дошедших до производства от общего числа проектов, выполненных в отраслевых НИИ, будет сравним с процентом успешных программных проектов. И давайте еще учтем, что ученые в НИИ опираются на достаточно хорошо изученные законы математики, физики и химии, а программирование, как мы отмечали выше, пока остается лишь ремесленным производством.

Для коллективного программистского творчества скорее уместна аналогия с созданием художественного кинофильма или театрального спектакля. Я полагаю, что количество провальных проектов в этих областях ничуть не меньше, чем в программировании. Дай Бог, если хотя бы пятая часть кинофильмов не «ложится на полки» после первого показа.

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

Факт 4. В обозримом будущем большая часть проектов разработки ПО будет завершаться со срывами сроков и перерасходом бюджета, часть проектов не будет завершена вообще, и только приблизительно 20% проектов будут укладываться в первоначальный бюджет и сроки.

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

Есть еще нечто, что отличает труд профессионального программиста от ученого, художника, композитора и поэта. Предметом деятельности ученых являются упрощенные модели, в которых они могут абстрагироваться от большинства деталей реального мира, не существенных для их целей. Математик, доказывая новую теорему о тензорах, не заботится ни о чем, кроме системы постулатов, положенных в основание дифференциальной геометрии. Физик, описывая динамику жидкости в трубе, абстрагируется от того, как движутся и сталкиваются молекулы и от того, как движутся планеты вокруг Солнца. Деятели искусства тоже во многом оперируют абстракциями. Поэту, композитору, художнику достаточно лишь сделать намек, абрис объекта творчества, и на этом его работа закончена. Остальное пусть додумывает читатель, слушатель, зритель.

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

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

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

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

Еще в начале 70-х замечательный ученый академик А.П.Ершов сказал: “Программист должен обладать способностью первоклассного математика к абстракции и логическому мышлению в сочетании с эдисоновским талантом сооружать все, что угодно, из нуля и единиц. Он должен сочетать аккуратность бухгалтера с проницательностью разведчика, фантазию автора детективных романов с трезвой практичностью экономиста”.

Образно можно сказать, что программист должен сочетать в себе легкость и полет таланта Моцарта с усидчивостью и скрупулезностью Сальери.

Описанные психологические особенности программистского творчества привели к тому, что наиболее успешными программистами становятся люди, которые обладают выраженным аутистическим складом мышления. Аутистическое мышление (от древнегр. autos — сам) — замкнуто-углубленный тип личности. Применительно к личности используется также термин «шизоид».

Факт 5. Аутист-шизоид – наиболее распространенный среди программистов тип личности.

Мы, программисты, все немного шизоиды 10. По неофициальным данным [4], в компании «Майкрософт» число аутистов среди сотрудников составляет от 5 до 20%. Аутизм это не болезнь! Мы просто не такие как остальное большинство, которое не готово сутками проводить время за мониторами компьютеров и получать от этого удовольствие. И, пожалуйста, не надо нас лечить и переделывать! Это удача для человечества, что рождаются аутисты. Так, по результатам исследований процент гениев (то есть людей, способности которых существенно выше средних) среди людей с диагнозом "аутизм" достигает 20%. В то время как среди так называемых "нормальных" людей он не превышает 0,001%. Психологи считают аутистами таких известных исторических личностей, как Ньютон, Эйнштейн, Гегель, Фрейд, Юнг, Агата Кристи и даже любимый Пушкин 11.

Аутизм сейчас популярная тема не только среди профессиональных психологов, но и в обществе. Про аутистов даже сняты художественные фильмы: «Человек дождя» и «Меркурий в опасности». Поэтому позволим себе отослать заинтересовавшегося читателя к многочисленным профессиональным и не очень источникам информации, которые в большом числе присутствуют в Интернете. Остановимся только на тех качествах шизоидного типа личности, на которые мы будем ссылаться в дальнейшем.

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

• Для них характерно сочетание противоречивых черт в личности и поведении: холодности и утонченной чувствительности, упрямства и податливости, настороженности и легковерия, апатичной бездеятельности и напористой целеустремленности, необщительности и неожиданной назойливости, застенчивости и бестактности, чрезмерных привязанностей и немотивированных антипатий, рациональных рассуждений и нелогичных поступков, богатства внутреннего мира и бесцветности его внешних проявлений.

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

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

"Аутист видит в компьютере близкое существо, – считает Эми Клин, ассистент профессора Центра детского развития при Медицинской школе Йельского университета. – Компьютеры бескомпромиссны и негибки, а люди, с которыми нам приходится иметь дело, отличаются теми же качествами". Аутизм ограничивает способность таких людей к общению, но вознаграждает их даром невероятной концентрации и творческой продуктивности [5].

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

Каждый программный проект это потенциальная катастрофа. И если мы не будем постоянно прилагать усилия к тому, чтобы этой катастрофы избежать, мы неотвратимо к ней придем. Мы подробно писали о специфической сложности программных проектов и непредсказуемости их главной составляющей – программистов. Что же позволяет нам при разработке ПО с уверенностью смотреть в завтрашний день? Ответ прост – управление на макро уровне. В статистической динамике газа мы абстрагируемся от броуновского движения каждой из молекул и оперируем усредненными характеристиками: скорость потока, температура, давление. Аналогично, в программном проекте мы можем в разы ошибиться при оценке трудоемкости реализации каждого отдельного функционального требования. Но наши ошибки будут как в меньшую, так и в большую сторону. Поэтому для проекта в целом они будут компенсироваться 12. В моей практике ошибка суммарной трудоемкости проекта составляет не более 30%. Производительность участников проекта также может отличаться в разы, но средняя производительность по всем участникам вещь достаточно стабильная и прогнозируемая. По моему опыту оптимальное с точки зрения макроуправления количество человек в группе разработчиков – 4-6. Если проект большой, то необходимо провести его архитектурную декомпозицию на минимально связанные подсистемы, разработку которых следует вести отдельными группами со своими руководителями и планами.

Задачей любого управления является достижение некоторой цели. В нашем случае целью управления является успешное завершение проекта. Если кто-то думает, что успех проекта это реализация в программе 100% требований к назначенному сроку и в пределах выделенного бюджета, то это не так. Успех проекта живет в головах людей. Успех это в первую очередь чувство удовлетворения заказчика 13. Но не только. Успех это еще и чувство удовлетворения людей, которые выполняли проект. Вряд ли стоит называть проект успешным, даже если заказчик остался доволен его результатами, но при этом из компании ушли все профессионалы, участвовавшие в этом проекте. Я сознательно не касаюсь здесь вопросов экономической эффективности проекта и не потому, что «джентльмены о деньгах не говорят», а потому, что это самостоятельный и непростой вопрос совсем из другой области.

Факт 6. Цель управления программным проектом лежит в области психологии.

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

Факт 7. Средства управления программным проектом лежат в области психологии.

То, что важным фактором программистского проекта является психология, начали писать более 30 лет назад, книги Венберга [6] и Де Марко [7] ничуть не утратили своей актуальности и сегодня. Но понимание того, что психология является решающим фактором успеха или неуспеха проектов разработки ПО, пришло только в последние годы. Радикальным решением проблем кризиса программирования поочередно объявлялись поиск лучшего языка программирования (1960-е годы), технологии программирования (1970-е годы), инструментария программирования (1980-е годы), системы качества (1990-е). И только центральному и ключевому фактору - фигуре самого программиста - внимание почти не уделялось [8].

«Именно человеческие качества обеспечивают успех тому или иному проекту, именно они являются фактором первостепенной важности, основываясь на котором надо строить прогнозы о проекте». Это вывод Алистэра Коуберна [9], который базируется на результатах анализа очень разных программных проектов, реализованных за последние 20 лет. Проекты отличались друг от друга по количеству программистов, по срокам выполнения, по применяемой технологии - от самой тяжелой (CMM 5-го уровня) до полного ее отсутствия. Коуберн не обнаружил статистически значимой корреляции успеха или неуспеха проекта ни с одной из перечисленных характеристик.

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

Факт 8. Основная сложность управления программными проектами заключается в противоречии между коллективным характером труда и аутистической природой программирования.

Управляем катастрофой

До сих пор мы только констатировали объективно существующие трудности и проблемы, которые связаны с разработкой программных проектов. Читатель давно уже в праве ожидать от нас ответа на вопрос «что делать?». Короткий ответ – управлять людьми, которые вовлечены в проект. И круг таких людей достаточно широк. Оставшаяся часть статьи будет посвящена управлению программными проектами, а если точнее, то работе менеджера проекта 14 по управлению людьми, как внутри проекта, так и вне него. Начнем по порядку.

Над входом в храм Аполлона в Дельфах написано «Познай себя». Начинайте проект с себя. Вы – менеджер проекта. Если это ваш первый проект, то поздравляю вас с приобщением к благородной профессии. «Управление благородно по своей сути. Менеджмент ничего не имеет общего с деятельностью бюрократа, сидящего наверху. Менеджер делает самую необходимую в компании работу. Благодаря нему становится возможным выполнение самых грандиозных проектов. Нет более почетной работы, чем та, которую делает настоящий менеджер» [10].

Но даже, если у вас сверхвысокий IQ , это не поможет вам в управлении людьми. Чтобы управлять людьми, нужны совсем другие качества. Менеджер должен обладать сверхвысоким EQ – коэффициентом эмоционального интеллекта ( Emotional Intelligence ). Вот три компонента эмоционального интеллекта:

• Понять свои собственные чувства.

• Научиться управлять ими.

• Научиться распознавать эмоции других и управлять ими.

Загляните в себя, есть ли у вас необходимые качества. В силу аутистической природы программирования хороший программист, как правило, этими качествами не обладает. Из хороших программистов выходят, как правило, плохие менеджеры проектов. Аутисты предпочитают не общаться с другими людьми и не испытывать потребности в таком общении, они не интересуются другими людьми, стремятся быть в одиночестве. Недостаточный EQ и шизоидные наклонности могут привести к параноидальному стилю управления: чрезмерной бдительности, подозрительности, озабоченности скрытыми мотивами, повышенной тревожности [11]. Такие руководители считают подчиненных некомпетентными симулянтами, которые не любят свою работу и стремятся избежать ее, если у них есть такая возможность. Руководители подобного типа практикуют строгий контроль через активное личное наблюдение, формальные правила и ограничения. Ведут себя агрессивно, в особенности с теми подчиненными, которые высказывают свое мнение. «Кнут и пряник»15 для них единственные инструменты мотивации подчиненных. Эти инструменты, может быть, полезны, когда мы управляем стадом баранов, но для управления командой эйнштейнов категорически не годятся. Эйнштейны очень быстро разбегаются, если, конечно, их не огородить колючей проволокой 16. Мы еще вернемся к вопросу мотивации эйнштейнов.

Если у вас недостаточный EQ , не отчаивайтесь. В отличие от IQ , который формируется в ранней молодости и затем практически не меняется, EQ можно повышать на протяжении всей жизни.

Призыв 1. Повышайте свой эмоциональный интеллект, если вы хотите руководить успешными программными проектами.

Поймите свои собственные мотивы. Ответьте себе на вопрос, почему вы беретесь именно за этот проект 17. Помните, что вам предстоит поставить на кон свою репутацию и вложить в проект душу. «Вполнакала проекты не делаются» - очень точная формулировка И. Ставинского [12]. Поэтому нужно четко понимать, в чем будет ваш выигрыш в случае успешного завершения проекта.

Призыв 2. Поймите свои личные цели, достижение которых связано с успешным завершением проекта.

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

Как мы отмечали ранее, главная цель управления проектом - вызвать у заказчика чувство удовлетворения. Степень удовлетворенности – субъективная величина, которая является отношением субъективной оценки достижений к субъективной же оценке ожиданий или потребностей. Отсюда следует:

Призыв 3. Продавайте свой проект от начала до завершения работ.

Понимание этого правила пришло ко мне достаточно давно 18, но формулировку его я заимствовал у Тома Питерса [13]. Продавать проект следует в первую очередь заказчику. Если, после заключения договора на разработку ПО, вы планируете следующую встречу с заказчиком на приемо-сдаточных испытаниях, то вы прямой дорогой идете к катастрофе. Вы должны работать над тем, чтобы заказчик постоянно испытывал чувство удовлетворения от начала проекта до его завершения. Этого можно добиться, если вы разрабатываете проект итерационно: чуть-чуть спроектировали, чуть-чуть закодировали, чуть-чуть протестировали и продали этот результат заказчику. Продали - это означает - убедили (снова психология) заказчика, что вы представили ему нечто большее, чем то, на что он мог бы рассчитывать на текущем этапе проекта. Если во время приемо-сдаточных испытаний критика заказчиком того, что вы произвели, это, скорее всего, признак неизбежной катастрофы, то замечания на ранних итерациях это весомое свидетельство движения вашего проекта к успеху. С радостью принимайте их и тщательно анализируйте 19. Даже если вы не будете уверены в их положительном влиянии (вы ведь можете что-то не знать о бизнесе заказчика), оперативно совершенствуйте свой проект и вновь представляйте результаты заказчику. Тем самым заказчик становится соучастником вашего проекта и соавтором будущего результата. А какой же родитель не любит ребенка, которого он сам растил и воспитывал. Это обратная связь, которая необходима любой системе управления, если вы хотите, чтобы она обладала устойчивостью. Это гарантия того, что на приемо-сдаточных испытаниях заказчик будет ожидать ровно то, что вы ему представите. Управляйте ожиданиями заказчика и формируйте у него адекватную оценку представленного вами результата.

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

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

И если уж речь зашла о руководстве, то уместно привести здесь еще одно правило.

Призыв 4. Не позволяйте руководству принимать других решений в вашем проекте, кроме двух: остановить проект или сменить менеджера.

По всем остальным вопросам в проекте принимать решения должен менеджер, а руководство вправе лишь высказывать свои рекомендации. Если это не так, то вы идете к катастрофе. Джоель Спольски [14] так описывает последствия вмешательства руководства: «…Руководители разных уровней с удовольствием запускали руки в каждый стряпающийся пирог, раздавая указания направо и налево в стиле, который я стал называть порулил и убегай. «Порулил и убегай» потому, что начальники появлялись на горизонте вероломно, отдавали глупые распоряжения как именно все, черт побери, должно быть сделано, без какого-либо предварительного размышления, и покидали комнату, оставляя всех собирать осколки». Если вам не удалось оградить проект от подобных вмешательств, вам, скорее всего, придется собирать осколки до его завершения.

А теперь о самом главном в управлении программным проектом – управлении проектной командой. Управлять людьми – значит побуждать их к правильным действиям. А побуждать их можно, только управляя мотивами. Согласно теории мотивации для того, чтобы человек совершил какое либо действие он должен испытывать некую потребность и предполагать, что, выполнив это действие, он в той или иной степени эту потребность удовлетворит. Поэтому управление мотивами осуществляется, как правило, в двух направлениях: 1) формирование правильных потребностей; 2) формирование правильной оценки степени их удовлетворения 20.

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

Об этом же пишет Э. Йордан [15]: «Деньги, выгода, комфорт и тому подобное являются факторами «гигиены» - их отсутствие вызывает неудовлетворенность, однако они не могут заставить людей полюбить свою работу и дать им необходимые внутренние стимулы. Что действительно может дать такие стимулы, так это ощущение значительности достигнутых результатов, гордость за хорошо выполненную работу, более высокая ответственность, продвижение по службе и профессиональный рост - все то, что обогащает работу». Об этом же более 30-ти лет назад писал Вейнберг [6]: «Творчески работающему программисту присуща глубокая внутренняя мотивация». На мой взгляд, это еще одно следствие аутистической природы программирования.

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

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

Потребности

Профессионализм


Начинающий

Опытный

Профессионал

Материальные (зарплата, условия труда, социальный пакет и проч.)

50%

20%



Безопасности (стабильность компании, востребованность технологии проекта на рынке труда, возможность повысить квалификацию)



20%



Принадлежности (возможность учиться у более опытных коллег, опыт участия в успешном проекте, признание в коллективе)

40%

20%

10%

Самоуважения (развиваться, делать что-либо лучше других, повышение в должности, самостоятельность и ответственность в работе)

10%

30%

40%

Самоактуализации (амбициозность целей проекта – сделать то, что никто не делал или не смог сделать)



10%

50%

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

Команда успешного проекта это команда победителей. Успешный проект должен сделать победителем всех его участников [16].

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

Управление командой начинается с ее формирования.

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

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

В настоящее время нет каких-либо формальных методик определения квалификации программиста. Мой опыт показывает достаточно значимую корреляцию хороших способностей к программированию и сверхвысокого значения IQ . Высокий балл диплома и престижное математическое или техническое образование свидетельствует об общих способностях кандидата успешно осваивать новый материал. Диплом о престижном высшем образовании немаловажен для хорошего программиста, хотя и не является необходимым условием 22. При отборе кандидатов только очное интервью «глаза в глаза» и личный опыт работы с людьми позволит вам создать эффективную программистскую команду. О практике проведения интервью могу рекомендовать работы [17, 18], в которых изложены подходы, во многом совпадающие с моим опытом.

Программисты любят и умеют программировать. Пусть они этим и занимаются. Но в каждом проекте много других работ: бизнес-анализ, проектирование эргономики, графический дизайн, разработка пользовательской документации. Эти работы с программированием не имеют ничего общего. Для них требуются совершенно другая квалификация и другой склад мышления. При кустарном производстве программ эти задачи, как правило, поручаются программистам, которые это делать не умеют и не любят. Получается обычно плохо и дорого. В силу своего аутистического склада программист просто не в состоянии увидеть свою программу чужими глазами – глазами пользователей. Никто уже не хочет работать с программами с технологической парадигмой навороченного пользовательского интерфейса - кустарным творением программистов - когда для того чтобы работать с системой, надо обязательно знать, как она устроена. Это типичное творение аутиста, которому гораздо важнее видеть, как работает программа, чем разбираться в том, что она делает для пользователя.

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

Теперь, когда цели определены, команда собрана, пора приступать непосредственно к созданию программной системы. Поскольку, разработка ПО, как мы отмечали выше, корпоративная игра, то первое, что мы должны сделать, это договориться о правилах игры – нормах и регламентах, которые определяют права и ответственность членов проектной команды в проекте. Повторим вслед за автором [19]: «Каждому проекту своя технология». И чем больше и ответственней проект тем «тяжелей» должна быть технология. Технология может меняться вместе с развитием и ростом проекта, но на каждом этапе она должна быть определена и описана . Бессмысленно спрашивать с программиста ответа за то, что ему не поручено 23.

Призыв 9. Договоритесь о правилах игры – нормах и регламентах, которые определяют права и ответственность членов проектной команды.

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

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

Получает удовольствие от своей работы, гордится ее результатами и стремится, чтобы эти же чувства испытывали все коллеги.
Четко осознает свои личные и общие цели, понимает их взаимообусловленность, настойчиво стремится к их достижению.
Занимает активную позицию, стремится расширить свою ответственность и увеличить личный вклад в общее дело.
Постоянно приобретет новые профессиональные знания и опыт, выдвигает новые идеи, направленные на повышение эффективности достижения общих целей, добивается распространения своих знаний, опыта и идей среди коллег.
Уверен в себе и в своих коллегах, объективно оценивает их достижения и успехи, внимательно относится к их интересам и мнениям, активно ищет компромиссы при противоречиях.
Является оптимистом, при этом твердо знает, что окружающий мир несовершенен; воспринимает каждую новую проблему, как дополнительную возможность подтвердить собственный профессионализм в своих глазах и во мнении коллег.
Основные усилия по мотивации участников проектной команды я направляю на то чтобы стимулировать правильное поведение.

Призыв 10. Постоянно работайте над строительством команды, мотивируйте правильное поведение участников проекта.

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

Ошибкой являются попытки управления проектом на микро-уровне: мотивирование достижения формальных индивидуальных показателей, например, реализация программистом функциональных требований, количество написанных им строк исходного кода или плотность выявленных ошибок. В творческой деятельности формальные подходы не работают 24. Де Марко [7] по поводу одной из своих коллег говорил: «я слабо представляю, какой вклад она вносит в мой проект, но за 12 лет ее работы в компании все проекты, в которых она участвовала, заканчивались успехом». За ответом направляю к его книге.

Основным инструментом управления у менеджера является план работ. Как мы уже отмечали ранее, работа по проекту должна вестись итерационно, а каждая итерация должна наращивать функциональность, которая определена требованиями к системе. Наиболее приемлемое время итерации от 2 до 6 недель. Именно на этот срок должно осуществляться детальное планирование. Поскольку в реализацию попадают только хорошо проработанные системные требования, то можно добиться достаточно высокой точности плана. Трудоемкость элементарных работ детального плана должна составлять от 4 до 20 часов при расчете на среднего программиста. Каждая итерация должна заканчиваться коллективным анализом «Lessons Learned»: удалось ли достичь поставленных целей, какие проблемы пришлось решать, как реорганизовать технологические процессы для более эффективной работы, - и детальным планированием следующей итерации.

Макро-показателей, по которым менеджер должен осуществлять мониторинг проекта, не так уж и много:

• Процент реализованных функциональных требований от общего числа.

• Объем затраченных на разработку человеко-часов.

• Количество строк исходного кода.

• Количество ошибок выявленных и закрытых.

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

Программисты это, как правило, очень трудолюбивые люди (порой до фанатизма), с глубокой внутренней мотивацией к программистской работе. Как правило, я не вмешиваюсь в работу конкретного программиста, если срок выполнения поставленной задачи не превышен в 2-3 раза по сравнению с оценками в детальном плане. Так я определил для себя допуск на разброс траекторий на молекулярном уровне. Это оправдано, поскольку некоторые задачи решаются в разы быстрее, и на макро-уровне проект продвигается в соответствии с планом. Но если на микро- уровне возникают существенные отклонения от плана, это служит поводом для анализа причин неэффективной работы программиста.

Для эффективной работы программисту необходимо и достаточно выполнение четырех условий:

• Понимание целей работы.

• Желание ее сделать.

• Умение ее делать.

• Возможность ее сделать.

Неадекватное понимание целей конкретного проекта может привести к проблемам. Большинству опытных программистов свойственно стремление решить свою задачу не просто хорошо, а как можно лучше. Они стремятся сделать задачу для самого общего случая, оптимально по памяти и быстродействию, используя самые последние достижения информационных технологий, закладывая в архитектуру возможность дальнейших расширений. Доводя свою программу до совершенства, программист способен затратить гораздо больше времени, чем реально требуется на задачу. Это стремление всегда вступает в конфликт с коммерческой стороной профессионального программирования, как способа получения доходов. С точки зрения заказчика, качественная программа это та, которая удовлетворяет заявленным требованиям. Не более того 25.

Призыв 11. Нацеливайте программистов на правильное решение задачи максимально быстрым способом.

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

О мотивации программистов я уже говорил, поэтому добавлю лишь одно правило.

Призыв 12. Не пытайтесь получить от программиста больше того, что он хочет вам дать.

Ключевое слово здесь «хочет», заметьте, не «может», а именно «хочет» 26. Задача не будет выполнена за любое отведенное на нее время, если у программиста нет мотивов для ее решения. Или сумейте мотивировать программиста на выполнение задания, или передайте ее другому участнику проекта. Другого пути нет.

Еще раз напомню, что доминирующие потребности программистов находятся в верхней части пирамиды Маслоу, поэтому пинать и пугать их - занятие совершенно бесперспективное. Для начинающих программистов хорошим стимулом является само участие в успешном проекте (может быть в первом в их жизни), возможность учиться ремеслу у более опытных и искушенных коллег. Для опытных программистов хорошим стимулом может служить новизна и востребованность на рынке труда технологий, используемых в проекте (потребность безопасности). Для них также существенны сложность и самостоятельность (потребность самоуважения) в решении поставленных задач. Как правило, я стремлюсь ставить задачи примерно в 1,5 раза сложнее, чем те которые данный программист решал ранее. Для опытного программиста каждая новая задача должна предоставлять дополнительную возможность доказать свой профессионализм. Сложнее дело обстоит с суперпрограммистами. Их основным мотивом, как правило, служит самоактуализация, поэтому они стремятся решать задачи, которые до них еще никто не делал. Оптимальное их место в проекте – системная архитектура и реализация архитектурно значимых компонентов системы (скелета системы). При правильной мотивации оставшаяся часть их потребностей принадлежности и самоуважения реализуется через обучение коллег и передачу им своего опыта. На эту деятельность следует планировать до 50% времени суперпрограммиста. Суперпрограммист в проекте должен играть роль технического лидера, который ведет за собой остальных участников под лозунгом: «Делай как я!». Он всегда должен быть готов продемонстрировать, как можно решить любую задачу в проекте.

Третье условие эффективной работы программиста – умение делать порученную работу. Как правило, начинающие программисты мало что умеют. Их главный метод программирования – копирование чужих образцов (Copy/Paste). Это естественный путь обучения ремеслу. Вспомним художников, которые учатся, копируя полотна великих мастеров. Важно, чтобы образцы для подражания были достойными. Поэтому целесообразно поручать задачу паре программистов, в которой один из них выступает наставником, а другой подмастерьем, перенимающим опыт.

У меня нет личного опыта парного программирования, которое рекомендует xProgramming, когда одну программу пишут по очереди. Но есть накопленная с годами уверенность, что ревизия кода более опытным коллегой на предмет «изобретения велосипеда» просто необходима. Кстати «изобретение велосипеда» любимое занятие не только среди начинающих, но и среди уже достаточно опытных программистов, у которых всегда возникает потребность переписать все по-своему. Этому, как правило, есть две причины. Первая - недооценка сложности поставленной задачи. Вторая - недостаток времени для изучения достижений технологий, используемых в проекте.

Дополнительно, парная ответственность за исходный код страхует ваш проект от негативных последствий неожиданного ухода одного из специалистов 27.

Призыв 13. Планируйте время на самообучение участников проектной команды и обучение менее опытных программистов более опытными наставниками.

Время на это все равно тратится. Но если времени на обучения не достаточно, то будьте готовы к тому, что бездумное применение технологии Copy/Paste будет приводить к размножению ошибок в вашем проекте в геометрической прогрессии, и что масса времени будет тратиться на изобретение очередного велосипеда. Все это неизбежно приведет к снижению общей эффективности работ по проекту.

И о последнем условии эффективной работы – программисту должна быть предоставлена возможность сделать порученную работу. Здесь речь идет не о тривиальном наличии компьютера и инструментов разработки 28. И не о наличие отдельного кабинета, о котором пишет Де Марко 29. В творческой деятельности обязательным элементом ответственности является свобода выбора пути решения стоящей проблемы. Свобода не только необходимое условие творчества, но и важный мотивирующий фактор. Даже если вы уверены в существовании более правильного решения, вы не в праве настаивать на нем, вы можете высказать свое мнение только в виде рекомендации. Предоставьте членам проектной команды право на ошибку. Это нормальный атрибут творческого поиска. На ошибках учатся. Умный не тот, кто не делает ошибок, а тот, кто их не повторяет. Впрочем, вы ведь тоже можете ошибаться.

Одним из элементов свободы является отсутствие жестких сроков на выполнение задачи. Для профессиональных управленцев отсутствие жестких сроков может звучать как нонсенс, но в творческой деятельности это один из обязательных элементов свободы. Бессмысленно заставлять программистов работать больше, устраивать сверхурочные авралы и субботники. Работать больше, это совсем не значит - работать продуктивнее. Скорее наоборот. Излишнее давление и суета приводят к непродуманным решениям и многочисленным последующим переработкам. «Хорошо управляемое предприятие - это спокойное место. Зато «фабрика, отличающаяся "кипучей" деятельностью и "трудовым героизмом" работников, который бросается в глаза любому посетителю, является на самом деле плохо управляемой». Это не я сказал, это говорит управленец «в законе» [20].

Если программист адекватно мотивирован для того, чтобы выполнить порученную работу, то он будет стремиться сделать ее максимально быстро и с необходимым качеством. Многие программисты, особенно молодые, по собственной инициативе готовы тратить на решение задачи по 12-16 часов в сутки. Это неправильно, эффективность работы резко снижается, и при злоупотреблении сверхурочной работой программист уподобляется мухе, бьющейся головой о стекло, вместо того чтобы методично искать правильное решение 30.

Еще одно распространенное заблуждение менеджеров: оптимизм программистов. Я не имею в виду начинающих программистов, я говорю об опытных. На мой взгляд, заниженные оценки сроков решения поставленной задачи, как правило, являются следствием морального давления менеджеров. Программисту в силу своего аутистического нежелания общаться с другими людьми, легче согласиться с навязываемыми руководством сроками, чем объяснять начальству, почему оно не право.

Отношение менеджера и членов успешной проектной команды должны строится не на принципах подчинения, а на принципах партнерства. Партнерство не может быть без доверия. Если в проектной команде нет доверия, это путь к катастрофе.

Призыв 14. Не мешайте программистам. Доверяйте им. Обеспечивайте им свободу творчества. Предоставляйте им право на ошибку. Не оказывайте на них давление.

Повторюсь, управляйте проектом на макро-уровне. Не бойтесь, если одна молекула временно летит медленнее, чем остальные, или не совсем в ту сторону. Главное, чтобы это не было системой, чтобы среднее движение всех молекул было направлено к цели и осуществлялось с необходимой скоростью.

Важнейшим неформальным макро-показателем состояния проекта являются коммуникации, их качество и количество. Если угодно, то по моей экспертной оценке коммуникации, включая наставничество и консультации, в успешном проекте занимают 30-50% рабочего времени. Только благодаря эффективным коммуникациям можно достигнуть синергетического эффекта, который отличает команду от просто группы. Мне неоднократно приходилось убеждаться, что освоение новой информационной технологии парой программистов, которые осуществляют интенсивный обмен знаниями, происходит минимум в 3 раза быстрее, чем в случае, когда ту же работу выполняет один программист. Недостаточное количество коммуникаций свидетельствует, как правило, об отсутствии команды, каждый углублен в свою задачу и не интересуется, что делают его коллеги. В результате будет сделано не то, что нужно, а то, что будет сделано, вряд ли удастся интегрировать в единую систему. Если через день после получения недельного задания у программиста не возникло уточняющих вопросов, жди беды. Скорее всего, он с головой ушел в «проектирование дома, забыв уточнить, для чего он предназначен» [18]. Учитывая шизоидную несклонность программистов к общению, менеджеру требуется прилагать значительные усилия для того, чтобы мотивировать необходимый уровень коммуникаций.

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

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

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

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

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

Резюме. Растите профессионалов

Работа менеджера проекта подобна труду садовника.

Подобно тому, как садовник любовно отбирает наиболее подходящие растения для своего будущего сада, менеджер набирает людей, наиболее соответствующих целям проекта.

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

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

«Что посеешь, то и пожнешь» - этот закон одинаково применим как к труду садовода, так и к труду менеджера проекта. Пренебрежительное отношение к людям породит лишь ответное пренебрежение. Вложите в людей часть своей души, и вам воздастся сторицей.

З.Ы.

Я ничего не сказал о том, что для успеха проекта надо еще составлять календарный план, управлять рисками, требованиями, конфигурацией, качеством, проектировать архитектуру, соблюдать стандарты кодирования, тестировать и документировать систему и много чего еще. Но, во-первых, вы все это давно уже знаете. Во-вторых, наличие детальных диаграмм Ганта пока еще не спасло от катастрофы ни один проект. И, наконец, в-третьих, «разруха не в клозетах, разруха в головах», как говорил профессор Преображенский.
Литература

Jim Johnson. «Chaos: The Dollar Drain of IT Project Failures. Application Development Trends», January 1995. Standish Group.
Брукс Фредерик, "Мифический человеко-месяц, или Как создаются программные комплексы", Пер. с англ., СПб., Символ-Плюс, 1999.
Richie O'Bower, «Programming as the best creative specialty», 1997. (русский перевод Сергей Кашменский, 1999 года).
Журенков К. «Аутизм -- болезнь ХХI века?» (http://www.ogoniok.com/win/200122/22-44-45.html)
Немира В. «Гении тоже страдают задержкой умственного развития», Utro.ru, № 162 (233), 2000 (http://www.autism.ru/read.asp?id=80&vol=0)
Gerald Weinberg, «Psychology of Computer Programming», Van Nostrand Reinhold, 1971
Tom DeMarco, «Timothy Lister, Peopleware : Productive Projects and Teams», Dorset House, 1987
Белая О. А. и др. «Психология программирования: человеко-машинный аспект информационных технологий», СПбГУ, 2004 (http://www.it-education.ru/reports/odintsov.htm)
Алистэр Коуберн, Люди как нелинейные и наиболее важные компоненты в создании программного обеспечения, Humans and Technology, Октябрь, 1999
Кэтлин Мелимука, «Разговор с Томом де Марко», Computerworld, #05/1996
М. Ка де Ври, «Мистика лидерства. Развитие эмоционального интеллекта», Альпина паблишер, Москва, 2003.
И. Ашманов, "Правила Ашманова", 2002 (http://www.ashmanov.com/pap/)
Tom Peters, The Wow Project, Fast Company Magazine, Issue 24,May 1999
Joel Spolsky, "Command and Conquer and the Herd of Coconuts", March, 2000 (http://www.joelonsoftware.com/articles/fog0000000072.html)
E. Yourdon, "Death March", The Complete Software Developer's Guide to Surviving "Mission Impossible" Projects, Prentice Hall, 1997
B. W. Boehm, "Theory-W Software Project Management: Principles and Examples”, IEEE Transactions on Software Engineering, Vol. 15, No. 7, July 1989
Эд Салливан, "Время - деньги. Создание команды разработчиков программного обеспечения", Русская редакция, Москва, 2002.
Joel Spolsky, "The Guerrilla Guide to Interviewing", March, 2000 (http://www.joelonsoftware.com/articles/fog0000000073.html)
А. Коуберн, "Каждому проекту своя методология",Humans and Technology Technical Report, TR 99.04, Oct.1999 (русский перевод http://www.maxkir.com/sd/methyperproject_RUS.htm)
Питер Ф. Друкер, "Эффективный управляющий".
Планирование сроков проекта и вопросы осуществления лидерством проекта рассматриваются на сайте по управлению проектами.

CompletableFuture

Вторник, 02 Августа 2016 г. 17:27 + в цитатник

Метки:  

Пятьдесят занимательных вероятностных задач с решениями

Понедельник, 01 Августа 2016 г. 17:07 + в цитатник
http://termist.com/bibliot/stud/50_prob/00_3.htm

1. Ящик с носками
В ящике лежат красные и черные носки. Если из ящика наудачу вытягиваются два носка, то вероятность того, что оба они красные, равна 1/2.
(а). Каково минимальное возможное число носков в ящике?
(б). Каково минимально возможное число носков в ящике, если число черных носков четно?

2. Последовательные выигрыши
Чтобы подбодрить сына, делающего успехи в игре в теннис, отец обещает ему приз, если он выиграет подряд по крайней мере две теннисные партии против своего отца и клубного чемпиона по одной из схем: отец - чемпион - отец или чемпион - отец - чемпион по выбору сына. Чемпион играет лучше отца.
Какую схему следует выбрать сыну?

3. Легкомысленный член жюри
В жюри из трех человек два члена независимо друг от друга принимают правильное решение с вероятностью p, а третий для вынесения решения бросает монету (окончательное решение выносится большинством голосов). Жюри из одного человека выносит справедливое решение с вероятностью p. Какое из этих жюри выносит справедливое решение с большей вероятностью?

4. Испытания до первого успеха
Сколько в среднем раз надо бросать кость до появления шестерки?

То, что банкротство при "безобидной игре" неизбежно, для большинства из нас неожиданность.5. Монета в квадрате
В одной из популярных в Америке игр игрок бросает монету с достаточно большого расстояния на поверхность стола, разграфленную на однодюймовые квадраты. Если монета (3/4 дюйма в диаметре) попадает полностью внутрь квадрата, то игрок получает награду, в противном случае он теряет свою монету.
Каковы шансы выиграть при условии, что монета упала на стол?

6. «Попытай счастья»
«Попытай счастья» - азартная игра, в которую часто играют в игорных домах и во время народных гуляний. После того как игрок сделал ставку на один из номеров 1, 2, 3, 4, 5, 6, подбрасываются три игральные кости. Если номер играющего выпадает на одной, двух или трех костях, то за каждое появление этого номера игроку выплачивается первоначальная ставка, при этом возвращаются и его собственные деньги. В противном случае игрок теряет ставку. Каков средний проигрыш игрока при единичной ставке? (В действительности можно ставить на несколько номеров одновременно, но каждая ставка рассматривается отдельно.)

7. Переубеждение упрямого игрока
Браун всегда ставит один доллар на номер 13 в американской рулетке, вопреки совету своего благожелательного друга. Чтобы отучить Брауна от игры в рулетку, этот друг спорит с ним на 20 долларов, утверждая, что Браун останется в проигрыше после 36 игр.
Имеет ли смысл Брауну принять такое пари?
(Большинство американских рулеток имеет 38 одинаково вероятных номеров. Если выпадает номер игрока, то он получает свою ставку обратно, плюс же сумму в 35-кратном размере, если нет - теряет свою ставку.)

8. Масть при игре в бридж
Часто приходится слышать, что некто при игре в бридж получил на руки 13 пик. Какова вероятность, при условии, что карты хорошо перетасованы, получить 13 карт одной масти? (Каждый из четырех игроков в бридж получает 13 карт из колоды в 52 карты.)

Лучше быть вдвое более искусным в игре, чем вдвое более богатым9. «Крэпс»
Игра в «крэпс», для которой нужна только пара костей и совсем немного времени - одна из популярнейших в Америке. С ней связана следующая поучительная задача на подсчет вероятностей.
Правила такие. Игрок бросает две кости и подсчитывает сумму выпавших очков. Он сразу же выигрывает, если эта сумма равна 7 или 11, и проигрывает, если она равна 2, 3 или 12. Всякая другая сумма - это его «пойнт». Если в первый раз выпадает «пойнт», то игрок бросает кости еще до тех пор, пока он или не выиграет, выбросив свой «пойнт», или не проиграет, получив сумму очков, равную 7.
Какова вероятность выигрыша?

10. Эксперимент по психологии азартных игроков
(а). Урна содержит 10 черных и 10 белых шаров, отличающихся лишь цветом. Один шар вытаскивается наружу, и если его цвет совпадает с выбранным вами, то вы получаете 10 долларов, в ином случае - ничего.
Сообщите максимальный взнос, который вы готовы сделать для участия в игре. Игра проводится лишь один раз.
(б). У вашего друга имеется много белых и черных шаров, и он заполняет ими урну по своему усмотрению. Вы выбираете «черное» или «белое», после чего из урны наудачу вытягиваете шар.

Какую максимальную сумму вы готовы заплатить за участие в игре? Игра проводится только один раз.

Задачи без структуры (11 и 12)

О. Хелмер и Дж. Уильяме обратили внимание автора на ряд задач, которые они называют «задачами без структуры», но которые все же имеют вероятностный характер, хотя и не в обычном смысле.

11. Молчаливый союз
Двум незнакомым людям предлагается загадать произвольное натуральное число, причем если они оба называют одно и то же число, то получают премию. Какое бы число загадали вы?

12. Quo Vadis?
Двое незнакомых людей, договорившись о том, как узнать друг друга, должны встретиться в определенный день и час в Нью-Йорке, городе, которого они оба не знают. Однако они забыли назначить место встречи. Куда им следует направиться, если они все же попытаются встретиться?
Примечания:
Quo Vadis? - Куда идешь? (лат.)
Для решения задачи нужно, конечно, знакомство с наиболее часто посещаемыми местами Нью-Йорка. См. обсуждение задачи (прим, перев.)

13. Дилемма узника
Три узника, A, B и C, одинаково хорошего поведения ходатайствовали об освобождении на поруки. Администрация решила освободить двух из трех, что стало известно узникам, которые, однако, не знают, кто именно эти двое. У заключенного A в охране есть друг, который знает, кого отпустят на свободу, но A считает неэтичным осведомиться у охранника, будет ли он, A, освобожден. Все же A хочет спросить об имени одного узника, отличного от самого A, который будет отпущен на свободу. Прежде чем спрашивать, он оценивает вероятность своего освобождения как 2/3. A думает, что если охранник скажет «B будет освобожден», то его шансы уменьшатся до 1/2, так как в этом случае будут освобождены либо A и B, либо B и C.
Однако A ошибается в своих расчетах. Объясните это.

14. Выбор купонов
Купоны в коробках занумерованы цифрами от 1 до 5, и для того, чтобы выиграть, надо набрать полный комплект из пяти купонов с разными номерами. Если из коробки вынимается один купон, то сколько коробок в среднем надо испытать, чтобы получить полный комплект?

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

16. Выйдет ли второй в финал?
В теннисном турнире участвуют 8 игроков. Номер, вытаскиваемый игроком наудачу, определяет его положение в турнирной лестнице (рис. 1).
Предположим, что лучший игрок всегда побеждает второго по мастерству, а тот в свою очередь побеждает всех остальных. Проигрывающий в финале занимает второе место. Какова вероятность того, что это место займет второй по мастерству игрок?

***
Рис. 1. Турнирная лестница для 8 участников.

17. Рыцари-близнецы
(а). Король Артур проводит рыцарский турнир, в котором, так же как и в теннисе, порядок состязания определяется жребием (см. задачу 16). Среди восьми рыцарей, одинаково искусных в ратном деле, два близнеца.
Какова вероятность того, что они встретятся в поединке?
(б). Каков ответ в случае 2n рыцарей?

18. Равновесие при бросании монет
При бросании 100 монет какова вероятность выпадения ровно 50 гербов?

19. Задача Сэмуэля Пепайса
С. Пепайс предложил Исааку Ньютону следующую задачу: Какое из событий более вероятно:
(а) появление по крайней мере одной шестерки при подбрасывании 6 костей,
(б) появление хотя бы двух при подбрасывании 12 костей и
(в) появление не менее трех шестерок при бросании 18 костей?

20. Трехсторонняя дуэль
A, B и C сходятся для трехсторонней дуэли. Известно, что для A вероятность попасть в цель равна 0.3, для C - 0.5, а B стреляет без промаха. Дуэлянты могут стрелять в любого противника по выбору. Первым стреляет A, затем B, дальше C и т. д. в циклическом порядке (раненый выбывает из дуэли), пока лишь один человек не останется невредимым.
Какой должна быть стратегия A?

21. Выборка с возвращением или без возвращения?
Две урны содержат красные и черные шары, не различимые на ощупь. Урна A содержит 2 красных и 1 черный шар, урна В - 101 красный и 100 черных шаров. Наудачу выбирается одна из урн, и вы получаете награду, если правильно называете урну после вытаскивания двух шаров из нее. После вытаскивания первого шара и определения его цвета вы решаете, вернуть ли в урну этот шар перед вторым вытаскиванием.
Какой должна быть ваша стратегия?

22. Выборы
После выборов, в которых участвуют два кандидата, A и B, за них поступило a и b (a > b) бюллетеней соответственно, скажем, 3 и 2.
Если подсчет голосов производится последовательным извлечением бюллетеней из урны, то какова вероятность того, что хотя бы один раз число вынутых бюллетеней, поданных за А и В, было одинаково?

23. Ничьи при бросании монеты
Игроки A и B в орлянку играют N раз. После первого бросания каковы шансы на то, что в течение всей игры их выигрыши не совпадут?

24. Странное метро
Мэрвин кончает работу в случайное время между 15 и 17 часами. Его мать и его невеста живут в противоположных частях города. Мэрвин садится в первый подошедший к платформе поезд, идущий в любом направлении, и обедает с той из дам, к которой приедет. Мать Мэрвина жалуется на то, что он редко у нее бывает, но юноша утверждает, что его шансы обедать с ней и с невестой равны. Мэрвин обедал с матерью дважды в течение 20 рабочих дней. Объясните это явление.

25. Длины случайных хорд
Если хорда выбирается наудачу в заданном круге, то какова вероятность того, что ее длина больше радиуса круга?

26. Нетерпеливые дуэлянты
Дуэли в городе Осторожности редко кончаются печальным исходом. Дело в том, что каждый дуэлянт прибывает на место встречи в случайный момент времени между 5 и 6 часами утра и, прождав соперника 5 минут, удаляется. В случае же прибытия последнего в эти пять минут дуэль состоится.
Какая часть дуэлей действительно заканчивается поединком?

27. Осторожный фальшивомонетчик
(а). Дворцовый чеканщик кладет в каждый ящик вместимостью в сто монет одну фальшивую. Король подозревает чеканщика и подвергает проверке монеты, взятые наудачу по одной в каждом из 100 ящиков.
Какова вероятность того, что чеканщик не будет разоблачен?
(б). Каков ответ в предыдущей задаче, если 100 заменить на n?

28. Жадный фальшивомонетчик
Чеканщик кладет m фальшивых монет в ящик, содержащий всего n монет. Король, подозревая чеканщика, извлекает случайным образом по одной монете из каждого из n ящиков и проверяет их. Какова вероятность того, что в выборке из n монет ровно r фальшивых?

29. Заплесневевший желатин
Споры, несущиеся по воздуху, производят маленькие колонии-плесени на пластинках желатина в лаборатории. В среднем на пластинке имеется 3 колонии.
Какая доля пластинок имеет ровно 3 колонии?
Если среднее число колоний равно некоторому достаточно большому целому числу m, то какая доля пластинок содержит ровно m колоний?

30. Расчет булочника
Разъезжающий булочник продает в среднем 20 кексов за одну поездку. Какова вероятность того, что он продаст четное число кексов? (Предполагается, что число покупок подчиняется закону Пуассона.)

Задачи о днях рождения (31, 32, 33, 34)

31. Парные дни рождения
При каком минимальном числе людей в компании вероятность того, что хотя бы два из них родились в один и тот же день, не меньше 1/2? (Годы рождения могут и не совпадать.)

32. В поисках парных дней рождения
Вы задались целью найти человека, день рождения которого совпадает с вашим. Сколько незнакомцев вам придется опросить, чтобы вероятность встречи такого человека была бы не меньше, чем 1/2?

33. Соотношение между разными задачами о парных днях рождения
Пусть Pr обозначает вероятность того, что по крайней мере два человека из компании в r человек имеют один и тот же день рождения.
Каково должно быть n в индивидуальной задаче о парных днях рождения для того, чтобы вероятность успеха приблизительно равнялась бы Pr?

34. Выходные дни и дни рождения
Согласно законам о трудоустройстве в городе N, наниматели обязаны предоставлять всем рабочим выходной, если хотя бы у одного из них день рождения, и принимать на службу рабочих независимо от их дня рождения. За исключением этих выходных рабочие трудятся весь год из 365 дней. Предприниматели хотят максимизировать среднее число человеко-дней в году. Сколько рабочих трудятся на фабрике в городе N?

35. На краю утеса
Пьяница стоит на расстоянии одного шага от края пропасти. Каковы шансы пьяницы избежать падения?Пьяница стоит на расстоянии одного шага от края пропасти. Он шагает случайным образом либо к краю утеса либо от него. На каждом шагу вероятность отойти от края равна 2/3, а шаг к краю имеет вероятность 1/3. Каковы шансы пьяницы избежать падения?

36. Разорение игрока
У игрока M имеется 1 доллар, а у игрока N - 2 доллара. После каждого тура один из игроков выигрывает у другого один доллар. Игрок M более искусен, чем N, так что он выигрывает 2/3 игр. Игроки состязаются до банкротства одного из них. Какова вероятность выигрыша для M?

37. Смелая игра и осторожная игра
Человеку, находящемуся в Лас-Вегасе, нужны 40 долларов, в то время как он располагает лишь 20 долларами. Он не хочет телеграфировать жене о переводе денег и решает играть в рулетку (отрицательно относясь к этой игре) согласно одной из двух стратегий:
▪ Поставить все свои 20 долларов на «чет» и закончить игру сразу же, если он выиграет или проиграет.
▪ Ставить на «чет» по одному доллару до тех пор, пока он не выиграет или не проиграет 20 долларов.
Какая из этих двух стратегий лучше?

38. Толстая монета
Какой толщины должна быть монета, чтобы вероятность падения на ребро равнялась бы 1/3?
Для решения следующих задач нужно знакомство с принципом симметрии.

39. Неуклюжий химик
В лаборатории имеется несколько стеклянных трубок, каждая длиной в 9 см, помеченных с одного конца красной меткой, а с другого - синей. Споткнувшийся лаборант роняет эти трубки на пол, в результате чего многие из них разбиваются на три части. Какова для таких трубок средняя длина куска с синен меткой?

40. Первый туз
Из хорошо перетасованной колоды в 52 карты, содержащей четыре туза, извлекаются сверху карты до появления первого туза. На каком месте в среднем появляется первый туз?

41. Задача о поездах(а). На железной дороге N поездов с номерами 1, 2, ..., N. Однажды вам встретился поезд с номером 60. Угадайте, сколько поездов на железной дороге.
(б). Вы повстречали 5 поездов, причем 60 по-прежнему наибольший номер. Снова постарайтесь угадать, сколько всего поездов на железной дороге.

42. Короткий кусок стержня
(а). Если стержень ломается случайным образом на две части, то какова средняя длина меньшего куска?
(б). (Для лиц, знакомых с интегральным исчислением.) Каково среднее отношение длины короткого куска к длине длинного куска?

43. Сломанный стержень
Стержень ломается случайным образом на три части. Найти средние длины короткого, среднего и длинного кусков.

44. Выигрыш в небезобидной игре
Игра состоит из последовательности . партий, в каждой из которых вы или ваш партнер выигрывает очко, вы - с вероятностью p (меньшей, чем 1/2), он - с вероятностью 1 - p. Число игр должно быть четным: 2, 4, 6 и т. д. Для выигрыша надо набрать больше половины очков. Предположим, что вам известно, что p = 0.45, и в случае выигрыша вы получаете приз. Если число партий в игре выбирается заранее, то каков будет ваш выбор?

Задачи о совпадениях (45 и 46)

45. Среднее число совпадений
Вот два варианта задачи о совпадениях:
(а). Из хорошо перетасованной колоды на стол последовательно выкладываются карты лицевой стороной наверх, после чего аналогичным образом выкладывается вторая колода, так что каждая карта первой колоды лежит под картой из второй колоды. Каково среднее число совпадений нижней и верхней карт?
(б). Секретарша отправляет письма по n различным адресам, причем конверты с адресами выбираются случайным образом. Сколько писем в среднем попадет в нужные конверты?

46. Вероятности совпадений
В условиях предыдущей задачи какова вероятность того, что произойдет ровно r совпадений?

47. Выбор наибольшего приданого
Король для испытания кандидата на пост придворного мудреца предлагает ему женитьбу на молодой придворной даме, имеющей наибольшее приданое. Суммы приданых записываются на билетиках и перемешиваются. Наудачу вытягивается билетик, и мудрец должен решить, является ли это приданое наибольшим. Если он выносит правильное решение, то получает эту леди в жены вместе с приданым, в противном случае - не получает ничего. При отказе от суммы, указанной на первом билете, мудрец должен вытянуть второй билет и отказаться или нет от него и т. д., пока не сделает выбор или не отвергнет все приданые. При дворе короля 100 привлекательных дам, все их приданые различны.
Как должен действовать мудрец?

В предыдущей задаче мудрец не имел информации о распределении чисел на билетах. В следующей задаче это распределение ему известно.

48. Выбор наибольшего случайного числа
В качестве следующей задачи (см. предыдущую задачу "Выбор наибольшего приданого") король предлагает мудрецу выбрать наибольшее из 100 чисел при тех же условиях, что и раньше, но на этот раз число на билете выбирается наудачу среди чисел от 0 до 1 (равномерно распределенные случайные числа).
Какой должна быть стратегия мудреца?

49. Удвоение точности

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

50. Случайное квадратное уравнение
Какова вероятность того, что корни квадратного уравнения x2 + 2bx + c = 0 вещественны?



Случайные блуждания в дву- и трехмерном пространстве (51 и 52)
При двумерном случайном блуждании частица не только вернется, но будет возвращаться бесконечное число раз

Двухмерное дискретное случайное блуждание. Постановка задачи.
51. Двумерное случайное блуждание

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

Рис. 2. Часть решетки из точек, проходимых частицей в задаче о двумерном случайном блуждании. На каждом шаге частица сдвигается из данного положения на северо-восток, северо-запад, юго-восток или юго-запад, причем все эти направления равновероятны.

52. Трехмерное случайное блуждание

Как и в предыдущей задаче, частица выходит из начала координат 0 в трехмерном пространстве. Представим себе точку 0 как центр куба со стороною длины 2. За один шаг частица попадает в один из восьми углов куба. Поэтому при каждом шаге частица с равной вероятностью сдвигается на единицу длины вверх или вниз, на восток или на запад, на север или на юг. Какова доля частиц, возвращающихся в начало, при неограниченном времени блуждания?

53. Игла Бюффона
На плоскость нанесены параллельные прямые, отстоящие друг от друга на расстоянии 2a. Игла длины 2l (меньшей, чем 2a) брошена наудачу на плоскость.
Какова вероятность того, что она пересечет одну из прямых?

54. Игла Бюффона с вертикальными и горизонтальными прямыми
Предположим, что на плоскость, разграфленную на единичные клетки вертикальными и горизонтальными прямыми, наудачу брошена игла длиной 2l (меньшей, чем 1).
Каково среднее число прямых, пересекаемых иглою?
(Мы считаем, что сторона клетки 2a равна 1, так как можно измерять длину иглы в единицах длины клеток).

55. Длинная игла
Каков ответ в предыдущей задаче, если длина иглы произвольна?

56. Две урны
Две урны содержат одно и то же количество шаров, несколько черных и несколько белых каждая. Из них извлекаются n (n ≥ 3) шаров с возвращением.
Найти число n и содержимое обеих урн, если вероятность того, что все белые шары извлечены из первой урны, равна вероятности того, что из второй извлечены либо все белые, либо все черные шары.

57. Распределение простых делителей
Свяжем с каждым натуральным числом от 1 до N число его простых делителей, сосчитанное с учетом их кратностей (так у числа 12 три простых делителя: две 2 и одна 3). Вычислим относительную частоту таких делителей для различных значений N.
Что можно сказать об этом распределении при N, стремящемся к бесконечности?
Возможно, что читателю пригодится тот факт, что при больших N число простых чисел, не превосходящих N, приближенно равно N/ln(N). Число 1 обычно не считается простым делителем, но нам будет удобно предположить, что 1 есть простой делитель числа 1, но не является простым делителем никакого другого числа.

JstlView

Среда, 13 Июля 2016 г. 14:09 + в цитатник
@Controller
public class HomeController {
@RequestMapping("/home.html")
public View showHomePage() {
JstlView view = new JstlView();
view.setUrl("/WEB-INF/pages/home.jsp");
return view;
}
}

Метки:  

Задача: Выборка первой/последней записи в группах.

Вторник, 12 Июля 2016 г. 17:00 + в цитатник
Задача: Выборка первой/последней записи в группах.

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

Предварительный анализ.

Задача требует уточнения: возможны 4 варианта логики (назовем их Т1, Т2, Т3 и Т4):

Т1: Для ВСЕХ отделов вывести ОДНОГО работника. Если в отделе нет
работников, вывести NULL, если двое и больше работников имеют
одинаковые максимальные зарплаты то вывести первого по ИД.

Т2: Для ВСЕХ отделов вывести ОДНОГО ИЛИ БОЛЕЕ работников с
максимальной зарплатой. Если в отделе нет
работников, вывести NULL

Т3: Для НЕПУСТЫХ отделов вывести ОДНОГО работника.
Если двое и больше работников имеют
одинаковые максимальные зарплаты то вывести первого по ИД.

Т4: Для НЕПУСТЫХ отделов вывести ОДНОГО ИЛИ БОЛЕЕ работников с
максимальной зарплатой.

Постановка тестовой задачи и структура таблиц:

create table user(
id int not null auto_INCREMENT,
name varchar(10),
PRIMARY KEY (id)
)ENGINE=innodb;

create table post(
id int not null auto_INCREMENT,
user_id int,
topic varchar(10),
score int,
PRIMARY KEY (id),
FOREIGN KEY (user_id) REFERENCES user(id)
)ENGINE=InnoDB;

CREATE INDEX user_score_idx ON post (user_id,score );


Примерный бизнес смысл: юзеры создают сообщения, которые имеют некую оценку
(например другие юзеры оценивают *интересность* сообщения).
Надо выбрать для каждого юзера самый интересный (по оценкам) пост.

Варинаты запросов.

Все задачи (Т1..Т4) можно решить несколькими способами.
Рассмотрим варинаты с указанием подходяшей задачи
Для удобства назовем СКЛ-ы С1..С5

С1: Агрегатный подселект в FROM блоке -- задача Т4

select u.id,name,topic,score from (
select p1.user_id, max(p1.score) max_score
from post p1
group by p1.user_id ) zz
join post p on zz.max_score=p.score and zz.user_id = p.user_id
join user u on u.id=p.user_id


С2: MAX(salary) подселект в WHERE блоке -- решение для Т3

select u.id, u.name, p0.topic, p0.score
from user u join post p0
on p0.id = (select max(id) from post p1
where p1.user_id=u.id
and p1.score = (select max(p2.score)
from post p2
where p2.user_id=p1.user_id))



C3: (ORDER BY salary LIMIT 1) подселект в WHERE блоке -- задача Т3

select u.id, u.name, p0.topic, p0.score
from user u join post p0
on p0.id = ( select p1.id
from post p1
where p1.user_id=u.id
order by -p1.score, -p1.id
limit 1)


C4: Двойной левый джоинт с неравенством и проверкой на NULL -- задача Т2

select u.id, u.name, p1.topic, p1.score
from
user u left join post p1
on u.id = p1.user_id
left join post p2
on p1.user_id=p2.user_id and p1.score < p2.score
where p2.id is null


С5: Использование переменных -- относительно сложный метод
-- смотрите по ссылкам ниже.

Рекомендации:

Разные меторы решения могут быть быстрее или медленнее в
зависимости от задачи и размера таблиц.

Т1 -- С2, C3, С5, С4
Т2 -- С4, С2,
Т3 -- С2, С4
Т4 -- С1, С5

Референсы:

//http://www.sql.ru/forum/actualthread.aspx?bid=6&tid=613714
//http://www.sql.ru/forum/actualthread.aspx?bid=6&tid=611929&pg=3

P.S. Собрать коллекцию СКЛ-ов помогла дискуссия с Lonely.K и Alex_Ustinov

Метки:  

Result Set Mapping: Complex Mappings

Четверг, 16 Июня 2016 г. 16:38 + в цитатник
https://youtu.be/vOp4k4SE-F8?t=338

List<Object[]> results = this.em.createNativeQuery("SELECT b.id, b.title, b.author_id, b.version, a.id as authorId, a.firstName, a.lastName, a.version as authorVersion FROM Book b JOIN Author a ON b.author_id = a.id", "BookAuthorMapping").getResultList();

results.stream().forEach((record) -> {
Book book = (Book)record[0];
Author author = (Author)record[1];
// do something useful
});

Метки:  

How to Write an Equality Method in Java

Вторник, 14 Июня 2016 г. 09:27 + в цитатник

Метки:  

spring boot jar war

Четверг, 02 Июня 2016 г. 10:01 + в цитатник

Метки:  

windows 10

Среда, 25 Мая 2016 г. 13:51 + в цитатник
https://support.microsoft.com/ru-ru/kb/3080351

http://remontka.pro/windows-10-update-disable/



Отключите обновление до Windows 10 в редакторе реестра

После перезагрузки, запустите редактор реестра, для чего нажмите клавиши Win (клавиша с эмблемой Windows) + R и введите regedit после чего нажмите Enter. В левой части редактора реестра откройте раздел (папку) HKEY_LOCAL_MACHINE\ SOFTWARE\ Policies\ Microsoft\ Windows\

Если в этом разделе присутствует раздел (тоже слева, не справа) WindowsUpdate, то откройте его. Если нет, что вероятнее всего — нажмите правой кнопкой мыши по текущему разделу — создать — раздел, и дайте ему имя WindowsUpdate. После этого перейдите к вновь созданному разделу.

Отказ от обновления Windows 10 в реестре

Теперь в правой части редактора реестра кликните правой кнопкой мыши по пустому месту — Создать — Параметр DWORD 32 бита и задайте ему имя DisableOSUpgrade после чего дважды кликните по вновь созданному параметру и задайте ему значение 1 (один).

Закройте редактор реестра и перезагрузите компьютер. Теперь имеет смысл очистить компьютер от файлов установки Windows 10 и убрать из панели задач значок «Получить Windows 10», если вы не сделали этого ранее.

Дополнительная информация (2016): Майкрософт выпустила свою инструкцию по блокировке обновления до Windows 10. Для обычных пользователей (домашних и профессиональных версий Windows 7 и Windows 8.1) следует изменить два значения параметра реестра (изменение первого из них как раз показано выше, HKLM означает HKEY_LOCAL_MACHINE):

HKLM\ SOFTWARE\ Policies\ Microsoft\ Windows\ WindowsUpdate, Значение DWORD: DisableOSUpgrade = 1
HKLM\Software \Microsoft\ Windows\ CurrentVersion\ WindowsUpdate\ OSUpgrade, Значение DWORD: ReservationsAllowed = 0
После изменения указанных параметров реестра рекомендую перезагрузить компьютер. Сама инструкция от Microsoft доступна на странице https://support.microsoft.com/ru-ru/kb/3080351

Метки:  

Чтение файлов в JavaScript с помощью API файлов

Среда, 20 Апреля 2016 г. 10:51 + в цитатник

http://stackoverflow.com/questions/4008837/configure-ssl-on-jetty

Четверг, 14 Апреля 2016 г. 12:26 + в цитатник
http://stackoverflow.com/questions/4008837/configure-ssl-on-jetty

code:

openssl genrsa -des3 -out jetty.key
openssl req -new -x509 -key jetty.key -out jetty.crt
keytool -keystore keystore -import -alias jetty -file jetty.crt -trustcacerts
openssl req -new -key jetty.key -out jetty.csr
openssl pkcs12 -inkey jetty.key -in jetty.crt -export -out jetty.pkcs12
keytool -importkeystore -srckeystore jetty.pkcs12 -srcstoretype PKCS12 -destkeystore keystore




--config jetty-config.xml

http://www.blackpepper.co.uk/jetty-runner-https-xml-configuration/

Метки:  

основы_динамической_загрузки_классов_в

Четверг, 14 Апреля 2016 г. 10:32 + в цитатник

Метки:  

Поиск сообщений в ATUM
Страницы: [12] 11 10 ..
.. 1 Календарь