Dimdim SoftWare
Мастерская Dr.dimdim
ГлавнаяПоискНаписать письмо
ГлавнаяМоделированиеПроектированиеТЗРазработкаИнтерфейсСтатьиСсылкиАвтор
Главная > Программная инженерия
Функции, черты и особенности мышления профессиональных программистов

"Профессиональное программирование. Системный подход." И.Одинцов


Математик делает то, что можно, так, как нужно. А программист — то, что нужно, так, как можно.
Программистский фольклор

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


Выделим основные функции профессиональных программистов [Цейтин 1990] [Буч, Рамбо, Джекобсон 2000].

  • Разработка систем большого объема. Профессионалы знают, что "выход за некоторую границу сложности создаваемого программного продукта без надлежащей   технологии   разработки   вообще   невозможен".  Системы большого объема создают новые принципиальные трудности. Прекрасно сравнение программирования больших систем со, смоляными ямами до исторических времен, в которых увязают динозавры [Брукс 1999]: "Казалось, ничто в отдельности не вызывает трудностей — одну лапу всегда можно   вытащить.   Однако   накопление  действующих  одновременно   и взаимовлияющих факторов все более и более замедляет движение". Еще один образный пример приводится в книге по языку UML [Буч, Рамбо, Джекобсон 2000]: "Если вы хотите соорудить собачью конуру, то можете приступить к работе, имея в наличии лишь кучу досок, горсть гвоздей, молоток, плоскогубцы и рулетку. ...Хотя это и кажется комичным, мно гие компании, разрабатывающие программное обеспечение, хотят создать небоскреб, в то время как их подход к делу очень напоминает строительство собачьей конуры".
  • Создание системного и инструментального программного обеспечения, которым будут пользоваться остальные. Профессиональными программиста­ми создается инструментальное обеспечение в большом диапазоне — от профессионального до массового. Важная подзадача в этой области — создание языков, систем, интерфейсов, позволяющих пользователю рабо­тать в его собственных понятиях, а не в тех, которые навязаны особенностями традиционного языка программирования или архитектурой  компьютера.
  • Разработка программного продукта с предъявлением особых требований к
    его качеству и эффективности. 
    Различные требования  предъявляются
    к программам, создаваемым только для себя, и к программам, предназначенным для большого количества пользователей. Во втором случае любая
    неаккуратность и малейшая небрежность может повториться многократ­но в работах будущих пользователей.
  • Разработка программ на основе подхода открытых систем. Открытая сис­
    тема
    (open system) — система, которая состоит из компонентов, взаимо­
    действующих друг с другом через стандартные интерфейсы. Общие свой­
    ства открытых систем таковы:
    • мобильность  (переносимость)  кода. Мобильность дает  возможность легко переносить программное обеспечение на различные архитектур­ные и операционные платформы;
    • интероперабельность. Дает возможность легко осуществить обмен данными и взаимодействие с прикладными задачами в других системах;
    • соответствие стандартам. После того как стандарт принят, он стано­вится силой, помогающей двигаться вперед. Как это ни парадоксаль­но, но следование канонам дает новые степени свободы в современ­ном мире.
  •  Применение системного анализа,  включающего умение  оценивать конкретные обстоятельства и следовать каждый раз наиболее приемлемому стилю. В голове программиста должны накопиться блоки знаний, чтобы он мог начать сравнивать эти блоки и мыслить блоками. Чтобы отличить структурное программирование от объектно-ориентированного програм­мирования и оценить их пригодность для решения конкретных задач, на­до иметь в голове и ту и другую методологию.

Черты и особенности мышления программистов

