Архив за месяц: Сентябрь 2014

Строили два товарища


История от начала до конца выдумана, все совпадения с реальностью случайны.

Два друга детства Сергей Водопадов и Антон Гибких мало того, что работали в одной организации, так еще и участки для строительства дома купили по соседству. Строиться начать решили в апреле.


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

– Ха, разведут они тебя. Как это строить дом по примерной смете?

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

Каждый раз, после такой встречи Антон от Сергея слышал:

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

Вот так и подошел сентябрь. Правда, Антону и принимать особо было не чего. За две недели с прошлой встречи так, мелкие доделки до ума довели. А вот у Сергея приемка проходила не скучно. Выяснилось, что к заявленному сроку к крыше еще не приступали, а осенние дожди то уже на носу. Цвет дома был ужасен, лестница на второй этаж была из… Ну из песни слов не выкинешь, была прямо из туалета первого этажа. Да, вы угадали унитаза там не было. Зато прямо через спальню проходил стояк санузла второго этажа. И как же он звучал, когда на втором этаже… Прошу прощения, что-то отвлекся. Комнаты оказались темные из-за маленьких окон, ну и так далее, и тому подобное.

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

Парадигма Кеневина и разработка программного обеспечения

Эта статья подготовлена для блогов журнала PCWeek.
Теория запутанности (сложности), предложенная Дейвом Сноудоном в начале двадцать первого века, несмотря на свою молодость, уже нашла применение в кибернетике, менеджменте и биологии. Сегодня я предлагаю обсудить парадигму Кеневина в применении к разработке программного обеспечения.

