понедельник, 9 января 2012 г.

Coders at Work

Coders at Work — коллекция интервью с разными компьютерными отцами, местами довольно интересная.

Jamie Zawinski, разработчик Netscape Navigator, вспоминает о кошмаре отладки на системе с упреждающим выполнением команд:
I’d gotten to the point where it’s running the executable and it’s trying to bootstrap Lisp and it gets 500 instructions in and crashes. So there I am leaning on the S key, stepping through trying to figure out where it crashes. And it seems to be crashing at a different place each time. And it doesn’t make any sense. I’m reading the assembly output of this architecture I only barely understand. Finally I realize, “Oh my god, it’s doing something different when I step; maybe it’s timing-based.” Eventually I figure out that what’s going on is this is one of the early machines that did speculative execution. It would execute both sides of the branch. And GDB would always take the branch if you single-stepped past a branch instruction. There was a bug in GDB!
Я докопался до места, где оно исполняет программу и бутстрапит Лисп и после выполнения 500 инструкций падает. Начинаю долбить клавишу S шаг за шагом, пытаясь вычислить, где оно падает. И так получается, что оно падает в новом месте каждый раз. И совершенно непонятным образом. Читаю ассемблерный код для этой архитектуры, в котором я едва разбираюсь. Это приводит к догадке «Боже мой, во время прохода по шагам оно работает иначе; может баг зависит от времени». В конце концов я понимаю, что это одна из тех ранних машин, на котором выполнение команд было упреждающим. При ветвлении исполнялись обе ветки; а GDB, при пошаговом выполнении, шёл только по одной. Это был баг в GDB!

Brad Fitzpatrick, создатель Livejournal, делится впечатлениями о современных IDE:
My coworkers try to tell me—if they see me doing something in Emacs—that Eclipse or IntelliJ does it for them automatically. So every six months I try out one of them, Eclipse or IntelliJ. And the damn thing just sits there spinning forever, consuming memory and maybe crashes in the middle of me typing or can’t keep up with me typing. Come on—syntax-highlight in the background or compile in a different thread. Why are you blocking my typing to do this? OK, I’ll try it again in six months, guys. So I’m glad I’m not forced to use that.
Мои коллеги, когда видят, как я делаю что-то в Emacs, спешат сообщить мне, что в Eclipse и IntelliJ всё это делается автоматически. Каждые полгода я пробую то или другое. И эта хрень только и делает, что без конца шуршит чем-то, расходуя память, и легко может упасть во время набора, или не может угнаться за мной. Неужели так сложно осуществлять подсветку в фоновом режиме и компилировать в отдельном треде. Какой смысл мешать мне печатать? Ладно, чуваки, приходите ещё через полгода. Как я рад, что всё это не является обязаловкой.

Douglas Crockford, создатель ECMAScript 3.1, критически оценивает прогресс ПО:
Progress isn’t always forward. Sometimes we’re leaping forward and sometimes we’re leaping backwards. When we leaped to the PC, we lost a whole lot of stuff. In the timesharing era, we had social systems online. A timesharing system was a marketplace. It was a community and everybody who was a part of that system could exchange email, they could exchange files, they could chat, they could play games. They were doing all this stuff and all that got lost when we went to PCs. It took another 20 years or so to get that back.
Прогресс не всегда идёт по нарастающей. Временами мы шагаем вперёд, временами откатываемся назад. Когда мы шагнули к PC, мы кучу всего потеряли. В эру разделения времени у нас были социальные сети. В системах разделения времени была своя движуха. Было сообщество пользователей и все, кто были в системе, могли обмениваться письмами, файлами, могли чатиться и играть в игры. Они реально всё это делали и всё это пропало с переходом на PC. Потребовалось лет двадцать, чтобы это вернуть.

Brendan Eich, создатель Javascript вообще, оправдывается за то, что в его детище нет макросов:
So we were concerned that if we went off to do macros we were doing research, and if we were doing research we were not going to have Microsoft engaged and we were not going to be putting competitive pressure on them. So macros have had to wait.
Ну, мы были озабочены тем фактом, что если бы мы ушли в макросы, это бы значило, что мы занимаемся исследовательской работой, а исследовательская работа означала бы, что Microsoft может потерять интерес к делу, что лишило бы нас возможности оказывать на них конкурентное давление. В общем, с макросами решили подождать.
(Microsoft, в итоге, одобрила Javascript, а макросы в нём так никогда и не появились.)

