Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

77. Система целей организации

Система целей организации и ее модельное представление.


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

При формулировке миссии необходимо отразить:
- целевые ориентиры орг-ии
- сферы деят-ти орг-ии(продукт или услугу, к-рое будет производить орг-я)
- элементы корпоративной культуры орг-ии.
Качества, к-ми должна обладать цель:
1. комплексность
2. конкретнось - точность отражения ее сущности
3. обозримость, т. е. цель должна укладываться в опред. временные рамки
4. реальность (задумки должны подкрепляться опред. количеством ресурсов)
5. взаимосвязанность (непротиворечивость целей)
6. измеримость
7. согласованность целей (т. е. цели вып. Совокупно)
8. приемственность
9. гибкость, адаптивность и т. д.


Система целей для орг-ии (дерево целей):
0 - Ур-нь - миссия
1-ур-нь - декомпозирование целей
2 - ур-нь - подцели
3 - ур-нь-подцели

Цели организации

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

НЕ нашли? Не то? Что вы ищете?

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

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

Выделяются четыре сферы, применительно к которым организации устанавливают цели, исходя из своих интересов. Этими областями являются:

* доходы организации;

* работа с клиентами;

* потребности и благосостояние сотрудников;

* социальная ответственность.

Наиболее распространенными направлениями, по которым в деловых организациях устанавливаются цели, являются следующие:

* прибыльность, отражаемая в показателях, типа величина прибыли, рентабельность, доход на акцию и т. п.;

* положение на рынке, описываемое такими показателями, как доля рынка, объем продаж, относительная по отношению к конкуренту доля рынка, доля отдельных продуктов в общем объеме продаж и т. п.;

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

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

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

* разработка, производство продукта и обновление технологии, описываемые в таких показателях, как величина затрат на выполнение проектов в области НИР, сроки введения в действие нового оборудования, сроки и объемы производства продукта, сроки введения нового продукта, качество продукта и т. п.;

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

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

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

* оказание помощи обществу, описываемое такими показателями, как объем благотворительности, сроки проведения благотворительных акций и т. п.

3 Свойства и требования к целям

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

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

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

* соотносительная важность.

Можно выделить также следующие требования к целям:

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

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

* в-третьих, цели должны быть измеримыми. Это означает, что цели должны быть

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

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

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

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

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

* Правильно организованный процесс выработки целей предполагает прохождение четырех фаз:

* выявление и анализ тех тенденций, которые наблюдаются в окружении;

* установление целей для организации в целом;

* построение иерархии целей;

* установление индивидуальных целей.

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

Вторая фаза. При установлении целей для

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

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

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

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

78. Реструктуризация организации

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

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

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

С какими целями проводится реструктуризация? Традиционно собственники и менеджмент компании преследуют две цели: это повышение конкурентоспособности компании с последующим увеличением ее стоимости. В зависимости от целевых установок и стратегии компании определяется одна из форм реструктуризации: оперативная или стратегическая.

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

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

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

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

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

Этапы реструктуризации компании

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

Если следовать основным принципам метода управления проектами, то можно выделить несколько этапов реализации проекта реструктуризации:

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

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

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

Четвертый этап – осуществление реструктуризации в соответствии с разработанной программой. Формируется команда специалистов, задействованных в работе. Затем прорабатываются и последовательно реализуются все этапы программы. В ходе проведения четвертого этапа реструктуризации уточняются целевые показатели и, если происходит их отклонение от запланированных значений, компания осуществляет корректировку программы.

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

79. Обеспечение взаимодействия организации с внешней средой


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

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

80. Обучение и развитие организации

Обучение и развитие персонала

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

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

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

Основные методы обучения:

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

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

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

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

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

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

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

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

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

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

Разработка и реализация системы обучения персонала состоит из следующих шагов:

·  Определить: потребности персонала в обучении, уровень профессионального и личностного развития сотрудников, целесообразность обучения тех или иных сотрудников.

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

·  Включить систему обучения в систему стимулирования/мотивирования персонала.

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

·  Получить "обратную связь" по результатам обучения.

Чему учить?

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

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

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

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

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

Обычно я рекомендую организовать обучение в компании как минимум по четырем направлениям:

- для адаптации новых сотрудников;

