# Как быть программистом: Community Version

Robert L. Read with Community

Copyright 2002, 2003, 2016 Robert L. Read

Выпущено под лицензией [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).

## Введение

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

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

Программирование преподается на курсах. Великолепные книги The Pragmatic Programmer \[Prag99], Code Complete \[CodeC93], Rapid Development \[RDev96] и Extreme Programming Explained \[XP99]: все обучают программированию и более общим вопросам о том, как быть хорошим программистом. До или вместе с данной статьей непременно стоит ознакомиться также с эссе Пола Грехэма \[PGSite] и Эрика Рэймонда \[Hacker]. Данное эссе слегка отличается от этих великолепных работ тем, что акцентирует внимание на социальных проблемах и обобщает набор навыков, необходимых программисту, с моей личной точки зрения.

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

Добро пожаловать в клан.

## Содержание

1. [Начинающий программист](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner)
   * Личные навыки
     * [Научитесь отлаживать](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/01-learn-to-debug)
     * [Как отлаживать, разделяя пространство проблемы](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/02-how-to-debug-by-splitting-the-problem-space)
     * [Как устранять баги](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/03-how-to-remove-an-error)
     * [Как отлаживать, используя логи](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/04-how-to-debug-using-a-log)
     * [Как определять проблемы производительности](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/05-how-to-understand-performance-problems)
     * [Как устранять проблемы производительности](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/06-how-to-fix-performance-problems)
     * [Как оптимизировать циклы](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/07-how-to-optimize-loops)
     * [Как справиться с расходами на операции чтения и записи](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/08-how-to-deal-with-io-expense)
     * [Как управлять памятью](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/09-how-to-manage-memory)
     * [Как устранять плавающие баги](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/10-how-to-deal-with-intermittent-bugs)
     * [Как научиться проектировать программы](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/11-how-to-learn-design-skills)
     * [Как экспериментировать](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/personal-skills/12-how-to-conduct-experiments)
   * Командные навыки
     * [Почему важно оценивать задачи](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/team-skills/01-why-estimation-is-important)
     * [Как оценивать время на разработку](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/team-skills/02-how-to-estimate-programming-time)
     * [Как искать информацию](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/team-skills/03-how-to-find-out-information)
     * [Как спрашивать людей](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/team-skills/04-how-to-utilize-people-as-information-sources)
     * [Как документировать правильно](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/team-skills/05-how-to-document-wisely)
     * [Как работать с плохим кодом](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/team-skills/06-how-to-work-with-poor-code)
     * [Как использовать системы контроля версий](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/team-skills/07-how-to-use-source-code-control)
     * [Как писать юнит-тесты](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/team-skills/08-how-to-unit-test)
     * [Делайте перерывы, когда вы в тупике](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/team-skills/09-take-breaks-when-stumped)
     * [Как понять, когда идти домой](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/team-skills/10-how-to-recognize-when-to-go-home)
     * [Как вести себя с трудными людьми](https://braydie.gitbook.io/how-to-be-a-programmer/ru/1-beginner/team-skills/11-how-to-deal-with-difficult-people)
2. [Программист среднего уровня](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate)
   * Личные навыки
     * [Как сохранять мотивацию](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/personal-skills/01-how-to-stay-motivated)
     * [Как заслужить доверие](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/personal-skills/02-how-to-be-widely-trusted)
     * [Как балансировать процессорное время и память](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/personal-skills/03-how-to-tradeoff-time-vs-space)
     * [Как проводить стресс-тестирование](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/personal-skills/04-how-to-stress-test)
     * [Как балансировать краткость и абстракцию](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/personal-skills/05-how-to-balance-brevity-and-abstraction)
     * [Как осваивать новые навыки](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/personal-skills/06-how-to-learn-new-skills)
     * [Научитесь печатать вслепую](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/personal-skills/07-learn-to-type)
     * [Как проводить интеграционное тестирование](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/personal-skills/08-how-to-do-integration-testing)
     * [Языки взаимодействия систем](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/personal-skills/09-communication-languages)
     * [Стандартные технологии](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/personal-skills/10-heavy-tools)
     * [Как анализировать данные](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/personal-skills/11-how-to-analyze-data)
   * Командные навыки
     * [Как управлять временем разработки](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/team-skills/01-how-to-manage-development-time)
     * [Как управлять рисками, связанными со сторонним программным обеспечением](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/team-skills/02-how-to-manage-third-party-software-risks)
     * [Как руководить консультантами](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/team-skills/03-how-to-manage-consultants)
     * [Как соизмерять количество общения](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/team-skills/04-how-to-communicate-the-right-amount)
     * [Как честно выражать несогласие](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/team-skills/05-how-to-disagree-honestly-and-get-away-with-it)
   * Экспертиза
     * [Как балансировать качество и время разработки](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/judgment/01-how-to-tradeoff-quality-against-development-time)
     * [Как управлять зависимостями](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/judgment/02-how-to-manage-software-system-dependence)
     * [Как оценивать стороннее программное обеспечение](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/judgment/03-how-to-decide-if-software-is-too-immature)
     * [Как решить: покупать программу или писать свою](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/judgment/04-how-to-make-a-buy-vs-build-decision)
     * [Как расти профессионально](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/judgment/05-how-to-grow-professionally)
     * [Как проводить собеседования](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/judgment/06-how-to-evaluate-interviewees)
     * [Как понять, когда применять высокие технологии](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/judgment/07-how-to-know-when-to-apply-fancy-computer-science)
     * [Как разговаривать с неинженерами](https://braydie.gitbook.io/how-to-be-a-programmer/ru/2-intermediate/judgment/08-how-to-talk-to-non-engineers)
3. [Продвинутый программист](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced)
   * Техническая экспертиза
     * [Как отличить сложное от невозможного](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/technical-judgment/01-how-to-tell-the-hard-from-the-impossible)
     * [Как использовать встроенные языки](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/technical-judgment/02-how-to-utilize-embedded-languages)
     * [Выбор языка программирования](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/technical-judgment/03-choosing-languages)
   * Правильные компромиссы
     * [Как справляться с давлением графика](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/compromising-wisely/01-how-to-fight-schedule-pressure)
     * [Как понять пользователя](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/compromising-wisely/02-how-to-understand-the-user)
     * [Как получить повышение](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/compromising-wisely/03-how-to-get-a-promotion)
   * Управление командой
     * [Как развивать таланты](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/serving-your-team/01-how-to-develop-talent)
     * [Как выбрать, над чем работать](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/serving-your-team/02-how-to-choose-what-to-work-on)
     * [Как получить наибольшую отдачу от коллег](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/serving-your-team/03-how-to-get-the-most-from-your-teammates)
     * [Как разделять задачи](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/serving-your-team/04-how-to-divide-problems-up)
     * [Как распределять скучные задания](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/serving-your-team/05-how-to-handle-boring-tasks)
     * [Как получить поддержку для проекта](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/serving-your-team/06-how-to-gather-support-for-a-project)
     * [Как развивать систему](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/serving-your-team/07-how-to-grow-a-system)
     * [Как качественно взаимодействовать](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/serving-your-team/08-how-to-communicate-well)
     * [Как сообщать неприятное](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/serving-your-team/09-how-to-tell-people-things-they-dont-want-to-hear)
     * [Как справляться с менеджерскими мифами](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/serving-your-team/10-how-to-deal-with-managerial-myths)
     * [Как справляться с организационным хаосом](https://braydie.gitbook.io/how-to-be-a-programmer/ru/3-advanced/serving-your-team/11-how-to-deal-with-organizational-chaos)
4. [Глоссарий](https://braydie.gitbook.io/how-to-be-a-programmer/ru/glossary)
5. [Приложение A - Библиография/Список сайтов](https://braydie.gitbook.io/how-to-be-a-programmer/ru/5-bibliography)
6. [Приложение B - История (на январь 2016)](https://braydie.gitbook.io/how-to-be-a-programmer/ru/6-history)
7. [Приложение C - Участие в проекте (на январь 2016)](https://braydie.gitbook.io/how-to-be-a-programmer/ru/7-contributions)

[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/)\
How To Be A Programmer: Community Version by Robert L. Read with Community is licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).
