Кодеры за работой — страница 123 из 124

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

Сейбел: Как по-вашему, программисты и ученые в области компьютерных наук хорошо знают историю нашей области знания? Ведь она, в общем-то, не столь продолжительна.

Кнут: Не так уж и много сейчас ученых. Даже когда я начинал писать книги — в 1963 году, — мне не казалось, что люди знали тогда, что происходило в 1959 году. На прошлой неделе я прочел в «American Scientist», что был заново открыт алгоритм, который Бойер и Мур открыли в 1980 году. Я на каждом шагу сталкиваюсь с тем, что люди не осознают все великолепие нашей истории. Многим молодым программистам кажется странной мысль о том, что в 1970-х люди тоже что-то знали, понимали и умели.

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

Очень важно уметь понимать образ мышления другого человека, декодировать его словарь, нотацию. Если вы поймете что-то о том, как они думали, и о том, как делали свои открытия, то это поможет вам делать собственные открытия. Я часто читаю первоисточники — что гении прошлого говорили о той или иной проблеме. Их мысли выражаются в непривычных для сегодняшнего человека формулировках, но они стоят того, чтобы разбираться в их нотации и пытаться как следует вникнуть в их идеи.

Например, я долго изучал вавилонские рукописи, чтобы узнать, как 4000 лет назад описывались алгоритмы и что они обо всем этом думали, были ли у них циклы и прочее и как их описывали. Для меня эта работа, безусловно, была не напрасной, поскольку я обогатил свое понимание работы человеческого мозга и понял, как тогда делались открытия.

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

Мне не удалось передать ничего этого своим студентам. В современной компьютерной науке есть те, кому это удается (их не так много). Но я могу пересчитать по пальцам одной руки тех, кто разделяет мою любовь к чтению первоисточников.

У меня большая коллекция исходных кодов. Есть компиляторы, компиляторы Digitek 1960-x, созданные в очень интересной манере. В них использован собственный язык, идентификаторы длиной 30 символов, но они были очень описательными; эти компиляторы заметно превосходили своих тогдашних конкурентов — эта компания производила мейнстримовые компиляторы в 1963 или 1964 году.

У меня есть исходный код Дейкстры операционной системы THE. Я его не читал, лишь пока проглядел, но я нашел его, потому что уверен, что мне интересно будет почитать его в свободное время. Однажды я сломал руку, катаясь на велосипеде, и практически ничего не мог делать целый месяц, поэтому читал исходный код, в котором, как я слышал, применялись некоторые интересные недокументированные идеи. Думаю, этот опыт был очень важен для меня.

Сейбел: Как вы читаете исходный код? Ведь непросто читать даже то, что написано на известном вам языке программирования.

Кнут: Но это действительно того стоит, если говорить о том, что выстраивается в вашей голове. Как я читаю код? Когда-то была машина под названием Bunker Ramo 300, и кто-то мне однажды сказал, что компилятор Фортрана для этой машины работает чрезвычайно быстро, но никто не понимает почему. Я заполучил копию его исходного кода. У меня не было руководства по этому компьютеру, поэтому я даже не был уверен, какой это был машинный язык.

Но я взялся за это, посчитав интересной задачей. Я нашел BEGIN и начал разбираться. В кодах операций есть ряд двухбуквенных мнемоник, поэтому я мог начать анализировать: «Возможно, это инструкция загрузки, а это, возможно, инструкция перехода». Кроме того, я знал, что это компилятор Фортрана, и иногда он обращался к седьмой колонке перфокарты — там он мог определить, комментарий это или нет.

Спустя три часа я кое-что понял об этом компьютере. Затем обнаружил огромные таблицы ветвлений. То есть это была своего рода головоломка, и я продолжал рисовать небольшие схемы, как разведчик, пытающийся разгадать секретный шифр. Но я знал, что программа работает, и знал, что это компилятор Фортрана — это не был шифр, в том смысле что программа не была написана с сознательной целью запутать. Все дело было в коде, поскольку у меня не было руководства по компьютеру.

В конце концов мне удалось выяснить, почему компилятор работал так быстро. К сожалению, дело было не в гениальных алгоритмах — просто там применялись методы неструктурированного программирования и код был максимально оптимизирован вручную.

