Разъятая Mathcad-программа
Программы можно не только «обезжучивать» (отлаживать), но и «нажучивать». В стародавние времена, когда программы в ЭВМ вводили не их авторы, а девочки-перфораторщицы и готовые тексты программ из-за этого содержали много «глупых» ошибок типа 5 вместо S, 1 (один) вместо I («и» латинское) и т.д., практиковался (больше, конечно, в теории, а не на практике) довольно оригинальный способ отладки по принципу «клин клином вышибают». Если нужно было узнать, сколько в программе осталось «жучков», то в нее... вводили еще сотню ошибок. Затем другой человек эту программу отлаживал. И если оказывалось, что он, к примеру, выловил 50 специально введенных ошибок и 10 первоначальных, то с определенной долей вероятности можно было считать, что в программе осталось еще с десяток «натуральных» жучков-ошибок. Кстати, подбор искусственных ошибок – это и наука, и искусство высокого класса, а сам процесс отладки очень трудоемкий, способный довести программиста до белой горячки. Недаром по-английски to go bugs означает сойти с ума. Очень часто бывает проще стереть написанную программу и ввести ее заново, чем искать в ней ошибки. Один коллега автора долго не мог понять, что происходит в такой коротенькой цепочке операторов:
a := 3 b := 1 a - b= -3
Если от трех отнять единицу, то должна выйти двойка, но никак не тройка, да еще с минусом? Ответ оказался прост, но эта простота была уж точно «хуже воровства». Дело в том, что в приведенном примере не b вычитается из a, а переменная a умножается на минус b. В среде Mathcad начиная с 7 версии, если константа умножается на переменную, то знак умножения можно опускать. Этот прием особо удобен при вводе размерностей 5m, 3 kg и т.д. – человек еще до общения с компьютером привык не ставить тут знака умножения. В вышеприведенном примере сначала было записано 3 b=, но потом тройку заменили на переменную a, а b на минус b. Услуга Mathcad (программисту не нужно вводить знак умножения) здесь оказалась «медвежьей». Вот еще иллюстрации принципа «Не верь глазам своим!»:
- MT – что это? Транспонированная матрица M или матрица (вектор, скаляр) M в степени T?
- Аi ¾ это i-й элемент вектора А или i – это часть имени переменной с текстовым индексом (набираем A.i, получаем А i)?
- В переменной Стрелок первая буква английская «си» или русская «эс»?
Свести с ума может и такая «первоапрельская» шутка. Программист на минутку отлучился от компьютера, а «шутник» вверху Mathcad-документа, на правом, невидимом листе написал sin(x):=cos(x), e:=p или что другое из области «crazy[88]». Можно у отдельной переменной незаметно поменять шрифт с Variable на User1, например – эффект тоже будет очень интересным. В таких ситуациях не стоит пытаться отыскать ошибку – лучше начать все с «чистого листа»: создать новый пустой рабочий документ и в него постепенно переносить отдельные фрагменты «сумасшедшего» Mathcad-документа, отлавливая ошибку…