Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
ДжоэлСпольси
Êàòåãîðèÿ: ìåòîäîëîãèÿ
Профессиональная Мифический
Óðîâåíü ïîäãîòîâêè ÷èòàòåëåé: ñðåäíèé
разработка программ- человеко-месяц
ного обеспечения
ISBN-13 978-5-93286-144-8
www.symbol.ru
Издательство «Символ-Плюс»
(812) 324-5353, (495) 945-8100 9 785932 861448
Joel Spolsky
Джоэл: и снова
о программировании
Новые мысли о разнообразных и иногда
родственных вопросах, которые должны быть
интересны разработчикам программного
обеспечения, проектировщикам и менеджерам,
а также тем, кому посчастливилось или не повезло
в какомто качестве работать с ними
Джоэл Спольски
СанктПетербург –Москва
2009
Серия «Профессионально»
Джоэл Спольски
Джоэл: и снова о программировании
Новые мысли о разнообразных и иногда родственных вопросах,
которые должны быть интересны разработчикам программного обеспечения,
проектировщикам и менеджерам, а также тем, кому посчастливилось
или не повезло в какомто качестве работать с ними
Перевод С. Маккавеева
Главный редактор А. Галунов
Зав. редакцией Н. Макарова
Выпускающий редактор П. Щеголев
Редактор Т. Темкина
Корректор C. Минин
Верстка Д. Орлова
Спольски Дж.
Джоэл: и снова о программировании. Новые мысли о разнообразных и иногда род#
ственных вопросах, которые должны быть интересны разработчикам программ#
ного обеспечения, проектировщикам и менеджерам, а также тем, кому посчаст#
ливилось или не повезло в каком#то качестве работать с ними. – Пер. с англ. –
СПб.: Символ#Плюс, 2009. – 320 с., ил.
ISBN 978#5#93286#144#8
Продолжение вышедшего в 2006 году бестселлера «Джоэл о программировании»
представляет собой подборку самых популярных статей, опубликованных автором
на его сайте http://www.joelonsoftware.com. Исключительный писательский та#
лант, техническая эрудиция и язвительный ум Джоэла создали ему высочайшую
профессиональную репутацию и принесли его сайту скандальную известность.
В книге затронуты разнообразные вопросы, касающиеся разработки и проектиро#
вания программного обеспечения, управления софтверным бизнесом, эффектив#
ного поиска и привлечения высококлассных сотрудников, организации рабочего
места и общения с заказчиками. Автор предлагает практические советы как про#
граммистам, так и тем, кто руководит их работой.
ISBN 9785932861448
ISBN 9781430209874 (англ)
© Издательство Символ#Плюс, 2009
Authorized translation of the English edition © 2008 Apress, Inc. This translation is publish#
ed and sold by permission of Apress Inc., the owner of all rights to publish and sell the same.
Все права на данное издание защищены Законодательством РФ, включая право на полное или час#
тичное воспроизведение в любой форме. Все товарные знаки или зарегистрированные товарные
знаки, упоминаемые в настоящем издании, являются собственностью соответствующих фирм.
Издательство «Символ#Плюс». 199034, Санкт#Петербург, 16 линия, 7,
тел. (812) 324#5353, www.symbol.ru. Лицензия ЛП N 000054 от 25.12.98.
Налоговая льгота – общероссийский классификатор продукции
ОК 005#93, том 2; 953000 – книги и брошюры.
Подписано в печать 25.12.2009. Формат 70х901/16 . Печать офсетная.
Объем 20 печ. л. Тираж 1500 экз. Заказ №
Отпечатано с готовых диапозитивов в ГУП «Типография «Наука»
199034, Санкт#Петербург, 9 линия, 12.
Джареду
О
Оглавление
Об авторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Джоэл, APRESS, блоги и блуки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1
Джоэл Спольски «Джоэл о программировании». – Пер. с англ. – СПб.: Символ&
Плюс, 2006.
2
Джоэл Спольски «Лучшие примеры разработки ПО». – Пер. с англ. – СПб.: Питер,
2006.
Д
Джоэл, APRESS,
блоги и блуки
1
Блук (англ. blook, от blog – блог, сетевой журнал, или дневник, и book – книга) –
книга на основе материалов блога. – Прим. перев.
Джоэл, APRESS, блоги и блуки 13
Гэри Корнелл,
соучредитель Apress
1
Имеется в виду обложка оригинального английского издания – Прим. перев.
ЧАСТЬ ПЕРВАЯ
ЧАСТЬ I
Как управлять
людьми
ГЛ А В А ПЕ РВ АЯ
М
ГЛА В А 1
Мое первое
«рецензирование БиллГ»
К
ГЛ А ВА 2
На гору, Дживз!
одумайте, где можно встретить людей, которых вы хотите принять на
П работу. В каких конференциях они участвуют? Где они живут? В какие
организации входят? На каких веб&сайтах бывают? Не закидывайте боль&
шую сеть на Monster.com, лучше на сайте «Joel on Software» зайдите на фо&
рум, посвященный работе, ограничив поиски теми умными людьми, кото&
рые читают мой сайт. Посетите действительно интересные технические
конференции. Выдающихся разработчиков для Маков вы найдете у Apple
на WWDC. Выдающиеся программисты для Windows будут у Microsoft на
PDC. Есть несколько хороших конференций open source.
Посмотрите, какие новые технологии сегодня в моде. В прошлом году
это был Python, в этом – Ruby. Побывайте на соответствующих конфе&
26 ГЛАВА 2
Производственная практика
ороший способ перехватить выдающегося работника, которого нель&
Х зя найти на рынке труда, это найти его тогда, когда он еще и не подоз&
ревает о существовании такого рынка, – пока он еще учится.
Некоторые менеджеры против того, чтобы брать практикантов. Они
считают, что те еще не сформировались и недостаточно квалифицирован&
ны. В известном смысле, это правда. У практикантов нет опыта, как у штат&
ных работников (откуда ж ему у них взяться!). Они требуют больше внима&
ния и только некоторое время спустя достигнут требуемого уровня. Прав&
да, приятная особенность нашей профессии состоит в том, что многие
выдающиеся программисты начинают писать программы в 10&летнем воз&
расте. И пока все их сверстники играют в футбол (это такая игра для тех,
Как искать выдающихся разработчиков 27
К
ГЛ А ВА 3
Личные кабинеты
прошлом году я был в Йеле на конференции по вычислительным нау&
В кам. Один из выступавших, ветеран Силиконовой долины, бывший ос&
нователем или руководителем солидного списка стартапов с венчурным
капиталом, показал присутствующим книгу «Peopleware» («Человеческий
фактор») Тома Демарко (Tom DeMarco) и Тимоти Листера (Timothy Lister),
Dorset House, 1999.
«Вам знакома эта книга, – сказал он. – Это библия управления софтвер&
ной компанией. Это самая важная из всех существующих книг об управле&
нии софтверными компаниями».
Я согласен, «Peopleware» – выдающаяся книга. Одна из наиболее важ&
ных и спорных тем этой книги – утверждение о том, что высокую продук&
тивность программистов можно получить, только обеспечив им достаточ&
Классификатор мест работы для программистов 35
Игрушки
а же логика применима и к другим игрушкам, которыми пользуются
Т разработчики. Нет никаких причин не купить для них лучшие модели
компьютеров, хотя бы пару больших (21 дюйм) ЖК&дисплеев (или один
30&дюймовый), и предоставить свободу заказывать на Amazon.com любую
нужную им техническую литературу. Очевидно, что это повышает их про&
дуктивность. Но сейчас, когда мы обсуждаем, как набирать работников,
важнее как раз то, что такие вещи производят впечатление на кандидатов,
особенно в условиях, когда большинство компаний относится к програм&
мистам как к расходному материалу или как к машинисткам – «Ну зачем
им большой монитор, и чем плоха 15&дюймовая трубка? Вот когда я был
молодым…» и т. д.
1
У этого слова много сленговых значений, в том числе «наглец», «негодяй» и «при&
дурок». – Прим. перев.
40 ГЛАВА 3
Независимость и самостоятельность
Когда в 1999 году я уходил из Juno, – перед тем, как создать Fog Creek
Software, – в отделе кадров провели со мной стандартное собеседование
в связи с увольнением, и тогда я поддался соблазну расказать кадровику об
ошибках руководства компании – не сомневаясь, что это лишь повредит
мне, я, тем не менее, высказал все, упирая на свойственный Juno стиль
«молниеносного» управления. Обычно менеджеры не мешали людям спо&
койно делать свое дело, но временами они вдруг влезали в самые мелкие
детали, требуя сделать что&то в точности так, как они хотят, а потом, не до&
жидаясь нелепых результатов выполнения своих указаний, перескакивали
к следующей задаче микроуправления. Помню, например, особо досадный
эпизод, когда в течение двух&трех дней все, от непосредственного началь&
ника до главы компании, указывали мне, как должны вводиться даты в фор&
ме для регистрации на сайте компании. Они не были специалистами по
пользовательскому интерфейсу, но и не стремились обсудить со мной
проблему, чтобы понять, почему в данном случае прав я, и все было беспо&
лезно: руководство не отступалось от проблемы, не внимая при этом моим
доводам.
В принципе, собираясь нанимать толковых работников, вы должны
быть готовы дать им возможность проявить свое мастерство в работе. Ме&
неджеры могут давать советы, что приветствуется, но они должны тща&
тельно следить за тем, чтобы их «советы» не воспринимались как приказы,
потому что в любом техническом вопросе руководство, как правило, раз&
бирается хуже, чем рядовые сотрудники, особенно если, как я сказал, вы
наняли толковых людей.
Разработчики хотят наниматься в качестве профессионалов, чтобы,
признавая их мастерство, им позволяли принимать решения в той облас&
ти, где они являются специалистами.
Классификатор мест работы для программистов 41
Никакой политики
Фактически, политика появляется всюду, где собирается вместе больше
двух человек. Это естественно. Говоря «никакой политики», я имею в виду
«никакой нездоровой политики». У программистов очень острое чувство
справедливости. Код либо работает, либо нет. Нет смысла спорить, есть
ошибка или нет, поскольку это определяется путем тестирования кода.
Мир программирования очень справедлив и строго упорядочен, и многие
приходят в программирование в первую очередь потому, что хотят пре&
бывать в справедливой и добропорядочной среде, где ценятся заслуги,
а в споре побеждает тот, кто действительно прав.
И такую среду вы должны создать, если хотите заполучить программи&
стов. Когда программист жалуется на «политику», совершенно ясно, что он
имеет в виду ситуацию, в которой личные предпочтения доминируют над
технической целесообразностью. Ничто так не возмущает разработчика,
как указание использовать определенный язык программирования (не са&
мый подходящий для решаемой задачи) только потому, что этот язык нра&
вится начальнику. Ничто так не бесит, как карьерное продвижение благо&
даря умелым интригам, а не личным достоинствам. Ничто так не удручает
программиста, как необходимость реализовать технически слабое реше&
ние, на котором настаивает кто&то вышестоящий или обладающий личны&
ми связями с руководством.
Ничто не приносит такого удовлетворения, как победа в споре благода&
ря техническим аргументам, особенно если политическая обстановка уг&
рожала поражением. Когда я начал работать в Microsoft, основной разра&
боткой там был неудачный проект под названием MacroMan, посвящен&
ный созданию графического языка макропрограммирования. Этот язык
стал бы сплошным разочарованием для профессиональных программи&
стов, потому что его графическая природа не позволяла создавать циклы
и условные операторы, да и непрограммистам он бы не очень помог, пото&
му что они, по моему мнению, не привыкли мыслить алгоритмически и во&
обще ничего не поймут в MacroMan. Когда я поведал об этом своему на&
чальнику, он сказал мне: «Этот паровоз тебе не остановить. И не пытайся».
Но я продолжал доказывать, и доказывать, и доказывать – а ведь я был вче&
рашний студент, и едва ли у кого&то в Microsoft было меньше личных свя&
зей, чем у меня тогда, – в конечном итоге к моим аргументам прислуша&
лись, и проект MacroMan был закрыт. Неважно, кем я был, – важно, что
я был прав. Такая неполитическая обстановка очень радует программистов.
42 ГЛАВА 3
Т
ГЛ А ВА 4
К
ГЛ А ВА 5
Командно&административный
метод управления
Фридрих Великий
М
ГЛ А В А 6
Метод управления
«Экономика 101»
(Ну и ладно)
Название «Экономика 101» я взял для иронии. Дело в том, что на боль&
шинстве факультетов американских колледжей есть курс с номером 101,
представляющий собой введение в какую&либо дисциплину. Управление
в стиле «Экономика 101» практикуют те, кто достаточно наслышан об эко&
номике, чтобы представлять собой угрозу обществу.
Менеджер стиля «Экономика 101» считает, что мотивацией любого че&
ловека служат деньги и что заставлять людей делать то, что нужно, лучше
всего с помощью денежных вознаграждений и вычетов.
Например, AOL может доплачивать служащим своего центра обработки
вызовов за каждого клиента, которого те уговорят не прекращать свою
подписку.
Софтверная фирма может выплачивать премии программистам, у ко&
торых обнаруживается меньше всего ошибок.
Это примерно столь же успешный метод, как выдача курам денег, чтобы
они питались самостоятельно.
При этом происходит замена внутренней мотивации внешней, что вле&
чет серьезные проблемы.
Внутренняя мотивация – это ваше естественное стремление работать
хорошо. Обычно поначалу у человека есть сильная внутренняя мотивация.
Он хочет делать свое дело хорошо. Он хочет помочь другим убедиться
в том, что продолжать платить AOL 24 доллара в месяц – в их собственных
интересах. Он хочет писать код, в котором мало ошибок.
Внешняя мотивация приходит снаружи, например, когда вам платят за
что&то особенное.
Внутренняя мотивация гораздо сильнее внешней. Люди гораздо усерд&
нее занимаются тем, что им действительно нравится. Тут и спорить не
о чем.
Но когда вы предлагаете людям деньги за то, что они и так хотят делать,
возникает нечто под названием «эффекта сверхоправдания». «Я должен
писать код без ошибок, потому что хочу получать за это деньги», – думает
программист, и внешняя мотивация вытесняет в нем внутреннюю. По&
скольку внешняя мотивация гораздо менее продуктивна, в итоге вы доби&
ваетесь фактического ослабления желания хорошо выполнять работу. Ес&
ли вы прекратите выплачивать премию, или программист решит, что день&
ги его не очень интересуют, он перестанет следить за тем, чтобы в коде не
было ошибок.
54 ГЛАВА 6
М
ГЛ А В А 7
Метод управления
«Отождествление»
продажи возрастут и без FogBugz 6.0, то, помня основные финансовые со&
ображения, Бретт решит, что можно отложить выпуск версии 6.0, пока
в нее не будут включены дополнительные функции. Смысл в том, что, по&
делившись с Бреттом информацией, я даю ему возможность принять пра&
вильное для Fog Creek решение, даже если изменятся обстоятельства. Если
бы я попытался надавить на него, предложив денежную премию за каждый
день сокращения сроков поставки по сравнению с апрелем, у него появи&
лось бы желание продавать неотлаженную версию, имеющуюся на данный
момент. Если бы я в командно&административном стиле потребовал, что&
бы он, черт возьми, выпустил в установленный мной срок отлаженную
версию, – возможно, он и сделал бы это, но возненавидел бы свою работу
и уволился.
Заключение
колько менеджеров – столько и стилей управления. Я определил три
С основных метода: два простых и недейственных и один сложный, дей&
ственный, но на самом деле во многих программистских организациях
управление осуществляется, скорее, специфическими, «показавшими дей&
ственность» методами, которые в разное время и у разных людей могут
быть разными.
ЧАСТЬ ВТОРАЯ
ЧАСТЬ II
Советы будущим
программистам
ГЛ АВ А В О С Ь М А Я
О
ГЛ А В А 8
Опасности
обучения на Java
Ленивые детки.
Почему никто не хочет трудиться?
Верный признак начала старения: я начинаю ворчать и жаловаться, что
«молодежь теперь не та» и что она не хочет или не может работать с пол&
ной отдачей.
Когда я был молодым, я учился программировать на перфокартах. Раз
ошибешься – и карта испорчена, начинай все заново. У нас не было этих
современных штучек, вроде клавиши Backspace, чтобы исправить ошибку.
С 1991 года на собеседованиях с программистами я обычно позволяю
им выбрать для решения моих задачек любой язык программирования, ко&
торый понравится. Тогда они в 99% случаев выбирали C.
Теперь они предпочитают писать на Java.
Поймите меня правильно: я вовсе не против использования Java в каче&
стве языка реализации.
Пожалуй, стоит пояснить предыдущее высказывание. В контексте на
стоящего обсуждения я не собираюсь доказывать, что Java как язык реали&
зации обладает недостатками. Эти недостатки многочисленны, но мы по&
говорим о них как&нибудь в другой раз.
Сейчас я имею в виду вот что: Java в целом недостаточно сложный язык
программирования, чтобы позволить отличить замечательного програм&
64 ГЛАВА 8
миста от рядового. Этот язык может прекрасно подойти для каких&то ра&
бот, но речь сейчас не о том. Я бы даже сказал, что недостаточная слож&
ность Java – это «фича, а не баг», тем не менее с этим языком связана отме&
ченная мной проблема.
Это дерзкое утверждение – результат моего наблюдения: две традици&
онные темы университетского курса программирования – указатели и ре&
курсия – многим учащимся оказываются не по зубам.
Раньше в колледже сначала читался курс по структурам данных – свя&
занным спискам, хеш&таблицам и прочим типам, широко задействующим
указатели. Такие курсы часто использовались для отсева: они были на&
столько сложны, что тот, кто с ними не справлялся, не мог рассчитывать на
получение диплома по вычислительной науке, ибо если для вас слишком
сложны указатели, то вряд ли вы одолеете теорию неподвижной точки!
Многие ребята из тех, кто в старших классах успешно писал для своего
Apple II программы на BASIC, гоняющие по экрану мячик, записывались на
курс «CompSci 101» (структуры данных), но когда дело доходило до указате&
лей, их мозг перегревался, и вскоре они находили себе новую специаль&
ность вроде политологии, понимая, что юридический факультет – более
удачный выбор. Я изучал статистику отсева среди студентов&кибернетиков –
обычно это 40–70%. В университетах это считают потерями, но мне кажет&
ся, что отсеивать тех, кому программирование не доставит ни радости, ни
успеха, просто необходимо.
Другим трудным начальным курсом для студентов&кибернетиков ока&
зывался курс функционального программирования, в том числе рекурсив&
ного. Очень высокий уровень этих курсов был установлен в MIT1, где имел&
ся обязательный курс (6.001) и учебник «Structure and Interpretation of
Computer Programs»2 (Abelson, Sussman) [The MIT Press, 1996]) – десятки, ес&
ли не сотни лучших факультетов вычислительной техники использовали
их как стандартное введение в специальность. (Вы можете – и должны –
посмотреть старые варианты этих лекций в Сети.)
Сложность такого курса впечатляет. На первой же лекции вы узнаете
достаточно много о Scheme и тут же изучаете функцию с неподвижной
точкой, которая принимает на входе другую функцию. Посещая подобный
курс CSE 121 в Пенне, я видел, что многим, если не большинству моих од&
1
MIT – Massachusetts Institute of Technology (Массачусетский технологический ин&
ститут). – Прим. перев.
2
«Структура и интерпретация компьютерных программ».
Опасности обучения на Java 65
справились бы с 6.001 в MIT или CS 323 в Йеле и, честно говоря, это одна из
причин, по которым для меня как работодателя диплом CS из MIT или Йеля
«весит» больше, чем диплом CS из Дьюка, где недавно полностью перешли
на Java, или из Пенна, где Scheme и ML заменили на Java в том курсе, кото&
рый когда&то чуть не доконал меня с друзьями, – CSE 121. Это не значит,
что я не возьму к себе толковых ребят из Дьюка или Пенна, – возьму, но
просто мне будет гораздо труднее оценить их реальные способности.
Раньше я определял способных ребят по тому, как они за считанные секун&
ды разбирались в рекурсивном алгоритме или, не задумываясь, писали
функцию обработки связанных списков на основе указателей. Но столк&
нувшись с выпускником Java&колледжа, я не могу понять, чем вызваны его
затруднения, – недостатком образования или отсутствием того участка
мозга, который необходим для решения сложных задач программирова&
ния. Пол Грэм (Paul Graham, www.paulgraham.com/avg.html) называет их
«дутыми программистами» (blub programmers).
Жаль, что Java&колледжи не отсеивают тех, из кого никогда не получит&
ся отличный программист, – хотя подобные заведения и оправдываются
тем, что это не их проблема. Производство или, во всяком случае, кадрови&
ки, работающие методом «grep», в открытую требуют, чтобы студентов
обучали Java.
Кроме того, Java&колледжи не развивают мозг своих студентов, и в ре&
зультате им не достает ловкости, живости и гибкости ума, требующихся
для того, чтобы хорошо проектировать программное обеспечение (я не
имею в виду объектно&ориентированное «проектирование», в котором уй&
ма времени уходит на бесконечное перетряхивание иерархии объектов
или мучения по поводу надуманных проблем типа «как правильно – hasa
или isa?»). Нужно учиться мыслить одновременно на нескольких уровнях
абстракции, и это именно тот тип мышления, который требуется для про&
ектирования выдающихся программных архитектур.
Может ли изучение объектно&ориентированного программирования
(ООП) стать адекватной заменой указателям и рекурсии в смысле отсева?
Если ответить коротко, то нет. Не касаясь достоинств ООП, просто скажу –
оно не настолько сложно, чтобы отсеивать посредственных программи&
стов. Обучение ООП заключается, в основном, в заучивании ряда терми&
нов вроде «инкапсуляции» или «наследования» и тестов с вариантами отве&
тов, где нужно правильно выбрать между полиморфизмом и перегрузкой.
Не труднее, чем запомнить несколько дат и имен в курсе истории. Пробле&
ма в ООП – это когда ваша программа работает, но ее трудно сопровож&
68 ГЛАВА 8
Л
ГЛ А В А 9
Лекция в Йеле
по вычислительной науке не для меня, так что этот курс оказался самым
полезным из всех, на какие я когда&либо записывался.
Это привело меня к одному важному рабочему наблюдению. Бывает,
что программист переопределяет задачу, так что она становится доступ&
ной для алгоритмического решения. Переопределив задачу, он часто полу&
чает нечто доступное для решения, но, по сути, тривиальное. Он не решает
реальную задачу, потому что та неразрешима. Приведу пример.
Часто говорят о своего рода кризисе качества разработки программно&
го обеспечения. Я не вполне согласен с такими заявлениями: компьютер&
ные программы, используемые большинством людей, обладают на ред&
кость высоким качеством в сравнении со всем прочим, что их окружает, но
речь сейчас не о том. Тезис о «кризисе качества» порождает массу предло&
жений и исследований по улучшению качества программного обеспече&
ния. С этой точки зрения людей можно разделить на две категории – «ги&
ки» и «пиджаки» (geeks and suits).
Гики хотят решать проблему автоматически, с помощью программ.
Они предлагают различные способы «доказательства», что в программе
нет ошибок, – модульное тестирование, управляемая тестированием раз&
работка, автоматическое тестирование, динамическая логика и так далее.
Пиджаки не вполне понимают, в чем проблема. Их совершенно не вол&
нует, что в программе есть ошибки, коль скоро люди ее покупают.
В данный момент в борьбе между гиками и пиджаками побеждают по&
следние, поскольку они управляют бюджетами и, честно говоря, я не вижу
в этом ничего ужасного. Пиджаки знают, что устранение ошибок подчиня&
ется закону уменьшающейся прибыли. Если программе обеспечен опреде&
ленный уровень качества, благодаря чему некоторые пользователи смогут
решать свои задачи, значит, они купят эту программу и будут получать с ее
помощью прибыль.
Кроме того, пиджаки шире рассматривают понятие «качество». У них
абсолютно корыстный подход: качество программы определяется тем, на&
сколько она может повысить их премию по результатам года. Кстати, тут
учитывается не только отсутствие ошибок в программе. Например, очень
ценится включение в программу новых функций для решения новых задач
новыми пользователями, что позволяет гикам презрительно называть про&
граммы «распухшими от функций» (bloatware). Учитывается и эстетиче&
ская сторона: красивая программа продается лучше, чем безобразная. Учи&
тывается степень удовлетворенности пользователя. В принципе, такой
74 ГЛАВА 9
1
GUI (Graphical User Interface) – графический интерфейс пользователя. – Прим.
перев.
Лекция в Йеле 77