Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 787
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
802
ЧАСТЬ VII Мастерство программирования
33.2. Интеллект и скромность
Интеллект не кажется чертой характера и на самом деле не является им. Высочайший уровень интеллекта — далеко не главное условие для человека, желающего стать хорошим программистом.
Что? Для этого не нужно быть суперинтеллектуальным?
Нет, не нужно. Никто не обладает достаточным для програм- мирования уровнем интеллекта. Чтобы полностью охватить и понять сразу все детали даже средней программы, чело- век должен был бы обладать почти неограниченными воз- можностями. Способ использования интеллекта важнее, чем его уровень.
Как было сказано в главе 5, лекцию, посвященную получению премии Тьюринга в 1972 году, Эдсгер Дейкстра назвал «The Humble Programmer» («Скромный про- граммист»). Дейкстра заявил, что большинство аспектов программирования являет собой попытки компенсации строго ограниченных способностей разума. Самые лучшие программисты — те, кто понимают, насколько ограничены их возможно- сти. Они скромны. Худшие программисты отказываются признать, что их способ- ности не соответствуют задаче. Характер не позволяет им стать отличными про- граммистами. Чем усерднее вы работаете над компенсацией ограниченных воз- можностей своего разума, тем лучше будете программировать. Быстрота вашего развития напрямую зависит от вашей скромности.
Многие методики эффективного программирования призваны снизить нагрузку на мозг. Вот несколько примеров.
쐽
Цель «декомпозиции» системы — сделать систему проще для понимания (см.
подраздел «Уровни проектирования» раздела 5.2).
쐽
Обзоры, инспекции и тестирование представляют собой способы компенса- ции ожидаемых человеческих оплошностей. Эти методики обзоров возникли как часть «обезличенного программирования» (Weinberg, 1998). Если бы мы никогда не совершали ошибок, нам не нужно было бы выполнять обзоры сво- его кода. Однако наши интеллектуальные способности ограничены, поэтому мы дополняем их способностями других людей.
쐽
Ограничение объема методов снижает нагрузку на ум.
쐽
Написание программ в терминах проблемной области, а не низкоуровневых деталей реализации, преследует ту же цель.
쐽
Использование всевозможных конвенций освобождает разум от забот о баналь- ных аспектах программирования, не приносящих особой пользы.
Возможно, вы думаете, что было бы благороднее развить умственные способнос- ти и отказаться от этих костылей. Возможно, вам кажется, что программист, ис- пользующий умственные костыли, идет окольными путями. Однако эмпирически было показано, что скромные программисты, компенсирующие свои недостатки,
пишут более понятный код, содержащий меньше ошибок. Настоящий окольный путь — это путь ошибок и сорванных планов.
Чтобы стать экспертом в прак- тической или научной области,
нужны огромный труд и долгое время. Если человек добросове- стно трудится каждый час ра- бочего дня, когда-нибудь он проснется одним из самых ком- петентных специалистов своего поколения.
Уильям Джеймс
(William James)
ГЛАВА 33 Личность
803
33.3. Любопытство
Как только вы признали, что ваши способности слишком малы для понимания большинства программ, и поняли, что эффективное программирование — это поиск способов компенсировать данный недостаток, вы начинаете этот поиск,
продолжающийся вплоть до окончания карьеры. А поэтому важная черта харак- тера программиста — любопытство к техническим вопросам. Релевантная техни- ческая информация постоянно изменяется. Многим Web-программистам никог- да не приходилось программировать для Microsoft Windows, а многие разработ- чики программ для Windows никогда не имели дела с DOS, UNIX или перфокар- тами. Специфические особенности технической среды изменяются каждые 5—10
лет. Если вы недостаточно любопытны для того, чтобы не отставать от измене- ний, вы рискуете разделить участь динозавров.
Программисты часто так заняты работой, что у них не остается времени на изуче- ние более эффективных способов работы. Если это относится и к вам, вы не оди- ноки. Ниже я расскажу, как развить любопытство и сделать обучение приоритетом.
Изучите процесс разработки Чем больше вы узнаете о процессе разработки ПО из книг или на собственном опы- те, тем лучше будете понимать изменения и тем эффектив- нее вести свою группу в правильном направлении.
Если ваша работа состоит исключительно из краткосрочных заданий, не способ- ствующих развитию навыков, подумайте, как исправить эту ситуацию. Если вы работаете на конкурентном рынке ПО, половина ваших знаний устареет за три года. Без обучения вы превратитесь в ископаемое.
Не тратьте время, работая на компанию, не учитывающую ваших инте- ресов. Несмотря на экономические подъемы и спады и перемещение некоторых рабочих мест в другие регионы, ожидается, что среднее чис- ло рабочих мест, связанных с программированием, за период с 2002 до 2012 года в США значительно увеличится. Ожидается, что число должностей системных ана- литиков вырастет примерно на 60%, а разработчиков ПО — примерно на 50%. Что касается всех должностей, связанных с компьютерами, то в дополнение к 3 мил- лионам имеющихся рабочих мест за это время будет создано еще около 1 милли- она мест (Hecker, 2001; BLS, 2004). Если работа не способствует вашему развитию,
найдите другую работу.
Экспериментируйте Экспериментирование с процессами программирования и разработки — эффективный способ самообразования. Если вы не знаете, как работает какая-то возможность языка, напишите небольшую программу и узнайте. Создайте прототип. Изучите выполнение програм- мы в отладчике. Гораздо лучше написать короткую програм- му для проверки какой-то возможности, чем создать большую программу, реализовав в ней возможность, которую вы не совсем понимаете.
А если короткая программа показывает, что какая-то функция работает не так, как вы хотите? Этого-то вам и нужно! Лучше обнаружить это в небольшой програм- ме, чем в большой. Быстро совершая ошибки и извлекая из них уроки, вы облег-
Перекрестная ссылка О важно- сти процесса разработки ПО см.
раздел 34.2.
Перекрестная ссылка Идея эк- спериментирования лежит в основе нескольких ключевых аспектов программирования
(см. подраздел «Эксперименти- рование» раздела 34.9).
804
ЧАСТЬ VII Мастерство программирования чите себе путь к эффективному программированию. Ошибка — не грех. Неспо- собность к обучению на основе ошибок — вот что такое грех.
Читайте о решении проблем Решение проблем — глав- ный аспект создания ПО. Эксперименты показали, что люди не всегда находят эффективные стратегии решения проблем сами, хотя легко обучаются этим стратегиям (Simon, 1996).
Так что, даже если вы хотите изобрести колесо, успех не га- рантирован — ваше колесо может оказаться квадратным.
Анализируйте и планируйте, прежде чем действовать Анализ и действие несколько противоречат друг другу. В какой-то момент вы должны прекратить сбор данных и начать действовать. Однако проблемой большинства программистов является не избыточный анализ. Как правило, чаша действия значительно пере- вешивает чашу анализа, и проблема «аналитического паралича» крайне редко угрожает программистам.
Изучайте успешные проекты Особенно хороший спо- соб самообразования — изучение опыта лучших програм- мистов. Джон Бентли (Jon Bentley) считает, что вы должны иметь возможность сесть в кресло со стаканом бренди и сигарой и читать про- грамму, как хороший рассказ. Это не так неестественно, как кажется. Большин- ству людей не хотелось бы тратить свободное время на анализ 500-страничного листинга, но многим вполне понравилось бы изучить высокоуровневый проект кода и погрузиться в некоторые тонкости.
При разработке ПО крайне редко используются данные о прошлых успехах и неудачах. Если бы вас интересовала архитектура, вы изучили бы чертежи Луиса
Салливана, Фрэнка Ллойда Райта и других известных архитекторов. Возможно, вы посетили бы спроектированные ими здания. Если бы вас интересовало проекти- рование строительных конструкций, вы изучили бы мосты Brooklyn Bridge, Tacoma
Narrows Bridge и другие структуры из бетона, стали и дерева. Вы изучили бы при- меры успехов и неудач в своей отрасли.
Томас Кун указывает на то, что частью любой зрелой науки является набор удач- ных решений проблем, которые можно использовать в качестве образцов при последующей работе (Kuhn, 1996). Разработка ПО только начинает приближать- ся к этому уровню зрелости. В 1990 году организация Computer Science and Tech- nology Board пришла к выводу, что задокументированных исследований успехов и неудач в отрасли разработки ПО мало (CSTB, 1990).
В журнале «Communications of the ACM» приводятся доводы в пользу обучения на основе исследований конкретных проблем программирования (Linn and Clancy,
1992). Это кое о чем говорит. То, что один из самых популярных разделов в компь- ютерных журналах — «Programming Pearls» — был создан на основе исследований конкретных случаев проблем программирования, также наводит на мысли.
А одна из самых популярных книг по разработке ПО — «Мифический человеко- месяц» — основана на исследовании управления проектом разработки IBM OS/360.
Имеется ли у вас книга, включающая исследования конкретных проблем програм- мирования, или нет, ищите код, написанный лучшими программистами, и читай- те его. Постарайтесь изучить код программистов, которых вы уважаете. Взгляни-
Дополнительные сведения От- личный учебник по решению проблем — книга Джеймса
Адамса «Conceptual Blockbus- ting» (Adams, 2001).
http://cc2e.com/3320
ГЛАВА 33 Личность
805
те на код программистов, которых вы не уважаете. Сравните их варианты кода между собой и со своим собственным. Каковы различия? Почему код различает- ся? Какой вариант лучше? Почему?
Не ограничивайтесь чтением кода других программистов — старайтесь также узнать, что эксперты думают о вашем коде. Найдите высококлассных программи- стов, которые согласились бы покритиковать ваш код. Слушая критику, игнори- руйте аспекты, связанные с их субъективными взглядами, и сосредоточьтесь на важных моментах. После этого измените свой подход к программированию так,
чтобы он стал еще лучше.
Читайте! У многих программистов документация вызывает страх. Очень часто она плохо написана и организована, и все же преодоление «документофобии» мо- жет принести большую пользу. Документация — это ключ к замку ПО, и ее чтение никогда не бывает пустой тратой времени. Игнорирование имеющейся информа- ции стало настолько частым явлением, что привело к возникновению специально- го акронима «RTFM!», который расшифровывается как «Read the !#*%*@ Manual!»
Почти все современные языки дополняются огромным объемом библиотечного кода.
Время, потраченное на изучение документации к библиотекам, будет хорошей инвестицией. Скорее всего компания, разработавшая данную версию языка, уже создала массу нужных вам классов. Если это так, приложите все усилия, чтобы оз- накомиться с ними. Просматривайте документацию примерно каждые два месяца.
Читайте другие книги и периодические издания
Похвалите себя за чтение этой книги. За это время вы про- двинулись вперед гораздо дальше, чем большинство ваших коллег, потому что объем этой книги превышает годичный объем чтения большинства программистов (DeMarco and
Lister, 1999). Неторопливое, но регулярное чтение — надежный путь к высоким профессиональным достижениям. Если, читая примерно по 35 страниц в неде- лю, вы будете прочитывать одну хорошую книгу по программированию каждые два месяца, скоро вы получите основательный багаж знаний и начнете выгодно отличаться почти от всех окружающих вас разработчиков.
Общайтесь с единомышленниками Познакомьтесь с другими людьми, стре- мящимися улучшить навыки разработки ПО. Посещайте конференции, вступите в группу пользователей, общайтесь на Интернет-форумах.
Постоянно стремитесь к профессиональному разви-
тию Хорошие программисты всегда ищут возможности дальнейшего совершенствования. Обдумайте следующую лестницу профессионального развития, используемую в моей и нескольких других компаниях.
쐽
Уровень 1: начало Новичок — это программист, спо- собный использовать базовые возможности одного языка. Такой человек мо- жет писать классы, методы, циклы и условные операторы, а также использо- вать многие средства, поддерживаемые языком.
Перекрестная ссылка Книги,
которые следовало бы прочи- тать любому программисту, ука- заны в разделе 35.4.
Дополнительные сведения Об уровнях развития программис- та см. главу 16 книги «Profes- sional Software Development»
(McConnell, 2004).
806
ЧАСТЬ VII Мастерство программирования
쐽
Уровень 2: средний уровень Программист среднего уровня прошел началь- ный этап, может использовать базовые возможности нескольких языков и очень хорошо владеет по меньшей мере одним языком.
쐽
Уровень 3: компетентность Компетентный программист обладает экспер- тными знаниями языка, среды или того и другого. Программист этого уровня может знать все тонкости J2EE или помнить все аннотированное справочное руководство по C++. Такие программисты очень ценны для работодателей, и многие из программистов никогда не поднимаются выше этого уровня.
쐽
Уровень 4: лидерство Лидер имеет квалификацию программиста 3-го уровня и понимает, что программирование на 85% состоит из общения с людьми и лишь на 15% — из общения с компьютером. Средний программист только 30%
времени работает в одиночку (McCue, 1978) и еще меньше времени тратит на взаимодействие с компьютером. Гуру программирования пишут код для людей,
а не для машин. Истинные гуру пишут абсолютно ясный код, не забывая при этом комментировать его. Они не хотят тратить свои драгоценные умствен- ные ресурсы на восстановление логики какого-то фрагмента кода, если ее можно было бы легко понять, прочитав краткий комментарий.
Прекрасный программист, не уделяющий должного внимания удобочитаемости кода, вероятно, сможет достичь лишь уровня 3, да и то в самом лучшем случае.
Судя по моему опыту, главная причина нечитабельности кода в том, что код плох.
Никто не говорит себе: «Мой код плох, поэтому я сделаю его непонятным». Про- граммисты просто не понимают свой код достаточно хорошо, чтобы сделать его удобочитаемым, и это запирает их на одном из более низких уровней.
Самый худший код, который я когда-либо видел, написала женщина, никому не позволявшая изучать ее программы. В конце концов начальник пригрозил ей уволь- нением, если она не будет сотрудничать с коллегами. В ее коде полностью отсут- ствовали комментарии, но зато в избытке имелись глобальные переменные с именами вроде
x, xx, xxx, xx1 и xx2. Начальник ее начальника считал ее отлич- ным программистом, потому что она быстро исправляла ошибки. Качество ее кода предоставило ей массу возможностей продемонстрировать свой талант исправ- ления ошибок на деле.
Быть программистом начального или среднего уровня — не грех. Быть компетен- тным программистом, а не лидером, также не грех. Но если вы знаете, что нужно делать для собственного развития, и ничего не предпринимаете, иначе как гре- хом это назвать нельзя.
33.4. Профессиональная честность
Становление высококвалифицированного программиста предполагает развитие обостренного чувства профессиональной честности, которая может проявляться в самых разных формах:
쐽
отказ от притязаний на роль эксперта, если вы им не являетесь;
쐽
охотное признание собственных ошибок;
쐽
стремление разобраться в предупреждениях компилятора вместо их отключения;