Чтение онлайн

на главную - закладки

Жанры

Кодеры за работой. Размышления о ремесле программиста
Шрифт:

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

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

или медленнее.

Вторая проблема состоит в том, что студент, приобретя такое понимание, становится даже немного слишком умным. Он начинает оптимизировать мелкие детали программ, размышляя примерно так: «Здесь лучше применить несбалансированное двойное реверсивное кубическое преобразование А-В, и я как раз давно хотел это сделать». И так он тратит неделю или две, улучшая те куски, которые в этом не нуждаются, программа становится сложнее, что ей не на пользу. Программисту нужно скорее поверхностное понимание всех этих алгоритмов, принципов их работы и использования. Важнее знать, как выбрать правильный алгоритм и заставить его работать, чем то, что этот — порядка п3 + 3, а тот – 4n2.

Если станет интересно, всегда можно заглянуть в книгу Кнута, но обычно это не требуется. Что действительно нужно изучить студенту, так это структуры данных. Его не должно шокировать, например, создание связных списков в Perl. Если знаешь все основные структуры данных, всегда сможешь выбрать нужную. Не всегда самую быструю. Не всегда самую симпатичную. Но всегда ту, которая лучше всего подходит в данной ситуации, потому что тебе известны все альтернативы. Не говорите Дону, но я продрался через зубодробительные вычисления, которые он использовал, чтобы понизить комбинаторную сложность, и практически не нашел им достойного применения. Зато я всегда отлично ориентировался в структурах — и это приносило результат.

Сейбел: Что посоветуете программистам-самоучкам?

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

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

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

Сейбел: Насколько часто вы сами программировали ради

удовольствия, вместо того чтобы целенаправленно осваивать на практике конкретные методы?

Козелл: Я рассматривал программирование в основном как способ делать полезные вещи и старался развивать свои умения именно в этом направлении. Иногда эти вещи были неисправны, и тогда я мог их починить. Как-то я решил, что неплохо бы разобраться в Лиспе, потому что знал настоящих специалистов по этому языку, а для меня он был тогда по большей части загадкой. Так что я написал несколько программ на Лиспе, и это для меня было гораздо естественнее, чем сидеть под крылышком у Дэна Мерфи и ждать, пока он прочтет мне лекции по CONS, CDR и CAR.

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

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

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

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

Сейбел: Среди самых известных проектов, в которых вам приходилось участвовать, был ARPANET. Вы, Уилл Кроутер и Дэйв Уолден писали программное обеспечение к первым компьютерам IMP новой сети. Как вы попали в этот проект?

Козелл: Наш руководитель Фрэнк Харт относился к своему отделу как к своеобразному инкубатору молодых программистов. Он передвигал людей из проекта в проект. Когда один мой проект заканчивался, он решал, куда меня затем направить. Настоящие консультанты начинали свою работу с командировок в Вашингтон и написания техзаданий; я, однако, был далек от этого. Тем не менее Фрэнк решил поставить меня третьим специалистом в проект IMP.

Осенью 1968 года, когда начали работать Дэйв, Уилли и остальные, я работал над другим проектом. Думаю, мой контракт был делом решенным, но к работе я приступил только в январе. К этому моменту сделано было не так много. Помнится, ребята написали часть кода, но ничего еще не работало. Когда я пришел, Дэйв и Уилли как раз начали вчерне разрабатывать алгоритм работы всей системы в целом и делить фронт работ. Я тоже попросил себе кусок-другой. Как программисты мы все были очень разные, но каждый должен был точно знать, как работает каждая строка кода, в том числе потому, что это была относительно небольшая программа. Сложная, но небольшая.

Поделиться:
Популярные книги

Я не Монте-Кристо

Тоцка Тала
Любовные романы:
современные любовные романы
5.57
рейтинг книги
Я не Монте-Кристо

Офицер-разведки

Поселягин Владимир Геннадьевич
2. Красноармеец
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Офицер-разведки

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Мастер Разума VII

Кронос Александр
7. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума VII

Вперед в прошлое 8

Ратманов Денис
8. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 8

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Экономка тайного советника

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Экономка тайного советника

Газлайтер. Том 2

Володин Григорий
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2

Идеальный мир для Лекаря 15

Сапфир Олег
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15

Хозяйка забытой усадьбы

Воронцова Александра
5. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка забытой усадьбы

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Крепость над бездной

Лисина Александра
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Крепость над бездной

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3

Правильный попаданец

Дашко Дмитрий Николаевич
1. Мент
Фантастика:
альтернативная история
5.75
рейтинг книги
Правильный попаданец