Joshua Bloch, создатель Java Collections, хвастается своим чутьём:
Were real engineers bitching about the lack of generics? I think the unfortunate answer to that question is, no, they weren’t. I think I was guilty of putting in something because it was neat. And because it felt like the right thing to do. That said, a lot of engineering is from the gut. Had people been telling me to put in foreach? No. They hadn’t been telling me to do that either. But I just knew that it was the right thing to do. And I was right—everybody likes it.
Думаете, обычные программисты обламывались по поводу отсутствия дженериков? Как ни печально, им было по барабану. Я под свою ответственность включил в язык что-то клёвое. Потому что считал, что это как раз то, что надо. Вообще многое в технологии чуется нутром. Думаете, люди меня просили добавить foreach? Нет, они молчали и о нём тоже. Но я словно знал, как правильно. И всем нравится — значит, я был прав.

Joe Armstrong, создатель Erlang, даёт рецепт бутстрапа:
So then Mike did the virtual machine in C and I did the compiler in Prolog. Then the compiler compiled itself and produced byte-code and you put it in the machine and then we changed the grammar and the syntax and compiled the compiler in itself and came out with an image that would bootstrap and then we’re flying. We’ve lost our Prolog roots and we’re now a language.
И тогда Майк сделал виртуальную машину на C, а я написал компилятор на Прологе. Затем компилятор скомпилировал самого себя и получился байт-код, который мы запустили в машину, а затем мы изменили грамматику и синтаксис и снова скомпилировали компилятор самим собой, и получился образ, который бутстрапился, короче мы взлетели. Забыли свои прологовские корни и сделали новый язык.

Simon Peyton Jones, создатель Haskell, восхищается программной транзакционной памятью:
A sequential implementation of a double-ended queue is a first-year undergraduate programming problem. For a concurrent implementation with a lock per node, it’s a research paper problem. That is too big a step. It’s absurd for something to be so hard. With transactional memory it’s an undergraduate problem again. You simply wrap “atomic” around the insert and delete operations—job done. That’s amazing, I think.
Последовательная реализация двусвязной очереди — это школьная задачка. Параллельная реализация того же самого с поэлементными локами — уже исследовательская проблема. Разница слишком разительна. Не должны быть вещи такими сложными, это бред. А с транзакционной памятью это снова задача для школьника. Просто объявляешь операции вставки и удаления атомарными, и дело сделано. Изумительная штука.
(Также он признаётся, что так и не выучил таблицу умножения.)

Peter Norvig, глава исследовательского отдела Google, раскрывает интересные детали катастрофы Mars Climate Orbiter (в то время Питер работал в исследовательском центре Эймса):
It was a joint effort between JPL in Pasadena and Lockheed-Martin in Colorado. There were two people on two different teams and they just weren’t sitting down and having lunch together. I’m convinced that if they had, they would have solved this problem. But instead, one guy sent an email saying, you know, “Something not quite right with these measurements, seems like we’re off by a little bit. It’s not very much, it’s probably OK, but—" [...] During the flight they had chance and chance to catch it. They knew something was wrong and they sent this email but they did not put it into the bug-tracking system. If they had, NASA has very good controls for bug tracking and at later points in the flight somebody would have had to OK it. Instead it was just an informal email that never got an answer back, and JPL said, “Oh, I guess Lockheed-Martin must have solved this problem.” And Lockheed says, “Oh, JPL’s not asking anymore—they must not be concerned.”
Это была совместная программа JPL в Пасадене и Lockheed-Martin в Колорадо. Были два человека, один тут, другой там, и им не случалось сидеть в одной комнате, обедать вместе. Если бы не это, я уверен что проблема была бы решена. Один парень послал другому письмо, типа, «что-то тут не так с единицами измерения, мы где-то напутали, не очень сильно, но—» [...] Во время полёта они не раз могли это выяснить. Они точно знали, что что-то не так, и они послали это письмо, но оно не было занесено в баг-трекер. Если бы они это сделали, то благодаря отменным средствам контроля NASA, кто-то обязательно должен был этот баг закрыть. Но вместо этого было лишь одно неформальное письмо, на которое никто не ответил, и в JPL подумали «ага, видимо Lockheed-Martin решили эту проблему». А там подумали «ага, JPL замолчали, значит это их не тревожит».
(А ещё он признаётся, что не очень-то читал тома Кнута, но подпирал ими монитор.)