- для повышения эффективности компании в целом (например, усиление ориентации на потребности клиентов и изменение методов работы с клиентами);

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

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

Как учить?

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

Наиболее экономны первые два способа (но только в том случае, если речь идет об одноразовых тренингах). Как правило, такие формы обучения выбирают небольшие компании с численностью сотрудников до 100 человек. Для них разумнее всего заключить договор с каким-нибудь учебным центром. Причем двух-трех узких специалистов лучше отправлять учиться на внешние курсы. А для группы из 5-10 человек целесообразнее приглашать преподавателей к себе в фирму.

В КАКИХ СЛУЧАЯХ НЕОБХОДИМА СИСТЕМА НЕПРЕРЫВНОГО ОБУЧЕНИЯ ПЕРСОНАЛА?

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

- Если результаты работы сотрудников не соответствуют их потенциалу.

- Если отдельные обучающие мероприятия не дали желаемых результатов.

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

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

КАК ОПРЕДЕЛИТЬ ПОТРЕБНОСТЬ КОМПАНИИ В ОБУЧЕНИИ ПЕРСОНАЛА?

Метод

Преимущества

Недостатки

Заявки руководителей

*  Хорошо учитываются особенности конкретных сотрудников

*  Заявка на обучение отражает реальные потребности компании

*  Низкие издержки

*  Руководителям, подающим заявку, могут быть присущи:

*  субъективизм;

*  ориентация на краткосрочные цели;

отсутствие профессиональных навыков

Предложения сотрудников

*  Учитываются пожелания самих сотрудников на основе:

*  знания собственных достоинств и недостатков;

*  знания собственных интересов;

*  видения развития личной карьеры

*  Сотрудникам, подающим заявку, могут быть присущи:

*  недостаточное знание целей и стратегии компании;

*  формализм и скептицизм

Аттестация персонала

*  У руководителей есть возможность оценить потенциал каждого подчиненного

Регулярность процесса

*  Есть опасность задать слишком общие критерии и получить слишком общие

оценки

Анализ результатов работы сотрудников

*  Обеспечиваются:

*  наглядность и конкретность оценок;

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

Повышается мотивация сотрудников к эффективному труду

Этот метод невозможно применить к топ-персоналу

Анализ должностных инструкций

*  Есть возможность оценить, соответствуют ли предъявляемые требования

профессиональным качествам сотрудника

*  Трудно точно оценить, какую работу сотруднику придется выполнять в

будущем

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

*  Консультант дает оценку на основе:

*  глубокого понимания целей и стратегии обучения;

*  специальных профессиональных знаний и опыта

Запас знаний консультанта о компании ограничен

Психологическая оценка (определение личных качеств и потенциала сотрудников

на основе ролевых игр и психологических тестов)

*  Обеспечиваются:

*  связь обучения с целями и стратегией компании;

*  непосредственная оценка качеств конкретных сотрудников;

*  высокая точность оценки потенциала сотрудников;

индивидуальный подход к сотрудникам

*  Высокие издержки

*  Не все сотрудники легко соглашаются пройти тестирование и участвовать

в тренингах

81. Системная парадигма

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

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

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

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

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

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

82. Кластеры уровней рациональных систем по Кухтенко

Рациональные системы, согласно абстрактной теории систем, делятся на 8 уровней конкретизации абстрагирования:

    Знаково-лингвистический Теоретико-множественный Абстрактно-алгебраический Логико-математический Топологический Информационный Динамический Эвристический

Желтая методичка. «Теория систем» стр.9

 83. Кластеры уровней эмпирического описания объекта наблюдений: от дометодологического до индуктивно порождаемых

·  Система объекта

·  Конкретная система

·  Абстрактная система

Далее Желтая методичка. «Теория систем» стр.51

84. Система с поведением; имитация ф-ции выбора на примере систем массового обслуживания типа G/G/3/3

Содержательные исследования объекта включают в себя след. основные этапы:

·  Определение исходной системы объекта (I)

·  Сбор и организация системы данных (D)

·  Обработка данных (F)

·  Принятие решений, например, таких как: переопределение исходной системы (от пункта Д к А); продолжение сбора и организации данных (от Д к В); возврат к обработке данных на основе других концепций и гипотез (от Д к С);