Профессиональные программисты имеют свои черты, качества, способности и особенности мышления. Наиболее важными из них являются приведен­ные ниже [Цейтин 1990] [Дейкстра 1975].

  • Способность определить архитектуру программы, т. е. разбить сложную задачу на элементарные составляющие и задать их комбинирование. Это основное качество программиста, связанное непосредственно с написанием программ.
  • Умение видеть задачу одновременно на разных уровнях детализации. Про­граммист должен свободно переходить от описания задачи в крупных понятиях  к стоящим за этими  понятиями  сущностям  более  низкого
    уровня.
  • Умение представлять себе проектируемый процесс в динамике. Обрабаты­ваемые данные в некоторый момент времени могут иметь одни значения и взаимоотношения, а в следующий момент некоторые из них могут измениться.
  • Умение видеть дальше одной разрабатываемой в данный момент программы.
    Следует учитывать широкое окружение данной частной задачи и воз­можность ее включения в некоторую общую систему. Считается, что эта черта в значительной степени отличает профессионального программиста от хакера,  ориентированного на скорейшее  получение  конечного результата.
  • Умение обобщать типичные ситуации. Эта особенность означает, что не обходимо уметь находить в программе идейно однородные участки. Для таких участков необходимо принять решение по их обобщению, выяснить его границы и выбрать наилучший способ программной реализации найденного решения. Это может быть как разработка функции или паке­та, так и копирование в новую программу фрагментов из старой.
  • Умение применять и комбинировать хорошо известные программистские приемы и типовые алгоритмы. Большинство новых идей должно находиться в тесном взаимодействии с уже известными идеями и методами.
    Простые и изящные решения типичных задач, возникающих в объектно- ориентированном программировании, приведены в книге "приемы объектно-ориентированного программирования. Паттерны проектирования" [Гамма, Хелм, Джонсон, Влиссидес 2001].
  • Наличие комплексного мышления, включающего умение заранее определить
    этапы, которые нужно пройти, чтобы решить тот или иной вопрос;
  • Культура собственного труда, умение обеспечить себя необходимым инструментарием для работы.
  • Способность анализировать собственные ошибки. Эта черта указывает на требовательность программиста к себе с одной стороны и применение стиля программирования, уменьшающего количество ошибок, с другой.
  • Умение работать в коллективе. Практически любая крупная разработка носит коллективный характер. Успех всей работы зависит от взаимопо­нимания, распределения функций и взаимоотношений в коллективе.
  • Умение работать с пользователем. Профессиональный программист дол жен понимать потребности пользователя, уметь оценить удобство кон кретных форм интерфейса, иметь возможность приучить пользователя к новым средствам и системам. Программист должен обладать хотя бы минимумом психологических знаний, помогающих ему в общении с поль­
    зователем.
  • Владение интеллектуальными средствами, которые применяются для по­нимания программы. Эдсгер Дейкстра (Edsger Dijkstra) [Дейкстра 1975] выделяет следующие три основных средства, которыми должен обладать профессиональный программист:
    • абстракция. Абстракция проникла во все аспекты программирования. Алгоритм — это то, что остается от конкретных значений обрабаты­ваемых данных.  Переменная —  абстракция  соответствующего теку­щего значения. Абстракция  присутствует в  процессе  присваивания операциям имен и использования этих операций. Язык программиро­вания —   это   лишь   средство   описания   абстрактных   конструкций.
      Программист должен иметь способность полностью абстрагироваться от несущественных деталей, думая на нескольких уровнях абстракции одновременно;
    • перечисление. К перечислению прибегают, когда пытаются проверить правильность вычислений, которые сводятся к обозримому множеству последовательно выполняемых операторов. Сюда также включаются условные операторы выбора одного из двух или более вариантов;
    • математическая индукция. Математическая индукция — единственный способ рассуждений, который в конечном итоге позволяет работать с циклами и с рекурсивными процедурами;
  • Следование вопросам общечеловеческой этики. Эти вопросы исследованы в книгах Достоевского [Достоевский 1985]. Анализ одной из программист ских этических проблем представлен в работе [Leveson-Turner 1993].
  • Чарльз Уэзерелл  (Charles Wetherell)   [Уэзерелл 1982]  перечисляет  способ­ности, которые необходимы программисту. Приведем некоторые из них.
  • Способность четко видеть действительные трудности и отбрасывать все, не относящееся к делу.
  • Способность выявлять все случаи, где можно применить теорию, самостоя­тельно решиться на ее применение или обратиться за советом к более опытному программисту.
  • Способность при неудаче подавить самолюбие и поискать другой подход.
Вверх

<<Назад

Главная| ИС.. | Моделирование | Проектирование | ТЗ | Разработка | Интерфейс | Статьи | Ссылки | Автор
DimDim SoftWare Мастерская Dr. dimdim Copyright 2003-2004
Администратор info-system@mail.ru
Последнее обновление 26-Дек-2003