Пол Грэм [http://www.paulgraham.com/bio.html] (оригинал — Holding a Program in One's Head) [http://www.paulgraham.com/head.html]
Август 2007
Хороший программист, интенсивно работающий над своей программой, может держать её полностью в памяти так же, как математик держит в уме всю задачу, над которой работает. И они делают ещё бóльшее в уме – они пытаются понять пространство задачи достаточно хорошо, настолько, что могут перемещаться в ней так, как вы мысленно можете ходить по дому, в котором выросли. Самое лучшее программирование – такое же. Вы держите программу в уме и можете манипулировать ею по вашей воле.
Это особенно ценно в начале проекта, когда самое важное – мочь поменять то, что вы делаете. Не просто решить проблему другим путём, а поменять задачу, которую решаете.
Ваш код – это ваше понимание задачи, которую вы исследуете. Поэтому только когда она у вас в голове, вы действительно понимаете задачу.
Поместить программу в уме не так легко. Если вы оставите проект на месяцы, то понадобятся дни, чтобы, вернувшись, по-настоящему понять её снова. Даже когда вы активно работаете над программой, вам может потребоваться полчаса каждый день на то, чтобы загрузить её в ваш мозг. И это в лучшем случае. Обычные программисты в типичных офисных условиях никогда в такой режим не входят. Или, если хотите, обычные программисты в обычных офисных условиях никогда по-настоящему не понимают задач, которые решают.
Даже лучшие программисты не всегда держат в голове всю программу, над которой работают. Но вы можете кое-что сделать:
Поразительно, как часто программисты умудряются случайно выполнить все восемь пунктов. У кого-нибудь есть идея для нового проекта, но поскольку тот официально не разрешён, ему приходится заниматься проектом в свободное время – что в свою очередь означает более продуктивную работу, потому что ничто не отвлекает. Движимый энтузиазмом, он работает по несколько часов подряд. Поскольку изначально это просто эксперимент, вместо «производственного» языка он использует «скриптовый» - который на самом деле намного мощнее. Он полностью переписывает программу несколько раз. Это было бы неоправданно для официального проекта, но это просто работа ради удовольствия, и ему хочется, чтобы она была сделана идеально. И поскольку никто кроме него не видит её, он ничего не комментирует, оставив лишь пометки для самого себя. Он в силу обстоятельств работает в маленькой группе – потому что не сказал никому, либо потому что никому больше не разрешено работать над проектом. Даже если есть группа, большое количество людей не может редактировать один и тот же код, потому что он меняется слишком быстро. И проект начинает с малого, потому что сама идея мала в начале. Ему просто хочется попробовать применить крутой хак.
Ещё более потрясает число официально одобренных проектов, в которых умудряются делать все восемь пунктов неправильно.
На самом деле, если посмотреть на то, как программы пишутся в большинстве организаций, кажется, будто они нарочно стараются сделать всё неправильно. В некотором смысле они так и делают. Одним из определяющих качеств организаций всегда была способность обращаться с людьми как с взаимозаменяемыми частями. Это хорошо работает с задачами, которые можно распараллелить, например на войне. В большинстве случаев мировой истории хорошо тренированная армия профессионалов била армию из солдат самих по себе, неважно насколько героически те сражались. Но мысли вряд ли можно распараллелить, а программы как раз и есть мысли.
Дело не просто в том, что организации не любят даже мысли о том, чтобы зависеть от отдельно взятого гения. Определение организации заключается в том, чтобы этого не было. По крайней мере, в нашей нынешней концепции организации.
Может мы могли бы определить новый тип организации, которая бы соединяла усилия индивидов, не пытаясь сделать их взаимозаменяемыми. Вероятно рынок – такая форма организации, хотя корректнее было бы определить рынок как вырожденный случай – это то, что вы получаете по умолчанию, когда организация невозможна.
Возможно лучшее, что мы можем сделать – это своего рода хак, например, чтобы программистские подразделения в организации работали иначе, чем остальные. Возможно оптимальное решение для больших компаний – не пытаться разрабатывать программы внутри компании вовсе, а просто покупать [http://www.paulgraham.com/hiring.html] их. Но независимо от того, каким будет решение, первый шаг, который нужно сделать – это осознать, что есть проблема. В самой фразе «компания-разработчик ПО» (разговорное «софтовая компания») есть противоречие. «Компания» и «разработчик ПО», как лебедь и щука, тянут в разные стороны. Любой хороший программист в большой организации будет с ней в разногласии, потому что организации сделаны, чтобы предотвращать то, за что борются программисты.
Хорошим программистам удаётся сделать многое в любом случае. Но часто для этого им практически приходится устраивать бунт против организаций, которые их нанимают. Возможно, было бы лучше, если бы люди понимали, что поведением программистов движут требования работы, которую они делают. Вовсе не от безответственности они работают запоем и забывают про все другие обязательства, погружаются прямо в программирование вместо того, чтобы сначала написать спецификации, и переписывают код, который уже работает. Вовсе не из-за недружелюбия они предпочитают работать в одиночку и рычат на человека, который появился в двери, чтобы сказать привет. У всей этой, на первый взгляд случайной, коллекции раздражающих привычек есть простое объяснение: сила держания программы в своей голове.
Неважно, поможет ли крупным организациям понимание этого факта, или не поможет, оно уж точно поможет их конкурентам. Уязвимое место крупных компаний – то, что они не дают отдельным программистам делать отличную работу. Поэтому если вы – маленькая новая компания, именно это место следует атаковать. Беритесь за тот тип задач, которые можно решить в одном большом мозгу.
Пол Грэм, август 2007
Перевод Дмитрия Лебедева (http://ryba4.com [http://ryba4.com] detail@ngs.ru), 20.04.2008