Guy Steele, один из авторов SICP, отмечает, что случись вьетнамские протесты в Америке чуть раньше — не знать бы ему Лиспа и не работать в MIT в возрасте 16 лет:
Then around the beginning of July I heard that Bill Martin at MIT was looking for Lisp programmers. I thought, “Aha, I know Lisp.” I’d hung around MIT so much and had obtained copies of Lisp documentation from the Artificial Intelligence Lab and I would sneak into the labs and play with the computers. The doors were open in those days—the Vietnam protests had not yet happened, which is what caused them to put locks on the doors.
В начале июля я узнал, что Билл Мартин из MIT ищет программистов на лиспе. Я подумал: «ага, а я знаю лисп». Потому что я постоянно ошивался в MIT, делал копии лисповой документации из лаборатории искуственного интеллекта, тайком проникал в комнаты и игрался с компьютерами. Двери в то время были открыты — вьетнамские протесты, из-за которых им пришлось повесить замки, ещё не случились.
(Речь идёт про лето 1971 года; нашествие хиппи на университеты случилось в апреле 1972.)

Dan Ingalls, автор первых реализаций Smalltalk, признаётся, что если бы он любил Lisp конца 1960-х, то за Smalltalk он бы не взялся.
When I got to Xerox there wasn’t much interactive except the Lisp guys’ stuff. I happened not to be into Lisp. Things would have been different if I were, I expect. [...] I think what I worked on with Alan had that same kind of nice, lively, expression feel, but it included the notion of objects and messages more naturally. I think if I had been as comfortable in a system like Lisp, I never would have bothered. I would have tried working around it to get objects, but starting with the notions of objects from the get-go and then making that nice and interactive and convenient was, I think, a contribution.
Когда я попал в Xerox, с интерактивными средами было не особо, за исключением хозяйства лисперов. Так вышло, что лисп мне не пришёлся по душе. А так, думаю, всё сложилось бы иначе. [...] То, над чем я работал с Аланом, создавало схожее впечатление живой, выразительной системы, но при этом объекты и сообщения представлялись в ней более естественно. Думаю, если бы меня устраивали лисповые системы, я бы не стал этим заниматься. Я бы скорее навесил на лисп объекты. Но я начал первым делом с объектов, после чего сделал работу с ними приятной, интерактивной и удобной — в этом был мой вклад.

L Peter Deutsch, создатель Ghostscript, даёт урок расставания с надоевшим проектом:
I basically burned out on Ghostscript. Ghostscript was one of my primary technical interests starting in 1986 and it was pretty much my only major technical project starting somewhere around 1992–’93. By 1998, roughly, I was starting to feel burned out because I was not only doing all the technical work; I was also doing all the support, all the administration. I was a one-person business, and it had gotten to be too much. I hired someone to basically build up a business, and he started hiring engineers. Then it took another two years to find the right person to replace me. And then it took another two years after that to get everything really handed over. By 2002, I had had it. I didn’t want to ever see Ghostscript again.
В сущности, Ghostscript меня вывел из строя. Он был одним из моих главных технических увлечений в 1986 году, и где-то с 1992-93 он стал практически единственным моим большим проектом. Приблизительно в 1998 я стал чувствовать, что выдыхаюсь. Я делал не только всю техническую работу, то и целиком осуществлял поддержку, вёл все дела. Это был бизнес для одного, и он стал слишком тяжёлым. Я нанял человека, чтобы расширить дело, и он стал нанимать программистов. Поиск замены мне занял два года. Ещё два года ушло на то, чтобы передать все полномочия. К 2002 для меня всё было закончено. Я больше не хотел слышать о Ghostscript.
(Ещё через полтора года Питер решил вовсе расстаться с программированием, в возрасте 57 лет.)

Ken Thompson, один из создателей UNIX и Plan 9, раскрывает секрет успеха C++:
Stroustrup campaigned for years and years and years, way beyond any sort of technical contributions he made to the language, to get it adopted and used. And he sort of ran all the standards committees with a whip and a chair. And he said “no” to no one. He put every feature in that language that ever existed. It wasn’t cleanly designed—it was just the union of everything that came along. And I think it suffered drastically from that.
Страуструп затеял многолетнюю кампанию, далеко превосходившую всю его техническую работу над языком, ради того, чтобы язык был принят к использованию. Он типа как укротитель с хлыстом, обошёл все комитеты по стандартам и  ни единому не сказал «нет». Он все когда-либо предложенные фичи запихнул в язык. В результате получилось нелепое объединение всего подряд. Мне кажется, язык от такого подхода колоссально пострадал.

