ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.10.2023
Просмотров: 428
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
236 Глава 8
На первый взгляд эта функция выглядит нормально, но при бли- жайшем рассмотрении в ней обнаруживается проблема. Если в этом массиве нет положительных чисел, тогда значение переменной pos- itiveCount будет равно нулю, когда цикл завершится, и это приведет к делению на ноль в конце функции
X
. Поскольку это деление с пла- вающей точкой, в программе может произойти не сбой, а скорее она продемонстрирует странное поведение в зависимости от того, как значение этой функции используется всей программой.
Если вы хотите быстро запустить свой код, то, обнаружив эту проблему, можете добавить код для обработки случая, когда значе- ние переменной positiveCount равно нулю, и двигаться дальше. Но если вы хотите расти как программист, вы должны спросить себя, какую ошибку вы совершили. Разумеется, конкретная проблема за- ключается в том, что вы не учли возможности деления на ноль. Тем не менее, если ваш анализ ограничится этим, то в будущем вам это не поможет. Конечно, вы можете столкнуться с другой ситуацией, когда делитель может оказаться равным нулю, однако это бывает нечасто.
Вместо этого мы должны спросить, какой общий принцип был нару- шен. Ответ: мы всегда должны искать специальные случаи, которые могут нарушить работоспособность кода.
Если мы учтем этот общий принцип, мы с большей вероятно- стью заметим в наших ошибках закономерности и, следовательно, с большей вероятностью отследим эти ошибки в будущем. Вопрос:
«Есть ли здесь возможность деления на ноль?» — не так полезен, как вопрос: «Каковы специальные случаи для этих данных?» Постановка более широкого вопроса будет напоминать не только о возможном делении на ноль, но и о пустых наборах данных, о данных вне ожи- даемого диапазона и т.д.
Планирование с учетом недостатков дизайна
Чтобы справиться с недостатками дизайна, требуются другие подхо- ды. Тем не менее первый шаг тот же: вы должны обнаружить эти недо- статки. У многих людей возникают проблемы на этом этапе, поскольку они не любят смотреть на себя столь критично. Мы приучены скрывать личные недостатки. Это похоже на то, когда на собеседовании при при- еме на работу вас спрашивают о вашем самом большом недостатке, и в ответ вы говорите какую-то глупость о том, что вы слишком сильно переживаете о качестве своей работы, вместо того, чтобы рассказать о
настоящем недостатке. Однако так же, как у Супермена есть свой крип- тонит, даже лучшие программисты имеют свои слабые стороны.
Вот примерный (разумеется, не исчерпывающий) список недо- статков программистов. Посмотрите, узнаете ли вы себя в любом из этих описаний.
Замысловатый дизайн
Программист с таким недостатком создает программы, которые имеют слишком много частей или слишком много шагов. Несмо-
Думайте как программист 237
тря на то, что программы работают, они не внушают доверия — как изношенная одежда, которая выглядит так, будто готова раз- валиться, стоит потянуть за нитку, кроме того, эти программы явно неэффективны.
Сложности с началом работы
Этот программист имеет высокую степень инерции. Либо из-за недостатка уверенности в своих навыках решения задач, либо из- за банальной прокрастинации, этот программист ждет слишком долго, прежде чем приступить к делу.
Отсутствие тестирования
Этот программист не любит формально тестировать код. Часто код подходит для общих случаев, но не справляется со специ- альными случаями. В других ситуациях код работает нормально, но не «масштабируется» для более крупных задач, которые этот программист не тестировал.
Чрезмерная уверенность
Уверенность в себе — это прекрасная вещь, данная книга при- звана повысить уверенность читателей, однако слишком боль- шая уверенность иногда может быть такой же проблемой, как слишком маленькая. Чрезмерная уверенность проявляется по- разному. Чрезмерно уверенный в себе программист может по- пытаться реализовать более сложное решение, чем нужно, или выделить слишком мало времени на завершение проекта, в ре- зультате чего получается недоработанная и полная ошибок про- грамма.
Слабость в определенной области
Эта категория охватывает множество разнообразных проблем.
Работа некоторых программистов протекает достаточно гладко, пока они не столкнуться с определенными концепциями. Возь- мем темы, обсуждавшиеся в предыдущих главах этой книги. Даже после выполнения упражнений большинство программистов бу- дут ориентироваться в некоторых областях лучше, чем в других.
Например, возможно, программист теряется при работе с ука- зателями или у него голова идет кругом из-за рекурсии. Может быть, у программиста проблемы с разработкой сложных классов.
Дело не в том, что программист не может разобраться и решить задачу, а в том, что это требует тяжелой работы и напоминает езду по грязи.
Существуют разные способы противостоять своим крупным не- достаткам, и как только вы их осознаете, вы легко сможете сплани- ровать свою работу с их учетом. Например, если вы программист, ко- торый часто пропускает этап тестирования, сделайте тестирование неотъемлемым пунктом своего плана написания каждого модуля и не переходите к следующему модулю, пока не поставите галочку в соот- ветствующем месте. Кроме того, вы можете рассмотреть парадигму
238 Глава 8
под названием « разработка через тестирование», в рамках которой сна- чала пишется тестовый код, а затем код для прохождения этого те- ста. Если у вас возникают проблемы с началом работы, используйте принципы деления или уменьшения задач и начинайте писать код, как можно быстрее, понимая, что позднее вам, возможно, придет- ся его переписать. Если ваши проекты часто оказываются слишком сложными, добавьте специальный этап рефакторинга в свой мастер- план. Суть в том, что, какие бы недостатки как у программиста у вас ни были, если вы их осознаете, вы можете спланировать свою рабо- ту с их учетом. В этом случае ваши слабости больше не будут являться слабостями, а будут просто препятствиями на пути, которые вы буде- те объезжать, двигаясь к успешному завершению проекта.
Планирование с учетом ваших сильных сторон
Планирование с учетом слабых сторон в значительной степени на- правлено на избегание ошибок. Однако хорошее планирование за- ключается не только в том, чтобы не допустить ошибку. Смысл в том, чтобы достичь наилучшего из возможных результатов, учитывая су- ществующие способности и любые ограничения, в которых вам при- ходится работать. Это означает, что вы также должны включить в мастер-план свои сильные стороны.
Вы можете подумать, что этот раздел не про вас или, по край- ней мере, пока не про вас. В конце концов, если вы читаете эту кни- гу, вы все еще находитесь на этапе становления программистом. Вы можете усомниться в наличии у себя каких-либо сильных сторон на данном этапе своего развития. Я утверждаю, что у вас есть сильные стороны, даже если вы о них еще не знаете. Далее приведен список распространенных сильных сторон программистов, который ни в коем случае не является исчерпывающим, с описаниями каждой из них и подсказками, помогающими вам понять, насколько тот или иной пункт относится к вам.
Зоркий глаз на детали
Такой программист может предвидеть специальные случаи, предвосхищать потенциальные проблемы в плане производи- тельности и никогда не позволяет общей картине заслонить важные детали, которые необходимо учесть, чтобы программа представляла собой завершенное и корректное решение. Про- граммисты с такой сильной стороной обычно проверяют свои планы на бумаге перед кодированием, пишут код медленно и ча- сто его тестируют.
Быстрое обучение
Такой программист быстро осваивает новые навыки, независи- мо от того, изучает ли он новую технику на уже известном языке или работает с новым каркасом приложений. Он получает удо- вольствие от изучения нового и может выбирать проекты, исхо- дя из этого предпочтения.
Думайте как программист 239
Быстрое кодирование
Такому программисту не требуется много времени изучать спра- вочник, чтобы создать функцию. Когда приходит время наби- рать текст, код течет из-под кончиков пальцев такого кодера без особых усилий и с малым количеством синтаксических ошибок.
1 ... 26 27 28 29 30 31 32 33 34
Упорство
Некоторые программисты воспринимают досадную ошибку как личное оскорбление, которое нельзя игнорировать. Это похо- же на то, что программа ударила программиста по лицу кожаной перчаткой, и ему необходимо ответить на вызов. Кажется, что такой программист всегда остается уравновешенным, решитель- ным и никогда сильно не расстраивается, будучи уверенным в том, что при достаточных усилиях победа будет гарантирована.
Превосходные навыки решения задач
Вероятно, когда вы купили эту книгу, вы еще не были мастером решения задач, но теперь, после изучения этого руководства, вам многое может начать казаться более легким. Программист с этой чертой начинает предполагать потенциальные решения за- дачи еще во время чтения ее условия.
Энтузиазм
Для такого программиста рабочая программа похожа на удиви- тельный ящик с игрушками. Энтузиаст очень любит, когда ком- пьютер выполняет его или ее приказы, и обожает ставить перед машиной все новые задачи. Это может выражаться в добавлении в рабочую программу все большего количества функций — сим- птом, известный под названием ползучий «улучшизм». Кроме того, такой программист может многократно подвергать программу рефакторингу для повышения ее производительности или дора- батывать ее так, чтобы она просто казалась программисту или пользователю более красивой.
Не у многих программистов проявляется сразу более двух из пере численных сильных сторон, на самом деле, некоторые из них, как правило, отменяют друг друга. Однако у каждого программиста есть свои сильные стороны. Если вы не узнали себя ни в одном из приведенных описаний, это просто означает, что вы еще недоста- точно себя знаете или ваши сильные стороны просто не вписывают- ся ни в одну из выделенных мной категорий.
Как только вы определите свои сильные стороны, вам нужно бу- дет учесть их в своем мастер-плане. Предположим, вы быстро пи- шете код. Очевидно, что это поможет довести любой проект до за- вершения, однако как вы можете использовать эту сильную сторону систематически? В области формальной разработки программно- го обеспечения существует подход, называемый быстрым прототи-
пированием, в рамках которого программа сначала пишется, минуя этап подробного планирования, а затем улучшается с помощью-
240 Глава 8
последовательных итераций до тех пор, пока результаты не начина- ют удовлетворять требованиям задачи. Если вы быстро пишете код, вы можете попробовать использовать этот метод, приступая к коди- рованию, как только у вас появится основная идея, и руководствуясь в процессе создания дизайна и разработки окончательного кода про- граммы своим черновым прототипом.
Если вы быстро учитесь, возможно, вам следует начинать каж- дый проект с освоения новых ресурсов или методов, способных по- мочь вам в решении текущей задачи. Если вы являетесь программи- стом, который учится не очень быстро, но не расстраивается из-за неудач, возможно, вам следует начать проект с тех областей, кото- рые кажутся вам самыми трудными, чтобы уделить достаточно вре- мени каждой из них.
Таким образом, какими бы ни были ваши сильные стороны, убе- дитесь в том, что вы используете их в процессе своей работы. Со- ставьте свой мастер-план так, чтобы как можно больше времени тра- тилось на то, что вы делаете лучше всего. Так вы получите не только наилучшие результаты, но и удовольствие от своей работы.
Составление мастер-плана
Давайте рассмотрим пример составления мастер-плана. Его состав- ными частями являются все разработанные нами методы решения задач, а также анализ наших сильных и слабых сторон. В этом при- мере я буду использовать свои сильные и слабые стороны.
Что касается методов решения задач, то я использую все мето- ды, которые я описал в этой книге, но особенно мне нравится тех- ника «уменьшения задачи», поскольку ее использование позволяет мне ощутить конкретный прогресс в достижении своей цели. Если я в настоящее время не могу найти способ написания кода, который соответствует всей спецификации, я просто отбрасываю часть этой спецификации, пока не наберу скорость.
Моим самым большим недостатком в кодировании является чрезмерное рвение. Я люблю программировать, потому что мне нра- вится видеть, что компьютеры следуют моим инструкциям. Иногда это заставляет меня думать: «Попробую-ка я сделать это и посмотрю, что произойдет», — когда мне следует анализировать правильность того, что я только что написал. Опасность здесь заключается не в том, что в программе произойдет сбой, а в том, что программа либо покажется успешной, но не охватит все специальные случаи, либо, несмотря на свою эффективность, окажется не лучшим из возмож- ных решений.
Мне нравятся элегантные дизайны программ, которые легко расширять и повторно использовать. Часто, когда я создаю код для крупных проектов, я трачу много времени на разработку альтер- нативных версий дизайна. В целом, это хорошая черта, но иногда это приводит к тому, что я трачу слишком много времени на этапе