Технологии программирования: Технологии программирования
Технологии программирования
Раздел: Как стать программистом
Для начала разберёмся с тем, что такое технология. Постараюсь изъясняться простым языком, пусть даже это будет не очень точно. Зато понятно.
Итак, технология — это некий набор знаний (способов, инструментов), которые позволяют достичь желаемой цели. Исходя из этого
Технологии программирования — это способы создания программ.
Эти способы включают в себя как определённые знания (например, знание языка
программирования), так и определённые инструменты (например,
средства разработки программ).
То есть технология программирования — это совокупность знаний и способов, использование которых приведёт к созданию нужной программы — от идеи до результата.
Различают также технологию программирования и методологию программирования. Но мы в эти дебри лезть не будем — оставим это удовольствие лютым теоретикам.
Развитие технологий программирования
Развитие технологий программирования — это эволюция способов разработки программ. Эту эволюцию можно разбить на следующие этапы (на текущий момент — в будущем может быть придумают что-то ещё):
- Стихийное программирование. То есть “как Бог даст”, как получится. Можно сказать,
что на этом этапе какие-либо технологии отсутствовали. На этом этапе случился переход
от машинных кодов к ассемблерам. А затем к алгоритмическим языкам программирования. На этом этапе обычно сначала создавали кучу подпрограмм, а потом пытались объединить их в одну программу. Первое время это удавалось. Но по мере усложнения задач, решать их в разумные сроки становилось всё труднее. Поэтому возникла необходимость перехода на второй этап. - Структурное программирование. Появились структурированные языки программирования. Изначально Паскаль был именно таким языком. А язык С, можно сказать, таким языком и остался. Структурный подход представлял собой технологию, когда большая задача разбивалась на несколько относительно небольших, и представлялась в виде некой иерархической (древовидной) структуры.
- Модульное программирование. Эта технология рождалась почти одновременно со структурным программированием. Идея заключалась в том, чтобы разбивать программы на модули. В модули включали подпрограммы, близкие по своему назначению.
- Объектно-ориентированное программирование (ООП). Технология
объектно-ориентированного программирования — это уже современный подход, хотя
начиналось это ещё с середины 80-х годов 20-го века. Суть ООП заключается в
представлении программы в виде совокупности объектов. Каждый из объектов имеет свои
свойства (характеристики) и методы (функции). При этом программисту часто не
обязательно знать, как устроен объект. Достаточно только общего описания свойств и
методов. Объектно-ориентированные языки программирования — это С++, Object Pascal, Delphi и т.п. - Компонентый подход и CASE-технологии. Развиваются с середины 90-х прошлого столетия. Программы создаются из отдельных компонентов. Большинство из этих компонентов уже имеются в средствах разработки. CASE-технологии позволяют не только создавать, но и сопровождать программное обеспечение от “рождения до смерти”, то есть на всём жизненном цикле ПО. Компонентный подход в совокупности с ООП на сегодняшний день и является наиболее используемой технологией программирования.
Ну и, как вы понимаете, на всех этих этапах было много чего придумано и создано. То есть эти эти группы можно разбить на подгруппы, а подгруппы — снова разбить и т.д.
Например, к компонентным технологиям можно отнести технологию OLE, разработанную всем известной компанией Microsoft. И к ним же можно отнести технологию CORBA.
То есть представленный выше список — это лишь основные технологии программирования. Точнее даже будет сказать, что это виды технологий программирования.
И в каждом из этих видов есть немало конкретных технологий, таких как OLE, API или .NET. Так что тема эта очень обширная и очень интересная. Как говорится — не переключайтесь ))))
А мы прервёмся на короткую рекламу )))
|
Директивы компилятора Как это ни странно, но даже многие опытные программисты не используют директивы компилятора, считая их чем-то ненужным и бесполезным. А между тем, директивы компилятора — это очень классная штука. Если их умело применять в своих программах, то можно существенно сократить время на разработку и уменьшить количество рутинных операций. Подробнее… |
Технологии программирования — Циклопедия
Технологии программирования — технологии разработки программ для компьютеров, которые будут использоваться людьми для решения различных задач на компьютерах.
Разработка программного обеспечения — это род деятельности (профессия) и процесс, направленный на создание и поддержание работоспособности, качества и надежности программного обеспечения, используя технологии, методологию и практики из информатики, управления проектами, математики, инженерии и других областей знания.
[править] Основные этапы разработки программ
Разработка ПО имеет дело с проблемами качества, стоимости и надёжности. Некоторые программы содержат миллионы строк исходного кода, которые, как ожидается, должны правильно исполняться в изменяющихся условиях. Сложность ПО сравнима со сложностью наиболее сложных из современных машин и космических проектов.
Технологии программирование включают:
- Анализ и постановка задач
- Проектирование
- Написание исходных текстов программ
- Тестирование и отладка программ
- Испытания и сдача программ
- Сопровождение программ
Основная часть работы программистов связана с написанием исходных текстов программ на одном из языков программирования, а также тестированием и отладкой программ на ЭВМ.
Исходные тексты программ, а также исполняемые файлы являются объектами авторского права и являются интеллектуальной собственностью их авторов и правообладателей.
[править] Надежность и качества программ для ЭВМ
Надежность программ для ЭВМ — это одно из основных качеств не только программ для ЭВМ, но и любого типа техники, приборов, машин и устройств, используемых в быту, в жизни, транспорте, связи и на производстве.
Основные критерии надежности в технике:
- Отказоустойчивость — это отсутствие отказов и сбоев в работе машин, приборов и устройств. В том числе — отсутствие сбоев и отказов в работе ЭВМ — электронных вычислительных машин (компьютеров). Наличие сбоев и отказов в работе машин, приборов и устройств говорит о их недостаточной или низкой надежности.
- Ремонтопригодность — возможность внесения исправлений в машины, приборы и устройства при обнаружении в них сбоев, отказов или других дефектов. В том числе — в компьютерах, вычислительных устройствах, машинах, системах и комплексах.
Особенности программ для ЭВМ — программы не ломаются и не подлежать износу в отличии от всей остальной техники, приборов, машин и устройств. В этом смысле программы для ЭВМ обладают исключительной жизнестойкостью.
- Л. Г. Гагарина, Е. В. Кокорева, Б. Д. Виснадул. Технология разработки программного обеспечения. — М.: ИД «ФОРУМ»; ИНФРА-М, 2008. — С. 400. ISBN 978-5-8199-0342-1
НОУ ИНТУИТ | Лекция | Понятие технологии программирования, жизненный цикл программы и постановка задачи
Понятие технологии программирования
Технология – это набор правил, методик и инструментов, позволяющих наладить производственный процесс выпуска какого-либо продукта [1]. Разумеется, это определение нельзя назвать полным. Надо упомянуть процессы планирования, измерения, оценки качества, ответственность исполнителя и многое другое. Но в мою задачу не входит написание статьи для энциклопедии на слово «технология» – я дал какое-то представление о его значении и для начала разговора этого вполне хватит. Подчеркну только еще раз производственный характер понятия «технология». Почему-то именно слово «производство» сильно раздражает моих коллег-математиков, занимающихся программированием. «Ты бы еще технологию создания романа «Война и мир» создал». Недаром же известный специалист Дональд Кнут назвал свой знаменитый многотомный труд «Искусство программирования». Наконец, мне удалось выяснить отношение к этому понятию самого Д. Кнута. Несколько лет назад наш университет присвоил этому несомненно блистательному ученому звание почетного доктора. По такому случаю наш декан собрал для встречи с Д. Кнутом десять-двенадцать руководителей лабораторий и заведующих кафедрами, имеющих отношение к программированию. Дело было летом, Д. Кнут был с женой, переводчица поминутно смотрела на часы, напоминая, что гостям пора «на фонтаны», сам почетный доктор откровенно дремал, словом, это было скучнейшее мероприятие. Я решил пошутить, чтобы как-то развеять унылую атмосферу. И когда подошла моя очередь выступать, я вместо тридцатисекундного перечисления заслуг нашего коллектива сказал, что лично мне профессор Кнут доставил много неприятностей. Тот аж подскочил: «Я же в первый раз вас вижу!» Тут я объяснил, что много лет занимаюсь промышленной технологией программирования, а многие коллеги, включая и тех, кто сидит сейчас за этим столом, ссылаясь на его книгу, не признают это наукой, имеющей отношение к математике. Профессор очень разволновался, принял мою шутку вполне всерьез и пожаловался, что все это происходило и с ним: «Вы знаете, что я много лет занимался созданием и продвижением на рынок издательской системы TEX? Это что – не производство? Могу я на старости лет написать книжку с теоремами?»
В общем, я получил огромный заряд положительных эмоций.
Разумеется, я понимаю, что Д. Кнут известен скорее своими теоретическими работами, а TEX – это скорее от безысходности, он задумал его после выпуска первого тома «Искусства программирования», поражаясь скудости рынка инструментальных средств для набора математических текстов, прервался на несколько лет для реализации TEX и только потом продолжил свой титанический труд. Для него промышленное программирование – скорее бравада, что вот, мол, мы все можем, но все равно приятно получить поддержку от такого знаменитого ученого.
Мое первое столкновение с промышленностью состоялось в 1980-м году. К тому времени я уже несколько лет руководил лабораторией системного программирования, занимались мы самыми трудными проблемами, часто имеющими весьма отдаленное отношение к практике, но нас это нисколько не беспокоило. «Мат-мех – лучше всех» – в глубине души я и сейчас в этом уверен. Так вот, в декабре 1980-го года меня пригласили в кабинет ректора ЛГУ, там было человек двадцать в военной форме и несколько партийных деятелей во главе с начальником оборонного отдела Обкома КПСС. Мне было сказано, что оборонная промышленность столкнулась с массой проблем при создании программного обеспечения (ПО) систем оборонного назначения, поэтому решено, что ЛГУ в лице нашей лаборатории должен помочь. Моего согласия никто не спрашивал, да в те времена этого и не требовалось. Так я начал работать с ЛНПО «Красная Заря», «Импульс», «Морфизприбор», «Ленинец», «Аврора», «Гранит» – ведущими предприятиями Ленинграда, работающими в интересах различных родов войск и ведомств. С большинством этих предприятий мы работаем до сих пор.
Нас использовали как «пожарную команду». Много лет сотрудники названных и других предприятий разрабатывали ПО для важных заказов, когда же все сроки (и деньги!) истекали, приглашали нас, чтобы мы навели порядок. Нельзя сказать, что до этого мы жили в башне из слоновой кости. У нас были договора с НИЦЭВТ по созданию транслятора с языка Алгол 68 [2] для только что созданного (мы говорили «создранного») семейства ЕС ЭВМ, так что мы одними из первых освоили новую операционную систему OS/360. Пользуясь открытостью университета, к нам все время приходили какие-то люди (в том числе и военные) с просьбой найти ошибку в программе. Не было случая, чтобы мы искали ошибку больше двух дней.
Но все это не идет ни в какое сравнение с трудностями нашего понимания проблем реальной промышленности. Одно дело, когда у тебя в подчинении пятнадцать человек в университетской лаборатории, которых никогда не надо подгонять, сомневаться в их способностях, когда царит дух соревнования (не только между собой), когда все понимают друг друга с полуслова. Совсем другое дело — триста человек с совершенно разными способностями и образованием, явно отсиживающие свои восемь часов, работающие в кодах (буквально с инженерного пульта ЭВМ), причем все это погружено в атмосферу секретности. Мне никогда не забыть, как одна женщина целый час объясняла мне схему распределения памяти, которую она вычитала у одного японского автора. С большим трудом удалось выяснить, что она имеет в виду стек. Другой программист запомнился мне тем, что для возврата из процедуры использовал регистр Р7, хотя остальные триста человек для этой цели применяли Р10. Он еще доказывал, что именно он прав, так как Р7 – индексный регистр, поэтому передача управления по его содержимому выполняется на целую микросекунду быстрее. Мне так и не удалось объяснить ему важность соблюдения соглашения о связях.
Первыми из военных организаций к нам обратились сотрудники ЛНПО «Красная Заря» с просьбой помочь в программировании широкого класса задач управления и связи, в частности, в создании функционального программного обеспечения (ФПО) телефонных станций, управляемых специализированными ЭВМ (СЭВМ). Несколько лет ушло на изучение предметной области, пробные реализации и решение организационных вопросов. У сотрудников ЛГУ был исходный принцип важности использования алгоритмических языков высокого уровня (АЯВУ), основанный на опыте предыдущей работы. Однако начинать пришлось совсем не с этого, а с повышения общей культуры программирования разработчиков ФПО. Дело в том, что в области встроенного ФПО реального времени традиционно используются СЭВМ с нестандартной архитектурой, ориентированной на заданную предметную область (правда, неясно, в чем должна выражаться такая ориентация: например, если ЭВМ хорошо выполняет какие-то специальные операции, но плохо — условные переходы и вызовы процедур, которые встречаются гораздо чаще, можно ли считать, что данная ЭВМ соответствует предметной области?). Нестандартность архитектуры и малая тиражность таких СЭВМ приводят к отсутствию достаточно развитых операционных систем, трансляторов, средств отладки и других, ставших уже привычными, инструментов программирования. Поэтому мы столкнулись с работой на перфокартах и непосредственно за пультом СЭВМ «на тумблерах».
Мы пытались воспользоваться известными в то время технологиями, однако оказалось, что, например, Р-технология [3] не имеет никаких средств настройки на СЭВМ, а предлагаемые в ней графический стиль программирования и программа-организатор с ручным вводом мало помогают в решении задач реального времени; технология РУЗА позволяет автоматизированным образом (но с большими доработками) построить кросс-ассемблер нужной ЭВМ и интерпретатор ее системы команд, а также осуществить некоторую регламентацию работы (например, стандартизовать имена объектов). Р-технология была отвергнута практически сразу (за неимением конкретных программных средств на заданных нам СЭВМ), РУЗА в течение полугода была настроена на одну СЭВМ, однако полностью учесть все особенности СЭВМ так и не удалось; кроме того, параметрически настраиваемые кросс-ассемблер и интерпретатор замедляют работу в 5-7 раз.
Технологии программирования зависят от цели
Мне приходит много вопросов по поводу того, какие именно языки программирования и программные технологии нужно изучать. Многие пишут, что читали разные программистские форумы и никак не могут выбрать.
Действительно, проблема выбора технологии программирования — это реальная серьезная проблема. Она усугубляется тем, что на форумах часто рекомендуются те или иные языки программирования, библиотеки и фреймворки в отрыве от задачи, которую нужно решать. Поэтому рассмотрим самый общий уровень — что и как рекомендуется использовать программисту.
Цель программиста — написать программу. Для этого рассмотрим, какие программы вообще бывают.
Часть 1. Бесплатные программы
Бесплатные программы программист пишет для решения конкретных задач. То есть цель написания состоит в том, что сам программист будет их использовать. Но он может передавать эти программы и другим. Но в любом случае программист не отвечает за качество этих программ. Обычно такой подход называется «as is» (как есть). Программа как-то работает — ну и славно.
1.1 Программы-зубочистки
Программа-зубочистка — это программа разового применения. Подобная программа пишется на скорую руку, чтобы решить конкретную задачу. Срок написания — пара часов. После использования программа больше не нужна, поэтому их и называют зубочистками.
Например. Как-то меня пригласили в компанию, где уволился программист, а им нужно было извлечь названия и телефоны из базы. Я посмотрел программу. Исходного кода нет, а данные записываются в файл неизвестного формата. Но если посмотреть этот файл в шестнадцатеричном редакторе, то видны поля для названий и телефонов. Быстро сделал программку, которая открывает файл считывает эти поля и записывает в формат csv, который затем можно открыть в Microsoft Excel.
Для написания таких программ подходит любой язык программирования, который под рукой. Совершенно неважно, что это за язык, его возможности. Что умеете, то и используете.
1.2 Системная утилита
Системная утилита — это программа, которая решает конкретную задачу. Например, программа-архиватор сжимает файлы и записывает их в архив. Программа для обрезки аудио позволяет вырезать ненужный кусок из записи голоса. Это полезные программы, они популярны и часто используются. Но маленький функционал не позволяет заработать на них много денег. Обычно подобные программы распространяются как freeware, то есть бесплатно.
Но именно то, что программа предназначена для распространения, уже сильно ограничивает программиста. К системным утилитам предъявляется следующие требования: скорость и маленький размер. Поэтому чаще всего они пишутся на языке Си.
Иногда начинающие программисты пишут их на более высокоуровневых языках, но это часто становится предметом насмешек, когда маленькая программа начинает за собой тянуть целые горы дополнительных библиотек.
1.3 Программы Open Source
Есть целая культура разработки программы с открытым исходным кодом. Есть сообщества разработчиков, которые создают самые разные программы: от небольших утилит до операционных систем. Например, операционная система Linux.
Каждый желающий может подключиться к этой разработке, но при этом он должен полностью соблюдать принятые соглашения, которых немало в каждом проекте. Это и понятно, потому достаточно тяжело контролировать работу независимых добровольцев.
Если программист хочет принять участие в разработке Linux, то однозначно использование языка Си. Для разработки CMS WordPress обязательно использование языка PHP и СУБД MySQL. Для разработки libGDX нужно знание языка Java.
Но тут следует понимать, что навыки и умения программиста open source все-таки сильно отличаются от навыков программиста по найму. Главное отличие — это полная свобода. Никто не ставит задачи, не следит за выполнением и не наказывает за ошибки.
Часть 2. Коммерческие программы
В коммерческих проектах программист участвует для того, чтобы заработать деньги. Это диктует ряд правил, которые нужно соблюдать. И главное правило — программист пишет не для себя, а для того, чтобы его программой пользовался кто-то другой. На программистском сленге пользователь программы называется юзер. Поэтому программист должен учитывать запросы юзеров.
2.1 Разработка программ на заказ
Программирование на заказ — это самый выгодный способ получения денег для программиста. Потребность в программах просто колоссальная. Куда ни кинь, всем нужно что-то написать. Когда я писал программы на заказ, то ко мне реально стояла очередь на пару месяцев, потому что я не успевал выполнять заказы. Иногда для того, чтобы отстали, я завышал цену, а ее все равно платили.
В этой работе к технологиям программирования предъявляются достаточно жесткие требования. Начнем с того, что практически любая заказная программа — это база данных. То есть в любой компании работают с базами контактов, поставщиков, заказов, товаров и т.д. Поэтому программисту по-любому нужно разбираться в базах данных.
Далее, нужно знать офисные программы, потому что так или иначе результаты работы программы нужно будет передавать в Microsoft Word или Excel. Часто нужно будет делать конвертирование форматов файлов. То есть для полноценной работы на заказ нужно знать несколько языков программирования, несколько СУБД и кучу разнообразных знаний по интеграции программ.
И вот здесь, когда меня спрашивают: «Что лучше: Си или PHP?», я всегда отвечаю: «Для работы на заказ нужно и Си, и PHP и еще кучу всего». Только получите заказ, а там начнется.
Но есть и подстава. Она заключается в том, что нужно очень тщательно делать выбор используемых библиотек. Был у меня один случай. Я писал программу на заказ. Срок три месяца. И для используемой задачи идеально подошла библиотека на C++. Я начал работу на C++, через два месяца программа была почти готова, но возникла ошибка. Я две недели бился над этой ошибкой, но оказалось, что ошибка не в моем коде, а в библиотеке. Причем, по закону подлости, именно в том функционале, ради которого я эту библиотеку и выбрал. До сдачи проекта оставалось все две недели и я полностью с нуля переписал программу на чистом Си без всяких сторонних библиотек. Хотя для этого пришлось работать с утра до поздней ночи.
Поэтому программирование на заказ — это серьезная нагрузка на программиста.
2.2 Программы с косвенной оплатой
Есть один из вариантов заработка для программиста, когда он не требует напрямую деньги за свою программу, а получает эти деньги косвенно. Например, встраивает рекламу в свои приложения или предлагает основной функционал бесплатно, а дополнительный за деньги. Есть принцип распространения программ, который называется shareware, в этом случае пользователь может попробовать программу некоторое время бесплатно, но потом должен заплатить за нее.
Способов косвенной оплаты очень много. Мне часто спрашивают, стоит ли идти по этому пути? Я много общался с теми, кто использует этот метод заработка, и скажу следующее: как повезет. Если программа станет популярной, то заработать можно очень много. Например, я знаю программиста, который один раз написал удачную программу и теперь ежемесячно получает две-три тысячи долларов за на ее продажах. Практически, он сейчас больше не работает. Иногда, сядет и допишет какую-нибудь мелочь. В основном, путешествует по миру. Но это исключение. Обычно все-таки, деньги маленькие.
2.3 Программные комплексы общего назначения
Только сейчас мы добрались до той ниши, которую обычно имеют в виду, когда говорят о программировании. То есть, поступить по найму на работу программистом. Обычно именно это имеют в виду, когда обсуждают те или иные технологии программирования.
Но на самом деле когда программист приходит на работу, то там уже сложился некоторый инструментарий и принципы работы. То есть, если уже в компании выбран технология Java или технология .NET, то программист никак на это повлиять не может. Все, что ему нужно сделать — это выучить тот язык программирования, ту среду и тот фреймворк, который уже используется.
Иногда новички пытаются сопротивляться, но это всегда кончается плохо. Потому что начинается вечный конфликт — все делают так, а этот новичок — вот эдак. В конце концов его вызовет руководитель проекта и скажет: «Или работай как все, или увольняйся». Поэтому быть белой вороной не нужно.
К сожалению, нужно сказать, что далеко не всегда используются современные средства разработки. Я в свое время знал немало программистских компаний, которые уже в эпоху Windows продолжали писать программы для MS DOS. Тут объяснение простое — все привыкают и менять особо никто не хочет.
Поэтому для выбора того, что нужно работодателям, нужно внимательно ходить по сайтам с вакансиями и читать требования.
2.4 Программные комплексы специального назначения
Это особый вид программирования. Я сам начинал работу программистом в подобном проекте. Я начал работу в космической отрасли в корпорации «Энергия» (бывшее КБ Королева). Я писал программы для космической системы «Энергия-Буран». Программирование для космоса отличается тем, что предъявляет максимальные требования к надежности и безопасности программ. Прежде чем начать работу, мне сначала долго объяснили как именно обеспечивается надежность, как происходит тестирование и проверка программ. Никаких сил на это не жалели, сразу после выкатывания очередной версии отделом программистов начинал свою работу отдел тестировщиков, который подвергал программы самым разнообразным проверкам. И сам я участвовал в разработке системы сквозного тестирования программ, то есть я хорошо представляю, что такое проектирование надежных программ.
Нужно отметить, что есть области программирования, где надежность вообще неважна. Например, если в компьютерной игре игрок случайно пройдет сквозь стену, то это не будет катастрофой, скорее наоборот, добавит очков этой игре. А вот если космическая ракета полетит не туда…
Кстати, был свидетелем ошибки коллег программистов, которые отправляли космический зонд на Марс. У них в результате неверного кода была потеряна связь с этим зондом и он улетел неизвестно куда. До сих пор летит и думает: «А где же Марс?». Эту историю мне рассказал руководитель группы разработчиков за обедом в заводской столовой и сказал, что самое обидное заключалась в том, что ошибка была вследствие банальной невнимательности: одно число было случайно написано в восьмеричном коде.
Кроме того, соседний отдел занимался разработкой программ для атомной станции. Мы с ними часто общались и удивлялись, что методы надежности ПО в атомной промышленности сильно отличались от космических. В космосе не доверяли людям, взлет и посадка Бурана шли в полностью автоматическом режиме. А в атомной промышленности, наоборот, не доверяли компьютерам. Если бы Скайнет из Терминатора пробрался бы на советскую АЭС, у него не было бы шансов захватить власть. Любой оператор его бы вычислил и отрубил.
Поэтому, если вы будете заниматься программированием специального назначения, то сначала долго будете учиться тому, как это делать. Научиться заранее у вас не получится.
Подводя итог, можно сказать следующее. Программирование — это широкое поле деятельности. Поэтому нет одной дорожки. Выбирайте тот путь, который вам больше подходит, и изучайте те технологии, которые нужны для вашей цели.
Методы и технологии программирования
Описание презентации по отдельным слайдам:
1 слайд
Описание слайда:
2 слайд
Описание слайда:
Структурное программирование Модульное программирование Объектно-ориентированное программирование Визуальное программирование Облачные технологии
3 слайд
Описание слайда:
Метод программирования – способ, средство, определяющие стиль написания, откладки и сопровождения программ. Технология программирования – технологии разработки программ для ЭВМ, которые будут использоваться людьми для решения задач на ЭВМ.
4 слайд
Описание слайда:
Программирование осуществляется «сверху-вниз»; Программа состоит из подпрограмм с одним входом и одним выходом; Подпрограмма должно допускать только три основные структуры – последовательное выполнение, ветвление и повторение.
5 слайд
Описание слайда:
Модульное программирование – это метод разработки программ, при котором программа разбивается на независимые модули
6 слайд
Описание слайда:
Модуль – фрагмент программы, хранящийся в отдельной форме. Объектно-ориентированное программирование (ООП) – это метод программирования, при использовании которого главными элементами программ являются объекты.
7 слайд
НОУ ИНТУИТ | Лекция | Понятие технологии программирования, жизненный цикл программы и постановка задачи
Понятие технологии программирования
Технология – это набор правил, методик и инструментов, позволяющих наладить производственный процесс выпуска какого-либо продукта [1]. Разумеется, это определение нельзя назвать полным. Надо упомянуть процессы планирования, измерения, оценки качества, ответственность исполнителя и многое другое. Но в мою задачу не входит написание статьи для энциклопедии на слово «технология» – я дал какое-то представление о его значении и для начала разговора этого вполне хватит. Подчеркну только еще раз производственный характер понятия «технология». Почему-то именно слово «производство» сильно раздражает моих коллег-математиков, занимающихся программированием. «Ты бы еще технологию создания романа «Война и мир» создал». Недаром же известный специалист Дональд Кнут назвал свой знаменитый многотомный труд «Искусство программирования». Наконец, мне удалось выяснить отношение к этому понятию самого Д. Кнута. Несколько лет назад наш университет присвоил этому несомненно блистательному ученому звание почетного доктора. По такому случаю наш декан собрал для встречи с Д. Кнутом десять-двенадцать руководителей лабораторий и заведующих кафедрами, имеющих отношение к программированию. Дело было летом, Д. Кнут был с женой, переводчица поминутно смотрела на часы, напоминая, что гостям пора «на фонтаны», сам почетный доктор откровенно дремал, словом, это было скучнейшее мероприятие. Я решил пошутить, чтобы как-то развеять унылую атмосферу. И когда подошла моя очередь выступать, я вместо тридцатисекундного перечисления заслуг нашего коллектива сказал, что лично мне профессор Кнут доставил много неприятностей. Тот аж подскочил: «Я же в первый раз вас вижу!» Тут я объяснил, что много лет занимаюсь промышленной технологией программирования, а многие коллеги, включая и тех, кто сидит сейчас за этим столом, ссылаясь на его книгу, не признают это наукой, имеющей отношение к математике. Профессор очень разволновался, принял мою шутку вполне всерьез и пожаловался, что все это происходило и с ним: «Вы знаете, что я много лет занимался созданием и продвижением на рынок издательской системы TEX? Это что – не производство? Могу я на старости лет написать книжку с теоремами?»
В общем, я получил огромный заряд положительных эмоций.
Разумеется, я понимаю, что Д. Кнут известен скорее своими теоретическими работами, а TEX – это скорее от безысходности, он задумал его после выпуска первого тома «Искусства программирования», поражаясь скудости рынка инструментальных средств для набора математических текстов, прервался на несколько лет для реализации TEX и только потом продолжил свой титанический труд. Для него промышленное программирование – скорее бравада, что вот, мол, мы все можем, но все равно приятно получить поддержку от такого знаменитого ученого.
Мое первое столкновение с промышленностью состоялось в 1980-м году. К тому времени я уже несколько лет руководил лабораторией системного программирования, занимались мы самыми трудными проблемами, часто имеющими весьма отдаленное отношение к практике, но нас это нисколько не беспокоило. «Мат-мех – лучше всех» – в глубине души я и сейчас в этом уверен. Так вот, в декабре 1980-го года меня пригласили в кабинет ректора ЛГУ, там было человек двадцать в военной форме и несколько партийных деятелей во главе с начальником оборонного отдела Обкома КПСС. Мне было сказано, что оборонная промышленность столкнулась с массой проблем при создании программного обеспечения (ПО) систем оборонного назначения, поэтому решено, что ЛГУ в лице нашей лаборатории должен помочь. Моего согласия никто не спрашивал, да в те времена этого и не требовалось. Так я начал работать с ЛНПО «Красная Заря», «Импульс», «Морфизприбор», «Ленинец», «Аврора», «Гранит» – ведущими предприятиями Ленинграда, работающими в интересах различных родов войск и ведомств. С большинством этих предприятий мы работаем до сих пор.
Нас использовали как «пожарную команду». Много лет сотрудники названных и других предприятий разрабатывали ПО для важных заказов, когда же все сроки (и деньги!) истекали, приглашали нас, чтобы мы навели порядок. Нельзя сказать, что до этого мы жили в башне из слоновой кости. У нас были договора с НИЦЭВТ по созданию транслятора с языка Алгол 68 [2] для только что созданного (мы говорили «создранного») семейства ЕС ЭВМ, так что мы одними из первых освоили новую операционную систему OS/360. Пользуясь открытостью университета, к нам все время приходили какие-то люди (в том числе и военные) с просьбой найти ошибку в программе. Не было случая, чтобы мы искали ошибку больше двух дней.
Но все это не идет ни в какое сравнение с трудностями нашего понимания проблем реальной промышленности. Одно дело, когда у тебя в подчинении пятнадцать человек в университетской лаборатории, которых никогда не надо подгонять, сомневаться в их способностях, когда царит дух соревнования (не только между собой), когда все понимают друг друга с полуслова. Совсем другое дело — триста человек с совершенно разными способностями и образованием, явно отсиживающие свои восемь часов, работающие в кодах (буквально с инженерного пульта ЭВМ), причем все это погружено в атмосферу секретности. Мне никогда не забыть, как одна женщина целый час объясняла мне схему распределения памяти, которую она вычитала у одного японского автора. С большим трудом удалось выяснить, что она имеет в виду стек. Другой программист запомнился мне тем, что для возврата из процедуры использовал регистр Р7, хотя остальные триста человек для этой цели применяли Р10. Он еще доказывал, что именно он прав, так как Р7 – индексный регистр, поэтому передача управления по его содержимому выполняется на целую микросекунду быстрее. Мне так и не удалось объяснить ему важность соблюдения соглашения о связях.
Первыми из военных организаций к нам обратились сотрудники ЛНПО «Красная Заря» с просьбой помочь в программировании широкого класса задач управления и связи, в частности, в создании функционального программного обеспечения (ФПО) телефонных станций, управляемых специализированными ЭВМ (СЭВМ). Несколько лет ушло на изучение предметной области, пробные реализации и решение организационных вопросов. У сотрудников ЛГУ был исходный принцип важности использования алгоритмических языков высокого уровня (АЯВУ), основанный на опыте предыдущей работы. Однако начинать пришлось совсем не с этого, а с повышения общей культуры программирования разработчиков ФПО. Дело в том, что в области встроенного ФПО реального времени традиционно используются СЭВМ с нестандартной архитектурой, ориентированной на заданную предметную область (правда, неясно, в чем должна выражаться такая ориентация: например, если ЭВМ хорошо выполняет какие-то специальные операции, но плохо — условные переходы и вызовы процедур, которые встречаются гораздо чаще, можно ли считать, что данная ЭВМ соответствует предметной области?). Нестандартность архитектуры и малая тиражность таких СЭВМ приводят к отсутствию достаточно развитых операционных систем, трансляторов, средств отладки и других, ставших уже привычными, инструментов программирования. Поэтому мы столкнулись с работой на перфокартах и непосредственно за пультом СЭВМ «на тумблерах».
Мы пытались воспользоваться известными в то время технологиями, однако оказалось, что, например, Р-технология [3] не имеет никаких средств настройки на СЭВМ, а предлагаемые в ней графический стиль программирования и программа-организатор с ручным вводом мало помогают в решении задач реального времени; технология РУЗА позволяет автоматизированным образом (но с большими доработками) построить кросс-ассемблер нужной ЭВМ и интерпретатор ее системы команд, а также осуществить некоторую регламентацию работы (например, стандартизовать имена объектов). Р-технология была отвергнута практически сразу (за неимением конкретных программных средств на заданных нам СЭВМ), РУЗА в течение полугода была настроена на одну СЭВМ, однако полностью учесть все особенности СЭВМ так и не удалось; кроме того, параметрически настраиваемые кросс-ассемблер и интерпретатор замедляют работу в 5-7 раз.
ВВЕДЕНИЕ. Технологии программирования
На ранних этапах развития программирования, когда программы писались в виде последовательностей машинных команд, какая-либо технология программирования отсутствовала. По достижении сначала кажущегося непреодолимого уровня сложности возникла инженерия программирования.
До конца 70-х годов программирование, как правило, было работой отдельных одаренных людей. Из-за несовершенства первых методик программирования даже относительно короткие программы (длиной около 600 строк) создавались в течение нескольких месяцев.
Начало 80-х годов соответствовало широкому внедрению в практику программирования методов проектирования, заимствованных из техники. Например, по примеру техники, внедряется ГОСТ 19.102—77, регламентирующий стадии и этапы программных разработок. Данный стандарт входит в группу стандартов единой системы программной документации (ЕСПД). ЕСПД сыграла значимую положительную роль в практике отечественного программирования и пережила без значительных изменений уже несколько новых технологий программирования, например, технологию структурного программирования и технологию объектно-ориентированного программирования.
Технология программирования — это научная и практически апробированная стратегия разработки программ, содержащая описание совокупности методов и средств разработки программ, а также порядок применения этих методов и средств.
К настоящему времени понятия процесса программирования качественно изменились. Производство программ приобрело массовый характер, существенно увеличился их объем и сложность. Разработка программных комплексов потребовала значительных усилий больших коллективов специалистов. Программы перестали быть только вычислительными и начали выполнять важнейшие функции по управлению и обработке информации в различных отраслях науки, техники, в экономике и др.
С появлением систем авоматизированного проектирования (САПР) в 80-х годах были сделаны обобщения теории проектирования технических систем и устройств с выявлением инвариантов в виде проектных процедур, особенно эвристических. Были намечены пути и сделаны первые попытки их автоматизации. Наиболее высокую трудность представляет автоматизация ранних этапов проектирования. На этих этапах для удовлетворения потребности преодоления дискомфорта необходимо синтезировать идеи реализации систем и устройств.
Параллельное развитие теории программирования и теории проектирования сделало актуальным их системное исследование. Цель исследований, отраженных в данной книге, состояла в достижении позитивного дальнейшего взаимного проникновения этих теорий.
Внедрение учебника в учебный процесс авторы рекомендуют осуществить следующим образом. Лучше всего материалы гл. 4 и 5 изучить в предшествующих дисциплинах. Если рабочей программой курса предусмотрена семестровая работа, то после лекционного прочтения первой главы можно частично изложить материалы второй главы и далее приступить к изучению одной из технологий программирования (гл. 7, 8). После изложения материалов для выполнения семестровой работы можно вернуться к последовательному изложению материала. Окончательное закрепление навыков и знаний рекомендуется осуществить в ходе учебной практики, проводимой под контролем преподавателей.
Для тех, кто хочет приобрести навыки профессионального программиста самостоятельно, авторы рекомендуют прочитывать материал двух первых глав и параллельно с изучением языка программирования овладеть материалом четвертой главы.
Первая глава содержит сведения по основам теории проектирования, необходимые для ознакомления с терминологией проектирования вообще и основными принципами проведения программных проектов. Даются такие методологические понятия проектирования, как элементы системного подхода, а также одного из его важнейших методов — блочно-иерархического подхода. В главе поясняется место стандартов в программировании. Вводятся понятия жизненного цикла программного изделия, а также стадий и этапов проведения программных разработок. Раскрываются основные понятия моделирования систем и роль моделирования при разработке проектов программных систем, проводятся примеры моделей.
Во второй главе рассматриваются методы активизации мышления на ранних этапах проектирования программных изделий, что позволяет решить задачу выбора наилучшего варианта из множества допустимых проектных решений, которые удовлетворяют предъявленным требованиям. Методы поискового конструирования, заимствованные из техники, адаптируются применительно к программам. Даются примеры видов диалогов программ, что позволяет повысить эффективность разработки внешних функциональных спецификаций. Для полного освоения ряда положений главы может потребоваться несколько лет. Но ведь надо когда-то начинать становиться системным аналитиком.
В третьей главе излагается инженерный технологический подход к разработке программ, согласно которому достигается сокращение сроков разработки программных продуктов благодаря комбинации этапов и видов работ, ориентированной на разные классы программного обеспечения и на особенности коллектива разработчиков.
Четвертая глава раскрывает понятия физической и логической структуры данных программ. В главе рассматривается набор операций над структурами данных программ, приводится классификация логических структур данных, разбираются базовые структуры данных, динамические и динамически связанные структуры данных, а также файловые структуры данных. Рассматриваются способы документирования структур данных.
Пятая глава содержит описание методики разработки структурированных алгоритмов в форме проектной процедуры разработки функциональных описаний. Даются рекомендации по использованию проектной процедуры применительно областей, находящихся вне сферы программирования: техники, организационного обеспечения.
В шестой главе вводится понятие архитектуры программной системы, приводятся сведения по ряду способов объединения отдельных программ в единый программный комплекс.
Седьмая глава содержит описание технологии структурного программирования, которая считается устаревшей, но в настоящее время еще используется как самостоятельно, так и в гибридных объектно-ориентированных проектах. Ряд фундаментальных идей данной технологии был воспринят современными технологиями.
В восьмой главе рассматривается технология объектно-ориентированного проектирования. Разбираются основные понятия технологии. Даются шаги этапов выполняемых работ. Рассматриваются примеры выполнения проектов малой и средней сложности.
Девятая глава содержит понятие технологий визуального программирования. Данная технология позволяет в диалоговом режиме создавать «скелет» программы.
В десятой главе раскрывается понятие САПР программных разработок, основанных на CASE-средствах, позволяющих в наглядной форме моделировать предметную область, анализировать эту модель на всех этапах разработки и сопровождения программного проекта и разрабатывать приложения в соответствии с информационными потребностями пользователей. В главе рассматривается CASE-средство Rational Rose фирмы «Software Corporation» (США), предназначенное для автоматизации этапов анализа и проектирования программных систем, а также для генерации кодов на различных языках и выпуска проектной документации.
Одиннадцатая глава посвящена тестированию программ, позволяющих достичь заданного уровня важнейшего критерия качества программных изделий — надежности. В главе излагаются аксиомы тестирования, приемы отладки, различные подходы к тестированию программ.
В двенадцатой главе описываются основные принципы менеджмента программных разработок. Даются принципы организации коллектива разработчиков программных изделий, должностные обязанности и функции отдельных работников.
Приложение 1 необходимо для понимания стадий и этапов разработки программ по ГОСТ 19.102—77, но оно не заменяет, возможно, изменившийся текст стандарта.
Приложение 2 содержит пример выполнения учебного технического задания. Данный пример раскрывает принципы составления технического задания, но также не заменяет стандарт.
Приложение 3 дает представление о фонде эвристических приемов проектирования программ.
Приложение 4 содержит описание элементов языка программирования Object Pascal, оно необходимо для лучшего понимания гл. 8 и 9.
Приложение 5 раскрывает основные термины и определения, используемые в книге.
Поделитесь на страничке
Следующая глава >
10 технологий, которые программист должен освоить в 2019 году «Sabre
Размышляя о 2018 году
Считаю конец года временем для размышлений. Обдумывая 2018 год, я считаю, что для меня в Sabre это был хороший год. У меня была возможность поработать со многими умными людьми, поскольку мы вместе разработали множество хороших решений для путешествий. Хотя я доволен своими личными результатами, я не могу не думать о вещах, которые остались несделанными.
У всех нас мало времени, и мы должны определить, на что его потратить.Как инженер по связям с разработчиками в Sabre, я все время думаю и пишу программные приложения. Инструменты — это ключевая часть быстрого и качественного выполнения любой работы с программным обеспечением. Выбор правильных цифровых инструментов для создания программного обеспечения так же важен, как и выбор правильных отверток, молотков и зубил для домашнего проекта.
В этой статье мы подытожим десять технологий, которые я хочу лучше понять в 2019 году. Может быть, вы найдете несколько, которые тоже захотите изучить.
1.Docker — контейнеры кода для производства в облаке
Подумайте о том, как люди создавали вещи в прошлом: рецепты выпечки, контрольные списки для ковки металлических предметов и телефоны для повторных заказов. В любом случае есть шанс срезать путь, неверно истолковать, забыть, выплеснуть, споткнуться, округлить, случайно порезать, неправильно сложить и иным образом изменить способ создания вещи по сравнению с тем, как это делается всегда.
Некоторые изменения — вполне разумные улучшения.Некоторые изменения вызывают дефект, приводящий к остановке или падению производительности. Людям легко делать что-то немного по-другому каждый раз, когда они начинают проект. Часто это нежелательно.
Теперь подумайте о компьютерах и программных приложениях. Наши приложения закодированы в совершенстве цифрового представления. У нас должно получиться быстро сделать безупречную копию. Его можно доставить по стране за минуты, секунды, миллисекунды. Мы работали над этим годами, и этого все еще недостаточно.
Слишком много людей занимаются инициализацией серверов, загрузкой программного обеспечения, настройкой операционных сред и завершением развертывания. Как мы можем улучшить этот процесс для людей?
Docker — это технология, которая появилась как способ помочь мне доставлять точные копии моего программного приложения в среду по всему миру. Мы можем поставлять наше программное обеспечение быстро, по запросу и в больших масштабах. Это главное удобство управления.
Все, что необходимо нашему программному обеспечению для работы на любом оборудовании — облачном или локальном — объединено в пакет, называемый контейнером.Контейнеры используются в качестве основы для запуска новых серверов по запросу.
Программное обеспечение не просто написано один раз, а потом уже сделано. Программа и ее зависимости — это план по уничтожению большего количества копий для удовлетворения потребностей пользователей. Сравните этот идеал с традиционными производственными сборочными линиями. Контейнерная обработка помогает нам определить нашу фабрику программного обеспечения, созданную для штамповки деталей, собранных в безупречный конечный продукт.
Устранение многих трений, связанных с развертыванием, побуждает нас вносить изменения чаще.В результате наша команда становится лучше в разработке программного обеспечения. Уверенность возрастает, и мы делаем больше обновлений во имя фантастического пользовательского опыта. Несомненно, что приближение разработчиков к работе с их программным обеспечением — это положительное улучшение.
Частые мелкие изменения менее рискованны, чем отказ от нескольких крупных. Мы можем начать экспериментировать с существующими приложениями, чтобы настроить и отполировать их. Мы можем случайно запускать новые приложения, чтобы увидеть их реальные перспективы.
Рекомендуемые ресурсы:
2.JavaScript — самый важный язык улучшает
Самый важный язык программирования в мире значительно изменился несколько лет назад, и мы все еще пытаемся понять все это. Язык — JavaScript. Комитет, руководящий его развитием, задокументировал все улучшения и опубликовал их под названием «ES6» или «ES2015».
Мы увидели изменения в JavaScript, которые добавили новые операторы, расширенный синтаксис, дебютные структуры данных и увеличили портфель служебных функций.
Как я могу утверждать, что JavaScript — самый важный язык программирования в мире? Это единственный вариант, который работает в веб-браузерах.
Интернет — это основная платформа доставки для пользователей компьютеров во всем мире. Это также касается iOS, Android и других смартфонов. JavaScript дает возможность разработчикам внешнего интерфейса стать разработчиками полного стека благодаря Node. Узел — это JavaScript, работающий на внутреннем сервере. Изучение JavaScript стоит времени для любого активного программиста.
Если вы использовали JavaScript в последние десять лет, вы убедились, что он отлично работает. Зачем это улучшать? Потому что команды разработчиков загружают приложения JavaScript с большим количеством возможностей, функций и взаимодействий, чем когда-либо прежде. Размеры команд увеличиваются, а жизненные циклы программного обеспечения продлеваются.
Теперь у нас возросли ожидания в отношении пользовательского опыта в Интернете.
Если вы еще не пробовали новые функции JavaScript, вы быстро увидите, насколько лучше вы сможете с ним работать.Большая часть синтаксиса была значительно улучшена. Как? Он основан на изучении лучших аспектов каждого современного языка программирования, а также наблюдении за экспериментами, проводимыми над самим языком. Несколько исследовательских языков компилируются до JavaScript, используя его надежную среду выполнения. Подобные исследования вдохновляют руководящий комитет JavaScript.
Некоторые из новых синтаксисов настолько популярны и полезны, что я начал использовать их в 2018 году. Каждый раз, когда я добавляю новую функцию, я вижу, что можно использовать больше.Я заново изучаю JavaScript и ожидаю, что он займет у меня много времени в 2019 году.
Рекомендуемые ресурсы:
3. Go — новый язык, о котором многие говорят
Язык программирования Go за последний год привлек мое внимание из ряда источников. Настолько, что у меня возникло неприятное ощущение, что я упускаю что-то удивительное, что понимали лишь немногие инсайдеры. Программисты всегда в восторге от новых технологий, но повторяющиеся слухи о Go были постоянными.
Должны ли мы использовать что-то подобное только потому, что все остальные популярны? Нет, но когда вокруг чего-то сплачивается достаточно умных людей, это вызывает наше любопытство. Почти всегда в любом начинании, начиная с любопытства, есть ценные выводы.
После того, как я вкратце изучил Go, я понял, что у него интересная родословная, учитывая его дизайнеров и компанию-спонсора. Я собираюсь наивно утверждать, что Go — это серверный язык веб-стека. Это, вероятно, хорошо для написания сценариев утилит O / S и других задач автоматизации.С моей точки зрения, я изучил бы Go, чтобы заменить Java, Node, PHP и тому подобное.
Go имеет статическую типизацию для уменьшения количества ошибок во время выполнения, компилируется для повышения производительности, имеет соответствующий синтаксис, упрощающий его написание, и содержит библиотеки, отвечающие потребностям современных сетей. Все хорошие качества, и я понимаю, почему это вызывает энтузиазм.
Рекомендуемые ресурсы:
4. Дополненная реальность — смешивание реальности с информацией
Вообще говоря, дополненная реальность (AR) — это метод UX, позволяющий получать изображения реальной среды пользователя и накладывать на них цифровые улучшения.Цифровой слой предоставляет полезную информацию или веселую графику в 2D или 3D. Реальный фоновый слой обычно создается камерой, быстро сканирующей окружение пользователя.
Я идентифицирую себя как компьютерный программист и, к тому же, фронтенд-программист. Программистам, занимающимся фронтендом, нравится быть ближе к конечному пользователю, работая вместе с менеджерами по продукту и дизайнерами UX. Одним из возможных результатов AR является то, что он может стать «новым интерфейсом» в ближайшие пять-десять лет.
Существует множество решений для дополненной реальности. Одна конкретная комбинация набирает обороты:
- Родные приложения, работающие на Apple iOS.
- Язык программирования Swift для создания моего приложения.
- ARKit для измерения и отслеживания с помощью датчика дополненной реальности.
Обратите внимание, что AR рассматривается отдельно от виртуальной реальности (VR). Виртуальная реальность, как правило, удерживает зрителя привязанным к базовой станции — обычно в помещении. Другими словами, ношение очков в стиле маски, привязанных к настольному компьютеру, создает полностью синтетическую среду.
AR предпочтительнее, когда важно вывести пользователей в физический мир, где они могут сотрудничать с другими людьми. В некоторых отношениях дополненная реальность более проблематична, в других — более эффективна.
Рекомендуемые ресурсы:
5. Машинное обучение — поиск ценных закономерностей в данных
Машинное обучение (ML) — не новость для программистов в Sabre. В течение многих лет мы наблюдали, как это появляется в новостях, читаем о методах, применяем их в продуктах и извлекаем из них выгоду как потребители.С моей личной точки зрения, я ждал, что машинное обучение станет проще.
Пока что ML для меня слишком техничный и низкоуровневый. Исследователи все еще создают фундаментальные уровни для обеспечения функциональности машинного обучения, и я жду появления ведущего технологического стека. Я хочу, чтобы машинное обучение стало достаточно простым, чтобы разработчики приложений могли использовать его как повседневный инструмент.
Этот идеальный инструмент машинного обучения не обязательно должен быть потребительского уровня, но он должен предлагать больше абстракции и координации, чтобы типичные разработчики получали удовольствие от работы.Теперь ML кажется полным отраслевого жаргона и технических проблем для начала.
Большинству разработчиков следует освоить достаточно практичных технологий машинного обучения в 2019 году, чтобы почувствовать себя конкурентоспособными. Важно начать прислушиваться к словарю, понимать причины, почему и когда его использовать, и как писать код, применяя возможности библиотеки.
Рекомендуемые ресурсы:
6. CSS-сетка — макеты в ярком стиле
Каскадные таблицы стилей (CSS) — основная часть любого веб-сайта.Это язык разметки, позволяющий разработчикам определять графический дизайн отображаемых страниц и приложений, работающих в веб-браузерах. CSS работает вместе с HTML и JavaScript, создавая основные инструменты для создания пользовательского опыта в Интернете.
На протяжении многих лет дизайнеры добивались все большего контроля над компоновкой своих веб-страниц. Они ожидают того же идеального направления, что и в традиционных СМИ, таких как печать. Спрос растет. Размещение контента в браузере никогда не работало так хорошо, как мы надеялись и требовали.
Некоторые хитрости, включая использование тега «