Индустрия чистых идей
1.1. Их машины и наши
Инженеры проектируют и строят машины. Автомобиль – машина для путешествий, электрическая цепь – машина, преобразующая сигналы, мост – машина, позволяющая пересечь реку. Программисты – инженеры ПО – также проектируют и строят машины. Мы называем наши машины программами или системами.
Есть разница между нашими машинами и их машинами. Если вы уроните одну из их машин, то можете повредить себе ногу. Наши тоже падают, но ног не ломают.
Программы не материальны. В некотором отношении они ближе к математическим теоремам или философским высказываниям, чем к самолетам и пылесосам. И все же, в отличие от теорем и высказываний, они являются инженерными устройствами: вы можете оперировать с программами подобно тому, как вы оперируете с пылесосом, достигая определенного результата.
Так как невозможно оперировать с чистой идеей, необходимо некоторое материальное, ощутимое устройство, позволяющее оперировать с программами или, используя более общие термины, запускать или выполнять (run, execute) их. Такую поддержку осуществляет другая машина: компьютер. Компьютеры и связанные с ними устройства называют аппаратурой (hardware). Хотя компьютеры становятся все легче, они являются машинами и могут, падая, повредить ногу. Программы и все, что к ним относится, в противоположность аппаратуре называют ПО – "программное обеспечение" (software) – слово, появившееся в 50-е годы, когда возник интерес к программам.
Давайте посмотрим, как эти вещи работают. Вы мечтаете о машине, большой или маленькой, и описываете вашу мечту в форме программы. Программа может быть загружена в компьютер для выполнения. Сам по себе компьютер является машиной общецелевого назначения, но когда в него загружается программа, он становится специализированной машиной – материальным воплощением нематериальной машины, описанной в вашей программе.
Пишете программу "вы", предсказуемо названный в предыдущем абзаце программистом. Другие, называемые пользователями, могут затем выполнить вашу программу на вашем или своем компьютере.
Если вам уже приходилось пользоваться компьютером, то вы запускали некоторые программы, например, бродя по Интернету или играя в игры, так что вы уже пользователь. Эта книга должна помочь вам сделать следующий шаг – стать программистом.
Циники в индустрии ПО "юзеров" презрительно называют "лузерами" (loser – проигравший). Наша цель в том, чтобы пользователи наших программ называли себя "винерами" (winner – победитель).
Нематериальная природа машин, которые мы строим, делает программирование столь привлекательным. Обладая достаточно мощным компьютером, можно определить любую машину по вашему желанию, ее операции будут требовать миллиарды и миллиарды шагов, и компьютер выполнит их для вас. Вам не понадобятся ни дерево, ни клей, ни металл, не нужен молоток, не нужно бояться, что вы что-то разобьете, подымаясь по ступенькам, или порвете одежду. Придумайте и получите. Единственное ограничение – это ваше воображение.
На самом деле, это одно из двух ограничений; мы избегаем упоминать другое в интеллигентной компании, но, вероятно, вы сталкивались с ним уже не раз. Ограничение связано с вашей способностью совершать ошибки. Ничего личного: если вы подобны мне и многим другим людям, то вы делаете ошибки. Много ошибок. В обычной жизни они не столь уж опасны, поскольку обычная наша деятельность толерантна к незначительным проступкам. Можно нажимать вилкой на блюдо сильнее, чем требуется, пить быстрее, чем полагается, выжимать педаль сцепления резче, чем нужно, использовать более крепкие выражения, чем полагается. Это случается, и в большинстве случаев это не мешает вам достичь желаемой цели: есть, пить, вести машину, общаться с друзьями.
Но в программировании все обстоит по-другому. С невероятной скоростью компьютер будет выполнять программу, задающую вашу машину так, как вы ее создали. Компьютер "не понимает" вашей программы, он просто выполняет ее, малейшая ошибка тут же отразится на механизмах машины. Что написали, то и получите.
Это правило, пожалуй, главное, что всегда следует помнить, имея дело с компьютером и обучаясь программированию. Возможно, до сих пор вы верили в другое, в то, что компьютеры умны, ведь программы кажутся столь совершенными. Примером подобного чуда является поиск в Интернете, благодаря которому менее чем за секунду можно найти среди множества предложений идеальное место для вашего отдыха. Хотя человеческий разум встроен во многие программы, компьютер, их выполняющий, подобен преданному и не рассуждающему слуге, бесконечно честному, бесконечно быстрому и определенно глупому. Он будет беспрекословно выполнять данные ему инструкции, никогда не проявляя инициативы исправить ошибки, хотя человек нашел бы их очевидными. Ответственность на вас – программисте, вы должны предоставить этому покорному созданию безупречные инструкции, задающие – при выполнении любой важной программы – миллиарды элементарных операций.
Работая с компьютером, вы, вероятно, замечали, что он не всегда функционирует так, как хотелось бы. Бывает, что компьютер "зависает", или "падает", – все перестает работать. За исключением редких случаев отказа аппаратуры, это не компьютер "зависает", а программа "подвесила" его, то есть его "подвесил" программист, не предусмотревший все возможные сценарии работы.
Вы не сможете научиться программированию, не получив подобного опыта работы – вашего собственного опыта, не убедившись на практике, что не все работает, как должно; вы не станете профессиональным программистом, если не овладеете методиками, позволяющими вам строить программы, которые выполняют работу так, как вы хотите.
Есть хорошая новость: такие программы можно создавать, овладев подходящим инструментарием и дисциплиной сопровождения, обращая внимание как на всю картину в целом, так и на детали.
Помочь вам овладеть предметом – одна из главных задач этой книги, которая является не просто введением в программирование, но учит программировать хорошо. Заметьте: начиная со следующей лекции появятся советы "Почувствуй методологию" и "Почувствуй стиль", где собраны рекомендации– плоды долгих лет работы, результаты трудного пути, которые помогут вам создавать ПО, работающее так, как вы того желаете.