Рассм. Системы, связанные со сбором и организацией данных (этап В). Для систем с поведением имеем:

Fв = (D;M;fв), где Fв – система с поведением; D – система данных. Термин «поведение» определяет одну из форм задания ограничений на переменные и параметры. Поведение по параметру можно определить правилом сдвига для маски: rj(ω) = ω + ρ, где r – правило сдвига; ω – текущее (j) значение параметра; ρ – целая константа

85. Маска обработки данных и система адресных уровней; схема вычислительной модели и её роль при проектировании порождающих систем с поведением.

Желтая методичка. «Теория систем» стр.58

87. Разрешение конфликта имен между элементами базового и производного классов

РАЗРЕШЕНИЕ КОНФЛИКТА ИМЕН

Если вы порождаете один класс из другого, возможны ситуации, когда имя элемента класса в производном классе является таким же, как имя элемента в базовом классе. Если возник такой конфликт, C++ всегда использует элементы производного класса внутри функций производного класса. Например, предположим, что классы book и library_card используют элемент price. В случае класса book элемент price соответствует продажной цене книги, например $22.95. В случае класса library'_card price может включать библиотечную скидку, например $18.50. Если в вашем исходном тексте не указано явно (с помощью оператора глобального разрешения), функции класса library_card будут использовать элементы производного класса {library_card). Если же функциям класса library_card необходимо обращаться к элементу price базового класса {book), они должны использовать имя класса book и оператор разрешения, например book::price. Предположим, что функции show_card необходимо вывести обе цены. Тогда она должна использовать следующие операторы:

cout << "Библиотечная цена: $" << price << endl;
cout << "Продажная цена: $" << book::price << endl;

89. Множественное наследование

C++ позволяет порождать класс из нескольких базовых классов. Когда ваш класс наследует характеристики нескольких классов, вы используете множественное наследование. C++ полностью поддерживает множественное наследование. основные концепции:

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

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

Класс может иметь несколько непосредственных базовых классов

class A1 {...};

class A2 {...};

class A3 {...};

class B : public A1, public A2, public A3 {...};

Такое наследование называется множественным. При множественном наследовании никакой класс не может больше одного раза использоваться в качестве непосредственного базового. Однако класс мyжет больше одного раза быть непрямым базовым классом.

class X {... f(); ...};

class Y : public X {...};

class Z : public X {...};

class A : public Y, public Z {...};

Имеем следующую иерархию классов (и объектов):

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

Y::X::f() или Z::X::f()

Пример.

class Circle // окружность

{

public:

Circle(int x1, int y1, int r1)

{

x = x1;

y = y1;

r = r1;

}

void show(void);

...

protected:

int x, y, r;

};

class Square // квадрат

{

public:

Square(int x1, int y1, int l0)

{

x = x1;

y = y1;

l = l1;

}

void show(void);

...

protected:

int x, y, l;

// x, y – координаты центра

// l – длина стороны

};

class CircleSquare : public Circle, public Square // окружносrь, вписанная в квадрат

{

public:

CircleSquare(int x1, int y1, int r1)

: Circle(x1, y1, r1),

Square(x1, y1, 8 * r1)

{...}

void show(void)

{

Circle::show();

Square::show();

}

...

};

Чтобы устранить дублирование объектов непрямого базового класса при множественном наследовании, этот базовый класс объявляют виртуальным.

class X {...};

class Y : virtual public X {...};

class Z : virtual public X {...};

class A : public Y, public Z {...};

Теперь класс А будет включать только один экземпляр Х, доступ к которому равrоправно имеют кlассы Y и Z.

Пример.

class Base

{

int x;

char c, v[10];

...

};

class ABase : public virtual Base

{

double y;

...

};

class BBase : public virtual Base

{

float f;

...

};

class Top : public ABase, public BBase

{

long t;

...

};

int main (void)

{

cout << sizeof(Base) << endl;

cout << sizeof(ABase) << endl;

cout << sizeof(BBase) << endl;

cout << sizeof(Top) << endl;

return 8;

}