По большому счету, именно так и должна решаться головоломка: составляются таблицы, схемы, информация извлекается по крупицам, выдвигается гипотеза. В общем, когда я читаю техническую работу, это такая же сложная задача. Я пытаюсь влезть в голову автора, понять, в чем состоял его замысел. Чем больше вы учитесь читать вещи, написанные другими, тем более способны изобретать что-то свое — так мне кажется.

Мы должны публиковать код. Доступны комментарии Джона Лайонса к 6-й версии UNIX, с исходным кодом. И программы Билла Аткинсона теперь находятся в открытом доступе благодаря Apple, и уже скоро мы сможем их прочитать. Это очень хорошо документированный код со множеством новаторских графических алгоритмов.

Сейбел: Конечно, благодаря политике открытого исходного кода у нас сейчас гораздо больше кода для чтения, чем раньше.

Кнут: Да, это так. И по-прежнему каждый может применять разные виды нотации — не стоит читать только тех программистов, которые пишут так же, как и вы.

Библиография

The Art of Computer Programming, Donaid Knuth (Addison-Wesley, 1997).[76]

Beautiful Code: Leading Programmers Explain How They Think, Andy Oram, Greg Wilson (eds.) (O'Reilly, 2007).[77]

Byte, Vol. 6, No. 8, "Smalltalk issue," August 1981.

Code Complete, Steve McConnell (Microsoft Press, 1993).[78]

Compiling with Continuations, Andrew W. Appel (Cambridge University Press, 1992).

The Design and Analysis of Computer Algorithms, Alfred V. Aho, John E. Hopcroft, and Jeffrey D. Ullman (Addison-Wesley, 1974).

Design Patterns: Elements of Reusable Object-Oriented Software, Eric Gamma, Richard Helf, Ralph Johnson, and John M. Vlissides (Addison-Wesley Professional, 1994).[79]

A Discipline of Programming, Edsger W. Dijkstra (Prentice Hall, Inc., 1976).

Effective Java, Joshua Bloch (Prentice Hall, 2008).[80]

The Elements of Programming Style, Brian Kernighan and P.J. Plauger (Computing McGraw-Hill, 1978).[81]

Elements of Style, William Strunk and E.B. White (Longman, 1999).

Expert С Programming, Peter van der Linden (Prentice Hall PTR, 1994).

Founders at Work, Jessica Livingston (Apress, 2007).

Hacker's Delight, Hank Warren (Addison-Wesley, 2002).[82]

Higher-Order Perl, Mark Jason Dominus (Morgan Kaufmann, 2005).

Java Concurrency in Practice, Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes, and Doug Lea (Addison-Wesley, 2006).

Java Puzzlers: Traps, Pitfalls, and Corner Cases, Joshua Bloch and Neil Gafter (Addison-Wesley, 2005).

The Lisp 1.5 Programmer's Manual, John McCarthy (MIT Press, 1962).

Literate Programming, Donald Knuth (Center for the Study of Language and Information, 1992).

Machine Intelligence 1, N.L. Collins and Donald Michie (eds.) (Oliver and Boyd, 1967).

Machine Intelligence 2, Ella Dale and Donald Michie (eds.) (Oliver and Boyd, 1968).

Machine Intelligence 3, Donald Michie (ed.) (Edinburgh University Press, 1968).

Machine Intelligence 4, Bernard Meltzer and Donald Michie (eds.) (Edinburgh University Press, 1969).

Magic House of Numbers, Irving Adler (HarperCollins, 1974).

"META II a Syntax-Oriented Compiler Writing Language," D.V. Schorre in Proceedings of the 1964 19th ACM national conference, (ACM, 1964).

Mindstorms: Children, Computers, and Powerful Ideas, Seymour A. Papert (Basic Books, 1993).

The Mythical Man-Month: Essays on Software Engineering, Frederick P. Brooks (Addison-Wesley Professional, 1995).[83]

Principles of Compiler Design, Alfred Aho and Jeffrey Ullman (Addison-Wesley, 1977).[84]

"Proof of a Program: FIND", C.A.R. Hoare in Communications of the ACM, Vol. 14, Issue 1 (ACM, 1971).

Programming Pearls, Jon Bentley (ACM Press, 1999).

Purely Functional Data Structures,