Предисловие
Если вы разработчик программного обеспечения и не читали книгу «Программист-прагматик», вы упускаете прекрасную возможность улучшить свои навыки и изменить свой взгляд на программирование. сильный>. Как человек, который все еще читает эту книгу, я могу сказать, что она уже оказала значительное влияние на то, как я думаю о программировании и как подхожу к своей работе.
Авторы этой книги дают ценную информацию и практические советы о том, как стать успешным и эффективным программистом.
В этой статье я приведу конкретные примеры из книги «Прагматичный программист», которые оказали значительное влияние на мою жизнь как разработчика программного обеспечения. Я буду обсуждать важность прагматичного программиста, ценность хорошей организации кода, преимущества тестирования и отладки, а также роль коммуникации в программировании.
Как важно быть прагматичным программистом
Во-первых, прагматичный программист — это специалист по решению проблем, который подходит к задачам программирования с проактивным и ориентированным на решение мышлением.
Обратите внимание на предложение выше, что ваша основная работа не заключается в создании программного обеспечения. Вы решаете проблемы, чтобы агрегировать ценность. Это должно быть вашим мышлением.
Они признают, что решение проблем лежит в основе программирования, и активно ищут новые решения и инструменты для решения сложных задач. В книге приводится пример подхода «Разбитые окна», который подчеркивает важность решения мелких проблем до того, как они превратятся в большие проблемы.
Разбитые окна
Этот подход, упомянутый в «Прагматическом программисте», представляет собой концепцию, первоначально разработанную криминалистами Джеймсом К. Уилсоном и Джорджем Л. Келлингом. Идея, лежащая в основе этого подхода, заключается в том, что видимые признаки беспорядка и пренебрежения, такие как разбитые окна, могут создать среду, в которой более вероятны более серьезные преступления и антиобщественное поведение.
В контексте программирования авторы «Прагматичного программиста» предполагают, что аналогичный подход можно использовать для решения небольших проблем в коде, прежде чем они перерастут в более серьезные проблемы. Оперативно исправляя незначительные проблемы, разработчики могут не допустить, чтобы они стали более значительными и потенциально более сложными для решения.
Применяя подход «Разбитые окна», разработчики могут создать культуру упреждающего решения проблем и предотвратить превращение мелких проблем в более крупные и сложные проблемы.
Ценность хорошей организации кода
Это может быть очевидно, но это всегда важно сказать
Сохранение кода организованным и легким для чтения/понимания имеет решающее значение по нескольким причинам. Во-первых, это упрощает совместную работу разработчиков над проектом. Когда код хорошо организован и прост для понимания, члены команды могут быстро и легко ориентироваться в кодовой базе и понимать, что делает каждый фрагмент кода. Это особенно важно при работе над большими и сложными проектами с участием нескольких членов команды.
Во-вторых, хорошо организованный код легче поддерживать и обновлять с течением времени. Когда код легко читается и понимается, проще вносить изменения и обновления, не создавая новых ошибок или багов. Это связано с тем, что разработчики могут быстро определить назначение каждого фрагмента кода и понять, как он взаимодействует с другими частями программы.
Ортогональность
Авторы «Прагматичного программиста» подчеркивают важность хорошей организации кода и предлагают несколько стратегий для ее достижения. Одним из наиболее важных является принцип «ортогональности», который включает в себя разделение различных задач в коде на отдельные модули или классы. Это помогает уменьшить сложность кода и упростить его понимание и поддержку.
По сути, это был главный принцип, благодаря которому дизайн программного обеспечения стал лучше.
Для этого требуются два ключевых компонента: связанные модули и минимальная связь. Связанные модули — это те, которые содержат связанные функции, в то время как минимальная связанность означает, что модули слабо связаны и могут быть изменены независимо, не затрагивая другие части программы.
Чтобы проиллюстрировать это, давайте рассмотрим простой пример программы на 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; }
В этой программе код, считывающий данные из файла, отделен от кода, считывающего данные из базы данных, и оба они отделены от кода, выполняющего вычисления и генерирующего отчеты. Это означает, что изменения в одной части программы не повлияют на другие части программы. Это делает программу более модульной, простой в обслуживании и более гибкой с течением времени. Таким образом, ортогональная программа обычно лучше, чем неортогональная.
Преимущества тестирования и отладки
В книге подчеркивается важность тестирования и отладки на протяжении всего процесса программирования. Тестирование и отладка имеют решающее значение, потому что они помогают выявлять ошибки и ошибки в коде, гарантируя, что программа работает должным образом.
Авторы рекомендуют ряд различных стратегий тестирования, включая модульное тестирование, интеграционное тестирование и системное тестирование. Они также подчеркивают важность раннего и частого тестирования, а также автоматизации процесса тестирования для снижения вероятности человеческой ошибки.
Отладка также является важной частью процесса программирования. Авторы утверждают, что отладка заключается не только в поиске и исправлении ошибок, но и в понимании первопричины этих ошибок. Они рекомендуют ряд различных стратегий отладки, включая использование отладчиков, ведение журнала и проверку кода.
Разговор со своими сверстниками
Авторы подчеркивают важность обращения за помощью к другим при отладке.
Это связано с тем, что объяснение проблемы другому часто поможет вам лучше понять ее самому. Подробно описывая проблему, вы можете обнаружить скрытые предположения или упущенные детали, которые помогут найти решение.
У меня есть личный опыт, когда эта стратегия доказала свою эффективность. Я два дня работал над особенно сложной ошибкой в своем коде и ничего не добился. Я решил сделать перерыв и подробно объяснить проблему одному из моих коллег. Описывая проблему, я понял, что в моем подходе был фундаментальный недостаток, которого я раньше не замечал. Мой коллега смог предложить несколько предложений, и после еще нескольких итераций отладки и тестирования я смог решить проблему.
Роль коммуникации в программировании
Эффективное общение является важным аспектом программирования и играет важную роль в успехе любого проекта разработки.
В книге подчеркивается важность использования ясного и лаконичного языка, избегания технического жаргона и соблюдения правил ведения документации. Эффективное общение не только помогает гарантировать, что все работают над достижением одних и тех же целей, но также помогает укрепить доверие и способствовать позитивной динамике команды.
Кроме того, объяснение кода другим — важный способ обеспечить его удобочитаемость и удобство сопровождения. Когда мы тратим время на объяснение нашего кода другим, мы вынуждены критически относиться к его структуре и организации, что приводит к более чистому и эффективному коду.
Заключение
В заключение хочу сказать, что «Прагматичный программист» — это книга, которая революционно изменила мое представление о программировании. Это дало мне ценные идеи и стратегии для более эффективного и уверенного подхода к проблемам программирования. Понятия решения проблем, постоянного обучения, ценности простоты и общения, написания ортогонального кода, организации кода и легкости для чтения, эффективной отладки и многих других, которые я не представил здесь , важны для любого человека. разработчик программного обеспечения, который хочет преуспеть в своей области.
Это обязательная книга для любого разработчика, который хочет идти в ногу со временем и поднять свои навыки на новый уровень. Это не только изменило мой подход к программированию, но и сделало меня более увлеченным этим ремеслом. Я считаю, что каждый программист может извлечь пользу из уроков и стратегий, представленных в этой книге.
Итак, я призываю вас прочитать эту книгу сегодня и начать применять ее принципы в своей работе. Я уверен, что вы увидите результаты в своих навыках кодирования и качестве вашей работы.
Если вас это заинтересовало, получите книгу здесь.