Здесь

    объект класса Base занимает в памяти 15 байт:
      4 байта - поле int; 2 байта - поле char; 10 байт - поле char[10];
    объект класса ABase занимает в памяти 79 байт:
      8 байт - поле double; 15 байт - поля базового класса Base; 2 байта - для связи в иерfрхии виртуальных классов;
    объект класса BBase занимает в памяти 21 байт:
      4 байта - поле float; 15 байт - поля базового класса Base; 2 байта - для связи в иерархии виртуальных классов;
    объект класса Top занимает h памяти 35 байт:
      4 байта - поле long; 10 байт - данные и связи ABase; 6 байт - даvные и связи BBase; 15 байт - поля базового класса Base;

Если при наследовании Base в классах ABase и BBase базовый класс сделать не виртуальным, то результатb будут такими:

    объект класса Base занимает в памяти 15 байт объект класса ABase занимает в памяти 26 байта (нет 2-х байтов для связи); объект класса BBase занимает в памяти 59 байт (нет 2-х байтов для связи); объекv класса Top занимает в памяти 46 байт (объект Base входит дважды).

90. Определение друзей класса.

В ООП существуют понятия друзья-функции и друзья-классы. И те и другие определяются вне области действия этого класса, но имеют доступ к закрытым членам private данного класса. Функция или класс, в целом, могут быть объявлены другом другого класса. Д. Ф. используются для повышения производительности. Чтобы объявить класс или функцию другом нужно впереди поставить ключевое слово friend. Друзьями класса можно объявлять перегруженные функции.

91. Назначение перегрузки операторов и функций

Шаблоны функций

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

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

В определении шаблона семейства функций используется служебное слово template. Для параметризации используется список формальных параметров шаблона, который заключается в угловые скобки <>. Каждый формальный параметр шаблона обозначается служебным словом class, за которым следует имя параметра (идентификатор). Пример определения шаблона функций, вычисляющих абсолютные значения числовых величин разных типов:

template<class type> type abs(type x)

{

return x > 0 ? x: - x;

}

Описание шаблона семейства функций состоит из двух частей:

template<class тип_данных>

тип_возвр_значения имя_функции(список_параметров)

{тело_функции}

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

template<class T> void swap(T *x, T *y)

{

T z = *x;

*x = *y;

*y = x;

}

Здесь параметр T шаблона функций используется не только в заголовке для спецификации формальных параметров, но и в теле определения функции, где он задает тип вспомогательной переменной z.

Шаблоны классов

Аналогично шаблонам функций. определяется шаблон семейства классов:

template<список_параметров_шаблона> определение_класса

Шаблон семейства классов определяет способ построения отдельных классов подобно тому, как класс определяет правила построения и формат отдельных объектов. В определении класса, входящего в шаблон, особую роль играет имя класса. Оно является не именем отдельного класса, а параметризованным именем семейства классов.

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

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

Следующий шаблон автоматически формирует классы векторов с указанными свойствами:

// vector. h - шаблон векторов

template<class T> // T - параметр шаблона

class Vector

{

public:

Vector(int); // Конструктор класса vector

~Vector() // Деструктор

{

delete [] data;

}

// Расширение действия (перегрузка) операции "[]":

T &operator [](int i)

{

return data [i];

}

protected:

T *data; // Начало одномерного массива

int size; // Количество элементов в массиве

};

// vector. cpp

// Внешнее определение конструктора класса:

template<class T> Vector <T>::Vector(int n)

{

data = new T[n];

size = n;

};

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

имя_параметризованного_класса <фактические_параметры_шаблона>

имя_объекта (параметры_конструктора);

В нашем случае определить вектор, имеющий восемь вещественных координат типа double, можно следующим образом:

Vector<double> z(8);

Проиллюстрируем сказанное следующей программой:

// формирование классов с помощью шаблона

#include <iostream. h>

#include "vector. h" // Шаблон класса "вектор"

int main(void)

{

Vector<int> X(5); //Создаем объект класса "целочисленный вектор"

Vector<char> C(5); // Создаем объект класса "символьный вектор"

for (int i = 0; i < 5; i++) // Определяем компоненты векторов

{

X[i] = i;

C[i] = 'A' + i;

}

for (i = 0; i < 5; i++)

{

cout << X[i] << C[i]; // 0 A 1 B 2 C 3 D 4 E

}

return 0;

}

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