Владеющие английским могут посмотреть вот это видео (ссылка http://www.youtube.com/watch?v=N7oz366X0-8), в котором сам автор описывает парадигму. Для остальных кратко изложу ее суть на русском.
Итак, в теории запутанности понятие «система» немного отличается от привычного многим, поэтому начну с нескольких определений:
Артефакт - материальный ресурс, имеющий определенное положение и реагирующий на действия агентов.
Агент - коллекция свойств, стратегий и возможностей для взаимодействия с артефактами и другими агентами.
Агентами могут быть как отдельные люди, так и группы людей, правила, идеи и т.д.
Система – некая сеть, включающая одну или несколько групп агентов, и, возможно, артефакты.
Обратите внимание, что в отличие от классического понимания систем, в данном определении отсутствует понятие цели.
В рамках парадигмы Кеневина все окружающие нас системы делятся на три большие группы. На одном конце оси координат находятся упорядоченные системы с жестко ограниченными агентами, характеризующиеся детерминированностью и независимостью от наблюдателя. К таким системам можно отнести конвейер, армию, разработку медицинского оборудования. На другом - хаотические системы, в которых агенты не зависимы от системы и друг от друга. Примером такой системы может быть попытка сплавиться по Ниагарскому водопаду в бочке и предсказать, как эту бочку с находящимся в ней человеком будет крутить и куда выбросит. Ну, а между ними находятся запутанные системы. Такие системы, с одной стороны, ограничивают своих агентов, а с другой - агенты оказывают влияние на систему и друг на друга, в результате чего все это коэволюционирует, и процесс этот является необратимым. Примером может послужить большинство коммерческих организаций, живые организмы и даже кружки по интересам.

Для упорядоченных систем характерно наличие экспертов. В простых системах мнения экспертов сходятся, и есть понятие лучших практик (Best practice). Достаточно действовать в соответствии с этими практиками, и результат будет гарантирован. Все, кто не придерживаются Best practice, начинают проигрывать. В упорядоченных сложных системах разные эксперты могут предлагать разные пути решения, получая одинаково хорошие результаты. Для примера можно взять двух хороших программистов и попросить их выполнить некую задачу. Решения будут отличаться, а вот результаты будет практически идентичными. В данном случае идеального пути нет, но можно выделить несколько достаточно правильных.
В запутанных системах экспертов нет. Да оно и понятно, ведь такие системы имеют множество агентов, взаимосвязи между которыми разнообразны и запутанны. Очень часто в таких системах можно найти факты, противоречащие друг другу. Даже небольшое воздействие на систему может привести к сильным изменениям. В таких системах приходится идти методом проб и ошибок: Попробовали? Дало положительный результат? Продолжаем, а если нет, то давайте сделаем что-то другое.
Хаотичные системы не поддаются анализу. В них нет вообще никакой структуры. Поэтому главное в такой ситуации - начать действовать. Правильно или неправильно - понять не возможно, но так как  состояние хаоса заканчивается очень быстро, то по его завершении мы и узнаем, правильной ли дорогой мы шли. Как правило, те, кто идут, оказываются в более выигрышной позиции по сравнению с теми, кто во время хаоса ничего не делал.
Теперь давайте посмотрим на разработку ПО через призму изложенной теории. Если у нас проекты простые и без изменения требований (правый нижний угол), то можно применять водопадные методики «и в ус не дуть». Если система упорядоченная, но сложная, то можно воспользоваться любой устоявшейся инженерной практикой, будь то PMI или PRINCE2. В зоне же запутанности хорошо себя покажут итеративные подходы к разработке - Scrum или Kanban. Ну а в хаосе можно пробовать все. Если придет жесткий диктатор - появится шанс перейти из хаоса в жестко упорядоченный правый нижний угол, поведет за собой открытый для внешнего мира лидер - попадете в правый верхний квадрат. Даже если вы ничего делать не будете, то хаос вас выкинет хотя бы в зону запутанности.
Главное - не забывать, что все эти зоны субъективны. Вспомните свой первый день на первом месте работы. Все вокруг непонятно, куда-то движется, кто-то с кем-то обсуждает вещи, даже названия которых вы не слышали. Но для окружающих это все могло быть упорядоченной системой с детерминизмом в основе. Да и для вас через несколько дней или недель это был уже не хаос, а система.
Тоже самое происходит и в разработке. Когда вы запускаете новый проект, все запутанно. Гибкие методологии позволят в параллельном или последовательном эксперименте проверить гипотезы, оценить трудоемкость тех или иных задач, определить производительность команды и т.д. Но в дальнейшем может иметь смысл перейти на более формальные подходы к управлению проектом, построить диаграмму Ганта, запланировать буферы, составить реестр рисков. Само собой, многие практики из PMI можно применить и в запутанных системах. Никак не лишним будет список заинтересованных лиц или устав проекта. Но использовать многие другие практики окажется нецелесообразным. Тем не менее, важно о них знать и пробовать применять, чтобы в максимально короткие сроки перейти к упорядоченному состоянию системы.

Задача о расстановке ферзей. Перебор с возвратом.




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


О проверке, находится ли поле «под боем» или нет.
Опишем математически, какие клетки шахматной доски находятся «под боем» ферзя,  установленного в клетке [i][j].
Посмотрите на следующий рисунок.
 

Пусть [i][j] – позиция ферзя, а [k][m] – координаты проверяемой клетки. 
k=I – горизонталь,
m=j – вертикаль,
k+m =i+j – восходящая диагональ,
km = ij – нисходящая диагональ.
Эти условия легко переделать под наш способ хранения расстановки ферзей.
Допустим, что уже имеется несколько установленных ферзей, которые не бьют друг друга. Какие условия налагаются на следующего ферзя?

Понятно, что нужно последовательно обработать каждую из предыдущих элементов. Пусть мы хотим поставить ферзя на позицию k.
Начинаем проверку, с первого элемента, в нём у нас записано значение восемь. Следовательно, k не должно равняться восьми, иначе оба ферзя окажутся на одной горизонтали. Кроме того, k+4 != 8+1 (условие зеленой линии), иначе мы пытаемся поставить ферзя на занятую диагональ. И наконец, k-4 != 8-1 (условие синей линии), иначе мы снова попадаем на диагональ, которая бьётся другим ферзем. Проверку условия красной линии осуществлять не нужно, так как способ представления расстановок в памяти не позволит на одну горизонталь поставить двух ферзей.
Аналогичные проверки необходимо будем произвести для всех ферзей, которые к этому моменту уже установлены на доске. Логично будет выделить эти проверки в функцию, которая принимает два аргумента – строку и столбик клетки, в которую мы хотим установить ферзя.
Основной алгоритм решения. Перебор с возвратом.
Теперь обсудим основной алгоритм реализующий расстановку ферзей. Действовать будем так, как мы действовали бы, если у нас была бы реальная доска перед глазами. 

 

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


Он должен стоять на второй горизонтали.

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

Проверку начинаем осуществлять с 1 клетки третей вертикали.
Думаю уже очевидно, что ни первая, ни вторая, ни третья, ни даже четвертая клетки нам не подойдут, так как они бьются ранее установленными ферзями.  А вот пятая клетка, окажется в самый раз, так как её ни первый, ни второй ферзи не бьют. Значит, устанавливаем туда нашего третьего ферзя.

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

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

Нет необходимости, снова проверять для седьмого ферзя клетки с 1 по 6, так как они уже были проверены ранее, и первые шесть ферзей остались на своих местах. Проверив седьмую и восьмую клетки, убеждаемся, что установить в них седьмого ферзя не получится, а поэтому снова делаем возврат, и теперь уже пробуем поставить на другое место шестого ферзя. 
 Будем проверять лишь клетки с 5 по 8. Нетрудно убедиться, что ни одна из них не подходит. А значит, выполняем еще один возврат и пытаемся установить пятого ферзя на новое место.
Проверку, как вы уже наверное догадались будем начинать с третьей клетки пятой вертикали. Она нам не подойдет, так как находится под боем, причем от двух ферзей сразу, от второго и третьего. А вот четвертая клетка свободна, и поэтому в неё и будем ставить нашего ферзя.

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


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


Задача о расстановке ферзей. Перебор с возвратом.




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


О проверке, находится ли поле «под боем» или нет.
Опишем математически, какие клетки шахматной доски находятся «под боем» ферзя,  установленного в клетке [i][j].
Посмотрите на следующий рисунок.
 

Пусть [i][j] – позиция ферзя, а [k][m] – координаты проверяемой клетки. 
k=I – горизонталь,
m=j – вертикаль,
k+m =i+j – восходящая диагональ,
km = ij – нисходящая диагональ.
Эти условия легко переделать под наш способ хранения расстановки ферзей.
Допустим, что уже имеется несколько установленных ферзей, которые не бьют друг друга. Какие условия налагаются на следующего ферзя?

Понятно, что нужно последовательно обработать каждую из предыдущих элементов. Пусть мы хотим поставить ферзя на позицию k.
Начинаем проверку, с первого элемента, в нём у нас записано значение восемь. Следовательно, k не должно равняться восьми, иначе оба ферзя окажутся на одной горизонтали. Кроме того, k+4 != 8+1 (условие зеленой линии), иначе мы пытаемся поставить ферзя на занятую диагональ. И наконец, k-4 != 8-1 (условие синей линии), иначе мы снова попадаем на диагональ, которая бьётся другим ферзем. Проверку условия красной линии осуществлять не нужно, так как способ представления расстановок в памяти не позволит на одну горизонталь поставить двух ферзей.
Аналогичные проверки необходимо будем произвести для всех ферзей, которые к этому моменту уже установлены на доске. Логично будет выделить эти проверки в функцию, которая принимает два аргумента – строку и столбик клетки, в которую мы хотим установить ферзя.
Основной алгоритм решения. Перебор с возвратом.
Теперь обсудим основной алгоритм реализующий расстановку ферзей. Действовать будем так, как мы действовали бы, если у нас была бы реальная доска перед глазами. 

 

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


Он должен стоять на второй горизонтали.

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

Проверку начинаем осуществлять с 1 клетки третей вертикали.
Думаю уже очевидно, что ни первая, ни вторая, ни третья, ни даже четвертая клетки нам не подойдут, так как они бьются ранее установленными ферзями.  А вот пятая клетка, окажется в самый раз, так как её ни первый, ни второй ферзи не бьют. Значит, устанавливаем туда нашего третьего ферзя.

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

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

Нет необходимости, снова проверять для седьмого ферзя клетки с 1 по 6, так как они уже были проверены ранее, и первые шесть ферзей остались на своих местах. Проверив седьмую и восьмую клетки, убеждаемся, что установить в них седьмого ферзя не получится, а поэтому снова делаем возврат, и теперь уже пробуем поставить на другое место шестого ферзя. 
 Будем проверять лишь клетки с 5 по 8. Нетрудно убедиться, что ни одна из них не подходит. А значит, выполняем еще один возврат и пытаемся установить пятого ферзя на новое место.
Проверку, как вы уже наверное догадались будем начинать с третьей клетки пятой вертикали. Она нам не подойдет, так как находится под боем, причем от двух ферзей сразу, от второго и третьего. А вот четвертая клетка свободна, и поэтому в неё и будем ставить нашего ферзя.

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


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


Autodesk и санкции против России

Заявление генерального директора Autodesk в России и СНГ Алексея Рыжова заставляет серьёзно задуматься о том, какие "сюрпризы" могут неожиданно свалиться нам на голову, поскольку и мы являемся пользователями AutoCAD... На всякий случай продублирую содержимое обозначенного заявления, т.к. не исключено, что со временем оно может исчезнуть с сайта Autodesk, или подвергнуться редактированию (политика ведь и всё такое...).

Итак, официальное письмо генерального директора Autodesk в России и СНГ Алексея Рыжова, адресованное клиентам, пользующимся продуктами компании Autodesk, а так же её технической поддержкой:

Уважаемые коллеги,
После введения санкций США в некоторых российских средствах массовой информации распространилось мнение, что компания Autodesk вводит собственные санкции в отношении ряда российских компаний, произвольно ограничивая доступ к своим продуктам. Я хотел бы опровергнуть эту информацию, разъяснить ситуацию и высказать некоторые мысли по данному вопросу:
  1. То, что Autodesk вводит санкции против России – это миф. Вопросы «вводит ли Autodesk санкции» или «поддерживает ли Autodesk санкции» неверны по своей сути. Как известно, штаб-квартира Autodesk, как и у многих ведущих ИТ-компаний, находится в США. Поэтому если правительство США вводит торговые санкции, действующее законодательство запрещает нам осуществлять поставки для компаний, на которые эти санкции распространяются. По этой причине у нас нет другого выхода, кроме как приостановить поставки для компаний из санкционного списка. Сегодня поставки этим компаниям технически невозможны из-за требований экспортного контроля.

    На сегодняшний день санкции коснулись только небольшого числа клиентов Autodesk. Тем не менее, мы сожалеем о тех негативных последствиях, с которыми столкнулись и эти компании, и мы сами. Для Autodesk эта ситуация является форс-мажором в точно такой же мере, как для других компаний со штаб-квартирой в Европе или США.
  2. ПО Autodesk является для наших клиентов средством производства, и отказ от него может оказаться для них довольно болезненным. Поэтому мы посчитали важным предупредить об ограничении поставок заранее, что и сделали письмом для наших партнеров, которое попало в СМИ. Мы сочли необходимым в сложившейся ситуации работать максимально открыто и заблаговременно сообщить нашим контрагентам о ситуации, вместо того, чтобы блокировать транзакции по факту заказа.
  3. Мы готовы предоставить консультации любым клиентам, кто сомневается, распространяются ли на их компании ограничение поставок.
  4. Выскажу и некоторые свои соображения об импортозамещении и дальнейшем развитии рынка САПР в России. На мой взгляд, отечественные разработки в области САПР должны развиваться вне зависимости от внешнеполитической ситуации. Однако только открытый, конкурентный рынок может помочь клиентам выбрать лучшие инструменты для решения насущных задач, а всем компаниям-поставщикам инвестировать в развитие и разработку новых ИТ-решений.

    Так Autodesk вкладывает в исследования и разработку более 600 миллионов долларов ежегодно (более четверти годового оборота). В то же время мы активно поддерживаем российских разработчиков в рамках инициативы Autodesk Developer Network (ADN). Наши ADN-партнеры, на мой взгляд, формируют наиболее перспективный, развивающийся сегмент на рынке российского программного обеспечения для проектирования.
  5. Успех нашего бизнеса напрямую зависит от развития промышленности и строительства в России. Поэтому мы заинтересованы в стабильности как американской, так и российской экономики. Российский рынок – важная часть глобального бизнеса Autodesk. Autodesk работает здесь с 1989 года, и за это время приобрела более десяти тысяч корпоративных клиентов и миллионы пользователей домашних приложений. В России компания осуществляет многомиллионные инвестиции в сферу образования, а также в проекты, направленные на развитие инноваций, решение социальных и экологических проблем.
  6. Мы продолжаем развивать бизнес в России, и вы сможете сами услышать о наших программах, предложениях и инвестициях на ежегодной конференции Autodesk University, которая пройдет 1-2 октября 2014 г. в Москве.
 
С уважением,
Алексей Рыжов
Генеральный директор Autodesk в России и СНГ


 На мой взгляд, любому здравомыслящему человеку совершенно очевидно, что конечному пользователю не важно, кто именно перекрывает ему кислород - компания Autodesk или же "дядя Обама": важен конечный результат. Отлично понимает это и Алексей Рыжов (было бы очень странно, если бы не понимал). А тут ещё вроде как наша компания выиграла тендер на проектирование моста через Керченский пролив (всё что касается Крыма, как хорошо известно, вызывает у США сильный зуд в нижней части туловища). Не удивлюсь, если американский "список прокажённых" вдруг пополнится наименованием нашей организации. И дело здесь не в Autodesk - по аналогии будут поступать и др. зарубежные компании (пусть даже и вынужденно).

Похоже на то, что нужно постепенно как-то уходить от использования программного обеспечения зарубежных компаний, выискивая подходящие под наши нужны российские аналоги. Из российских разработчиков САПР мне известна только компания Нанософт, хотя и тут ситуация достаточно сложная: nanoCAD спроектирован на основе платформы Teigha компании ODA. Несмотря на то, что в ODA работают и российские программисты, но факт остаётся фактом - ODA является зарубежной компанией, что не может не наводить на некоторые невесёлые размышления...

Что же касается nanoCAD, то версия 6, продемонстрированная сегодня на конференции, меня приятно удивила. Впечатлил и продемонстрированный nanoCAD СПДС. Продукты Нанософт вообще динамически развиваются. То, каким образом и с какой скоростью эта компания реагирует на пожелания и замечания пользователей, так же настраивает на позитивный лад (Autodesk, по моему опыту, в этом отношении нервно курит в сторонке). Да, в ряде достаточно важных вопросов nanoCAD всё ещё отстаёт от AutoCAD, но в то же время в ряде других, не всегда менее важных тем, он уже оставил AutoCAD далеко позади.

Я задумался над тем, чтобы установить триальную версию nanoCAD СПДС одному из сотрудников, занимающихся нормоконтролем, а так же нескольким проектировщикам с тем, чтобы они в течении месяца поработали в nanoCAD вместо AutoCAD. Правда сначала нужно будет научить их грамотно, полноценно использовать nanoCAD СПДС (скорее всего посредством курсов от Нанософт). Затем, по окончанию триального периода, будем анализировать результаты и думать, взвешивая все плюсы и минусы, выявленные в процессе работы... К сожалению, насколько я понял, в настоящее время компания не предоставляет средств электронной проверки чертежей, подобных Design Review, но хочется верить, что со временем и эта проблема будет решена.

Мнение о книге "Психология убеждения. 50 доказанных способов быть убедительным"


Я бы немного поспорил по поводу доказанных. Многие эксперименты, на которые ссылаются в книге проводились 1 раз и в конкретной среде. Но в целом книга понравилась. Часть описанных способов встречал уже в другой литературе, часть немного в другой трактовке и с другими экспериментами, но большая часть оказалась для меня новой. Автор призывает использовать эти способы для построения долгосрочных отношений, но нужно понимать, что практически всё описанное можно применить и для манипуляции. Ну а тот кто вооружен, уже сможет лучше понимать когда им пытаются манипулировать.
Вердикт: рекомендую.
Страница книги на сайте издательства.

Управление способом работы с базой данных чертежа: с использованием транзакции, или же с её эмуляцией

Маленький пример на тему того, как не меняя программный код можно управлять способом работы с базой данных чертежа: с использованием транзакции, или же с её эмуляцией. Используя такой подход можно моментально поменять способ работы сразу во многих местах, не внося правки в исходный код.
// © Андрей Бушман, 2014
// Commands.cs
// AutoCAD 2009 SP3
// Код предназначен для демонстрации того, как можно, не внося изменений в 
// исходный код, менять способ работы с базой данных чертежа: с использованием 
// транзакции или же с её эмуляцией.

using System;

#if AUTOCAD
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Ap = Autodesk.AutoCAD.ApplicationServices;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Gm = Autodesk.AutoCAD.Geometry;
using Rt = Autodesk.AutoCAD.Runtime;
#endif

[assembly: Rt.CommandClass(typeof(Bushman.CAD.Sandbox.TransactionGames.Commands
    ))]

namespace Bushman.CAD.Sandbox.TransactionGames {
    public sealed class Commands {

        /// <summary>
        /// Тестовая команда
        /// </summary>
        [Rt.CommandMethod("SwitchTransactionSample")]
        public void SwitchTransactionSample() {

            Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
            if (null == doc)
                return;
            Db.Database db = doc.Database;
            Db.TransactionManager tm = db.TransactionManager;
            Ed.Editor ed = doc.Editor;

            Ed.PromptKeywordOptions pso = new Ed.PromptKeywordOptions(
                "Использовать транзакцию?");
            String yes = "Yes";
            String no = "No";
            pso.Keywords.Add(yes);
            pso.Keywords.Add(no);
            pso.AppendKeywordsToMessage = true;
            pso.Keywords.Default = yes;

            Ed.PromptResult pr = ed.GetKeywords(pso);
            ed.WriteMessage("Вы выбрали: {0}n", pr.StringResult);

            if (Ed.PromptStatus.OK != pr.Status) {
                ed.WriteMessage("Выполнение команды прервано.n");
            }

            Boolean transaction_use = pr.StringResult == yes;

            // Т.к. OpenCloseTransaction наследуется от Transaction, то 
            // получить Transaction можно следующим образом:
            using (Db.Transaction tr = GetTransaction(tm, transaction_use)) {

                Db.DBText text = new Db.DBText();
                text.SetDatabaseDefaults(db);
                text.Height = 30;
                Double y = 100;
                String text_string = String.Empty;

                if (transaction_use) {
                    text_string = "Текст создан с использованием транзакции.";
                }
                else {
                    y = 200;
                    text_string = "Текст создан с эмуляцией транзакции.";
                }

                text.Position = new Gm.Point3d(100, y, 0);
                text.TextString = text_string;

                Db.BlockTableRecord model_space = tr.GetObject(
                    db.CurrentSpaceId, Db.OpenMode.ForWrite)
                    as Db.BlockTableRecord;

                model_space.AppendEntity(text);
                tr.AddNewlyCreatedDBObject(text, true);

                tr.Commit();
            }
        }

        /// <summary>
        /// Данный метод позволяет выбрать способ работы с базой данных 
        /// чертежа: с использованием транзакции или же с её эмуляцией.
        /// </summary>
        /// <param name="tm">Менеджер транзакций</param>
        /// <param name="emulate"><c>true</c> - использовать транзакцию; 
        /// <c>false</c> - эмулировать транзакцию. 
        /// </param>
        /// <returns>Возвращается объект <c>Transaction</c> (
        /// <c>OpenCloseTransaction</c> унаследован от этого класса).</returns>
        Db.Transaction GetTransaction(Db.TransactionManager tm,
            Boolean transaction_use) {
            Db.Transaction tr = transaction_use ? tm.StartTransaction() :
                tm.StartOpenCloseTransaction();
            return tr;
        }
    }
}

1C 8.x: Пользователи ИБ. Проверить установлен ли пароль у пользователя

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

Выборка = ПользователиИнформационнойБазы.ПолучитьПользователей(); 
Для Каждого ЭлементМассива Из Выборка Цикл
ИмяПользователя = ЭлементМассива.Имя;
ПолноеИмяПользователя = ЭлементМассива.ПолноеИмя;
ЕстьПароль = ЭлементМассива.ПарольУстановлен;
Роли = ЭлементМассива.Роли;

Для Каждого Роль Из Роли Цикл
ИмяРоли = Роль.Имя;
КонецЦикла;
КонецЦикла;

1C 8.x: Пользователи ИБ. Проверить установлен ли пароль у пользователя

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

Выборка = ПользователиИнформационнойБазы.ПолучитьПользователей(); 
Для Каждого ЭлементМассива Из Выборка Цикл
ИмяПользователя = ЭлементМассива.Имя;
ПолноеИмяПользователя = ЭлементМассива.ПолноеИмя;
ЕстьПароль = ЭлементМассива.ПарольУстановлен;
Роли = ЭлементМассива.Роли;

Для Каждого Роль Из Роли Цикл
ИмяРоли = Роль.Имя;
КонецЦикла;
КонецЦикла;