Предисловие

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

Авторы этой книги дают ценную информацию и практические советы о том, как стать успешным и эффективным программистом.

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

Как важно быть прагматичным программистом

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

Обратите внимание на предложение выше, что ваша основная работа не заключается в создании программного обеспечения. Вы решаете проблемы, чтобы агрегировать ценность. Это должно быть вашим мышлением.

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

Разбитые окна

Этот подход, упомянутый в «Прагматическом программисте», представляет собой концепцию, первоначально разработанную криминалистами Джеймсом К. Уилсоном и Джорджем Л. Келлингом. Идея, лежащая в основе этого подхода, заключается в том, что видимые признаки беспорядка и пренебрежения, такие как разбитые окна, могут создать среду, в которой более вероятны более серьезные преступления и антиобщественное поведение.

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

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

Ценность хорошей организации кода

Это может быть очевидно, но это всегда важно сказать

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

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

Ортогональность

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

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

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

Чтобы проиллюстрировать это, давайте рассмотрим простой пример программы на C.

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

#include <stdio.h>

int main() {
  // Read data from file
  FILE *file = fopen("data.txt", "r");
  int num1, num2;
  fscanf(file, "%d %d", &num1, &num2);
  fclose(file);

  // Perform calculations
  int sum = num1 + num2;

  // Generate report
  FILE *report = fopen("report.txt", "w");
  fprintf(report, "The sum of %d and %d is %d\n", num1, num2, sum);
  fclose(report);

  // Read data from database
  int id = 1;
  // ...
  // Perform calculations
  // ...
  // Generate report
  // ...

  return 0;
}

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

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

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

#include <stdio.h>

int read_data_from_file() {
  FILE *file = fopen("data.txt", "r");
  int num1, num2;
  fscanf(file, "%d %d", &num1, &num2);
  fclose(file);
  return num1 + num2;
}

int read_data_from_database() {
  int id = 1;
  // ...
  return /* some data */;
}

int calculate(int data) {
  // Perform calculations
  return data * 2;
}

void generate_report(int data) {
  FILE *report = fopen("report.txt", "w");
  fprintf(report, "The data is %d\n", data);
  fclose(report);
}

int main() {
  int file_data = read_data_from_file();
  int database_data = read_data_from_database();
  int calculated_data = calculate(file_data + database_data);
  generate_report(calculated_data);
  return 0;
}

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

Преимущества тестирования и отладки

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

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

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

Разговор со своими сверстниками

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

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

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

Роль коммуникации в программировании

Эффективное общение является важным аспектом программирования и играет важную роль в успехе любого проекта разработки.

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

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

Заключение

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

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

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

Если вас это заинтересовало, получите книгу здесь.

Другие статьи

  1. Мигать светодиодом на ардуино без IDE — встроенные туториалы 1
  2. Почему Linux имеет решающее значение для разработки встраиваемого программного обеспечения