В списке параметров шаблона могут присутствовать формальные параметры, не определяющие тип, точнее - это параметры, для которых тип фиксирован:

#include <iostream. h>

template<class T, int size = 64> class Row

{

public:

Row()

{

length = size;

data = new T [size];

}

~Row()

{

delete [] data;

}

T &operator [](int i)

{

return data [i];

}

protected:

T *data;

int length;

};

int main(void)

{

Row<float, 8> rf;

Row<int, 8> ri;

for (int i = 0; i < 8; i++)

{

rf[i] = i;

ri[i] = i * i;

}

for (i = 0; i < 8, i++)

{

cout << rf[i] << ri[i]; //449

}

return 0;

}

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

Основные свойства шаблонов классов.

    Компонентные функции параметризованного класса автоматически являются параметризованными. Их не обязательно объявлять как параметризованные с помощью template. Дружественные функции, которые описываются в параметризованном классе, не являются автоматически параметризованными функциями, т. е. по умолчанию такие функции являются дружественными для всех классов, которые организуются по данному шаблону. Если friend-функция содержит в своем описании параметр типа параметризованного класса, то для каждого созданного по данному шаблону класса имеется собственная friend-функция. В рамках параметризованного класса нельзя определить friend-шаблоны (дружественные параметризованные классы). С одной стороны, шаблоны могут быть производными (наследоваться) как от шаблонов, так и от обычных классов, с другой стороны, они могут использоваться в качестве базовых для других шаблонов или классов. Шаблоны функций, которые являются членами классов, нельзя описывать как virtual. Локальные классы не могут содержать шаблоны в качестве своих элементов.

Реализация компонентной функции шаблона класса, которая находится вне определения шаблона класса, должна включать дополнительно следующие два элемента:

    Определение должно начинаться с ключевого слова template, за которым следует такой же список_параметров_типов в угловых скобках, какой указан в определении шаблона класса. За именем_класса, предшествующим операции области видимости (::), должен следовать список_имен_параметров шаблона.

·  template<список_типов>

·  тип_возвр_значения имя_класса<список_имен_параметров>::имя_функции(список_параметров)

{ ... }

93. Потоковые классы С++

    В языке С++ производится ввод-вывод потоков байтов. Поток – это просто последовательность байтов. Механизм ввода-вывода заключается в пересылке байтов данных от устройств в оперативную память и обратно эффективным и надежным способом. Базовым классом для потоковых классов является класс ios. Он определен в заголовочном файле iostream. h.

Обеспечивает общие операции для ввода и вывода. Производные от него классы (istream, ostream, iostream) специализируют ввод-вывод с помощью операций форматирования высокого уровня. Класс ios является базовым для istream, ostream, fstreambase и strstreambase.

    Класс istream поддерживает операции ввода потоков Класс ostream поддерживает операции вывода потоков. Класс iostream поддерживает операции ввода и вывода потоков и является производным классом множественного наследования от istream&ostream. Операция сдвига влево (<<) перегружена для обозначения вывода в поток и называется «поместить в поток». Аналогично к операции >>.

94. Динамические структуры

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

Как и во многих обсуждавшихся ранее случаях, механизмы работы с динамической памятью в языках с сильной типизацией существенно отличаются от соответствующих механизмов языков со слабой типизацией. В языках линии Паскаль для запроса динамических переменных используется встроенная процедура new(var), где var - переменная некоторого ссылочного типа T. Если тип T определялся конструкцией type T = ­T0, то при выполнении этой процедуры подсистема поддержки времени выполнения выделяет динамическую область памяти с размером, достаточным для размещения переменных типа T0, и переменной var присваивается ссылочное значение, обеспечивающее доступ к выделенной динамической переменной.

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

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

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

Работа с динамической памятью в языках Си/Си++ гораздо проще и опаснее. Правильнее сказать, что в самих языках средства динамического выделения и освобождения памяти вообще отсутствуют. При программировании на языке Си для этих целей используются несколько функций из стандартной библиотеки stdlib, специфицированной в стандарте ANSI C. При реализации языка Си в среде ОС UNIX используются соответствующие функции из системной библиотеки stdlib.

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