Fran Allen, первая (из двух) женщина-лауреат премии Тьюринга, сетует на победу низкоуровнего программирования над высокоуровневым:
The motivation for the design of C was three problems they couldn’t solve in the high-level languages: One of them was interrupt handling. Another was scheduling resources, taking over the machine and scheduling a process that was in the queue. And a third one was allocating memory. And you couldn’t do that from a high-level language. So that was the excuse for C. [...] By 1960, we had a long list of amazing languages: Lisp, APL, Fortran, COBOL, Algol 60. These are higher-level than C. We have seriously regressed, since C developed. C has destroyed our ability to advance the state of the art in automatic optimization, automatic parallelization, automatic mapping of a high-level language to the machine. This is one of the reasons compilers are ... basically not taught much anymore in the colleges and universities.
У истоков создания C стоят три проблемы, которые не могли быть решены в языках высокого уровня. Во-первых, обработка прерываний. Во-вторых, распределение ресурсов: забрав управление у машины, управлять процессом, который стоит в очереди. В-третьих, выделение памяти. Ничего из этого нельзя было сделать в высокоуровневых языках. Это оправдывает появление C. [...] К 1960 году у нас было большое количество замечательных языков: Lisp, APL, COBOL, Algol 60. Все они были более высокоуровневыми, чем C. С развитием C мы сильно откатились назад. C придушил развитие автоматической оптимизации, автоматического распараллеливания, автоматического перевода высокоуровневых команд на машинный язык. Это одна из причин, по которым компиляторы ... практически исчезли из курсов колледжей и университетов.
(Данный феномен достаточно хорошо объясняется в статье «The Rise of Worse is Better».)

Bernie Cosell, разработчик софта для первых роутеров, вспоминает, как его программа DOCTOR (ныне существующая в своей Emacs-реинкарнации), прошла тест Тьюринга:
I got a little glimmer of fame because Danny Bobrow wrote up “A Turing Test Passed”. That was one of the first times I actually got some notice for my stupid hacking: I had left Doctor up. And one of the execs at BBN came into the PDP-1 computer room and thought that Danny Bobrow was dialed into that and thought he was talking to Danny. For us folk that had played with ELIZA, we all recognized the responses and we didn’t think about how humanlike they were. But for somebody who wasn’t real familiar with ELIZA, it seemed perfectly reasonable. It was obnoxious but he actually thought it was Danny Bobrow. “But tell me more about—” “Earlier, you said you wanted to go to the client’s place.” Things like that almost made sense in context, until eventually he typed something and he forgot to hit the go button, so the program didn’t respond. And he thought that Danny had disconnected. So he called Danny up at home and yelled at him. And Danny has absolutely no idea what was going on. Except Danny knew about my terminal. So he came in and tore the typescript off of the thing, to save it.
На меня упал тусклый луч славы, когда Дэнни Бобров написал статью «Тест Тьюринга пройден». Это был первый раз, когда я стал известен благодаря своим дурацким занятиям: я оставил Doctor-а включённым, и кто-то из начальства BBN зашёл в комнату с PDP-1 и подумал, что это пишет Дэнни Бобров, и стал с ним общаться. Мы-то, наигравшись с ELIZA, знали все ответы наизусть и не задумывались об их правдоподобности. А для тех, кто об ELIZA не знал, они казались весьма осмысленными. Программа глумилась над ним, а он реально думал, что это Дэнни Бобров. «Давайте поговорим об этом». «Вы говорили, что хотите нанести клиенту визит». Всё шло гладко, до тех пор пока он не забыл нажать кнопку, программа не ответила, и он подумал что Дэнни отсоединился. Он позвонил ему домой и наорал на него. Дэнни сначала не понял, в чём дело, но потом вспомнил про мой терминал, приехал и забрал себе ленту с копией разговора, чтобы не потерялось.

Donald Knuth, автор сами знаете чего, отрицает 64-битные указатели:
Pointers have gone out of favor to the point now where I had to flame about it because on my 64-bit computer that I have here, if I really care about using the capability of my machine I find that I’d better not use pointers because I have a machine that has 64-bit registers but it only has 2 gigabytes of RAM. So a pointer never has more than 32 significant bits to it. But every time I use a pointer it’s costing me 64 bits and that doubles the size of my data structure. Worse, it goes into the cache and half of my cache is gone and that costs cash—cache is expensive. So if I’m really trying to push the envelope now, I have to use arrays instead of pointers. I make complicated macros so that it looks like I’m using pointers, but I’m not really.
К указателям я сейчас охладел настолько, что не могу не высказаться: у меня здесь 64-битный компьютер, и если исходить из стремления эффективно использовать его ресурсы, то я против указателей, потому что в моей машине 64-битные регистры при всего лишь двух гигабайтах памяти, что означает, что указателям хватило бы и 32 бит. Но каждый указатель стоит мне 64 бит, и это удваивает размер моей структуры данных. Хуже того, оно попадает в кеш, и половина кеша тратится зазря, а кеш это дорогая штука. Так что сейчас я пытаюсь выйти за рамки привычного, используя массивы вместо указателей. Я пишу хитрые макросы, которые позволяют мне использовать как бы указатели, которые в действительности ими не являются.