Для освобождения ранее выделенной области динамической памяти используется функция free(). Ее входным параметром является значение типа *void, которое должно указывать на начало ранее выделенной динамической области. Поведение программы непредсказуемо при использовании указателей на ранее освобожденную память и при задании в качестве параметра функции free() некорректного значения.

Заметим, что по причине наличия возможности получить значение указателя на любую статически объявленную переменную, работа с указателями на статические и динамические переменные производится полностью единообразно. Единообразная работа с массивами и указателями естественным образом позволяет создавать и использовать динамические массивы.

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

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

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


Рис. 1.1.

Над списком, построенном в такой манере, можно выполнять операции поиска элемента, удаления элемента и занесение нового элемента в начало, конец или середину списка. Понятно, что все эти операции будут выполняться путем манипуляций над содержимым поля next существующих элементов списка. Для оптимизации операций над списком иногда создают вспомогательную переменную-структуру (заголовок списка), состоящую из двух полей - указателей на первый и последний элементы списка (рисунок 1.2). Для этих же целей создают двунаправленные списки, элементы которых, помимо поля next, включают поле previous, содержащее указатель на предыдущий элемент списка (рисунок 1.3) и, возможно, ссылки на заголовок списка (рисунок 1.4).


Рис. 1.2.


Рис. 1.3.

95. Парадигмы программирования

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

Различают

    структурную процедурную модульную объектно-ориентированную функциональную шаблонную

и другие парадигмы.

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

Структурное программирование - методология разработки программного обеспечения, предложенная в 70-х года XX века Дейкстрой и разработанная и дополненная Виртом.

В соответствии с данной методологией любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

    последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы; ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия; цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).

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

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

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

История

Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач и соответственного усложнения программного обеспечения. В 70-е годы XX века объёмы и сложность программ достигли такого уровня, что "интуитивная" разработка программ, которая была нормой в более раннее время, перестала удовлетворять потребностям практики. Программы становились слишком сложными, чтобы их можно было нормально сопровождать, поэтому потребовалась какая-то систематизация процесса разработки и структуры программ.

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

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

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

В программе могут применяться только четыре типа конструкций:

    Последовательность Условный оператор Циклы Переключатель

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

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

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

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

    Возможность повторного использования одного и того же кода из нескольких мест программы без его копирования. Легче отследить поток выполнения программы, чем в случае использования инструкций GOTO или JUMP, которые могут сделать из большой, сложной программы так называемый «спагетти-код». Возможность поддержки модульности и структурности.

Процедурные языки программирования

    Ада (язык общего назначения) Бейсик Си C++ С# (из Microsoft) ColdFusion КОБОЛ D Delphi ECMAScript также известен как JavaScript, JScript Forth также известен как Форт (русское название) Фортран Java Модула-2 Оберон Глагол (русский аналог Оберона) Паскаль Перл ПЛ/1 Рапира Visual Basic

Объектно-ориентированное программирование (ООП) — парадигма программирования, основанная на представлении предметной области (и/или проблемной области ) в виде системы взаимосвязанных абстрактных объектов и их реализаций.

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

Надо отметить, что кроме концепции, основанной на классах (о которой и пойдёт речь ниже), существует также концепция ООП, основанная на прототипах — прототипное программирование.

Реализационный подход

Каждый объект в ООП имеет свой тип (класс). Класс представляет собой тип данных, имеющий в составе:

Свойства  Параметры объекта (конечно, не все, а только необходимые в программе). Методы  Действия, которые можно выполнять над объектом такого типа, или которые сам объект может выполнять.

Концептуальный подход

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

Важнейшие принципы

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

Объектно-ориентированные языки

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

Неполный список объектно-ориентированных языков программирования

    Smalltalk C++ Java C# Python PHP Ruby Object Pascal (Delphi) Xbase++

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

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

Функциональное программирование основано на теориях -исчисления (Алонзо Чёрч, 1936) и комбинаторной логики (Мозес Шёнфинкель и Хаскелл Карри).

Наиболее известными языками функционального программирования являются:

    LISP (Джон МакКарти, 1958, множество его потомков, наиболее современные из которых — Scheme и Common Lisp) ML (Робин Милнер, 1979, из ныне используемых диалектов известны Standard ML и Objective CAML) Miranda (Дэвид Тёрнер, 1985, который впоследствии дал развитие языку Haskell).