gifts2017

Пропасть в понимании глубины пропасти между человеком и компьютером или что же такое программирование…

Опубликовал Александр Венгер (venger) в раздел Сообщество - О жизни

Очередной приступ графоманства: как же дать представление о том, чем же мы занимаемся, человеку далекому от программирования, например, менеджеру, начальнику, бухгалтеру…
Давайте возьмем такую тривиальную задачу, как «сходить за хлебом в магазин». Мы часто в повседневной жизни делаем это, просим своих детей. И, вполне, справедливо считаем это довольно легкой задачей, с которой может справиться и маленький ребенок. Но, давайте попытаемся представить, что же пришлось бы сделать программисту, чтобы «попросить компьютер» пойти в магазин и купить хлеба…
Не будем вдаваться в технические дебри создания роботов (т.е. функцию передвижения оставим в покое), создания алгоритмов поиска (т.е. найти тот же магазин и путь к нему). Упростим аналогию. Компьютеру нужно сказать, какой хлеб нужен (белый, черный), в каком количестве. Но это не самое сложное, скажете Вы. Подумаешь, чуть больше надо оговорить вот и все. Вот в том то все и дело, что оговорить нужно гораздо больше. Например, нужно предусмотреть ситуацию, если этого хлеба не будет. Например, черного. Тогда нужно оговорить, насколько нужен хлеб. Ведь если у нас есть уже белый хлеб дома, а мы просто захотели черного, то тогда хлеб покупать не нужно. А ведь может быть, что нам нужен хлеб в любом случае, но, если нет черного хлеба, тогда стоит купить белый. А вот если нет ни белого, ни черного, то, возможно, стоит поискать булочки или другие хлебные изделия и купить их, а вот если ничего такого не будет, тогда стоит вернуться назад без хлеба. Или возможно стоит поискать ближайший магазин, зайти в него и попытаться купить хлеб, по той же схеме, что и в предидущем магазине. Но стоит, тогда, раз уж мы такие предусмотрительные, учесть, что хлеба может не быть ни в одном магазине, и тогда компьютер будет ходить от магазина к магазину и искать хлеб бесконечно, чего нам не очень то и хотелось, когда мы посылали его за хлебом. Т.е. стоит предусмотреть, сколько и каких магазинов стоит посетить в поисках хлеба, чтобы не искать бесконечно, если ни в одном хлеба не будет. Но, допустим, хлеб оказался в магазине. Ведь это еще не победа. Ведь не стоит покупать черствый или просроченный хлеб. Тогда надо указать компьютеру, чтобы он брал не только определенный вид хлеба, но проверял его срок годности и состояние. Вот такое получилось увлекательное занятие. И это без учета того, что продавец может банально попытаться обмануть нашего механического посланца и всучить ему вместо хлеба камень с пола по цене хлеба. Или обмануть его со сдачей и ценой покупки. Это все тоже нужно предусмотреть, если мы хотим, чтобы наш механический друг работал, ходил за хлебом, исправно и надежно приносил нам его изо дня в день. И это лишь приблизительная и очень упрощенная картина. Но она дает хоть какое-то представление о программировании и компьютерах.
И тут мы уже можем сказать немного о том, чем же одна программа может быть лучше другой, которые делают вроде бы одно и тоже и даже с одной и той же скоростью. Одно из отличий в том, насколько полно программист предусмотрел наперед все ситуации, которые могут возникнуть при походе в магазин за хлебом. Например, программист мог понадеяться, что в данном магазине черный хлеб будет всегда. Тогда инструкций будет гораздо меньше и программа будет написана гораздо быстрее. И пользователь поначалу даже не заметит разницы. Но это только до тех пор, пока компьютер не столкнется с этой ситуацией. Конечно, мы предполагаем, что если уж инструкции написаны, то они написаны правильно и синтаксически и логически.

Давайте углубимся дальше… Как видим, для довольно простой задачи, у нас, даже в первом приближении, накопилось довольно большое количество инструкций (многие из них взаимосвязаны между собой, т.е. в случае выполнения одних должны или не должны выполняться другие, а третьи в свою очередь могут или не могут выполняться в зависимости от результатов выполнения вторых и т.д.) для компьютера, необходимых, чтобы он мог выполнить задачу. Соответственно, при решении реальных сложных задач инструкций будет гораздо больше, да и связи между ними сложнее. С ростом количества инструкций и взаимосвязей и условий их выполнения друг от друга, встает вопрос организации этих инструкций таким образом, чтобы в них мог разобраться человек (причем не обязательно тот же, что и писал их изначально). Чтобы у него была в дальнейшем возможность изменять их, добавлять новые при поиске ошибок в программе, при улучшении программы или при добавлении новых функций в программу. Например, мы хотим, чтобы покупался не только хлеб, а и еще выносился мусор. Да мало ли чего мы еще можем захотеть. Тут нам поможет другая аналогия. Возьмем приготовление пищи. Хозяйка записывает рецепты разных блюд, чтобы не забыть их, и всегда, когда нужно, может посмотреть, если забыла, как приготовить то или иное блюдо. Она может записывать эти рецепты на клочках бумаги или листиках, складывать их в какой-то ящичек, также некоторые может записывать в тетрадь, которую хранит на полке в каком-то шкафу на кухне, что-то помнит в голове и не записывает. И рецептов этих у нее тысячи. А теперь представим, что наша хозяйка уехала в отпуск. И муж остался дома сам и хочет приготовить себе анчоусы в белом вине. Да-да, и такое может быть :-). Что ему надо делать? Правильно найти нужный рецепт и сделать все, как там написано. Но, чтобы найти этот рецепт ему надо будет покопаться в ящичке, где лежат листики с рецептами, поискать в тетрадке (при условии, что почерк нашей хозяйки разборчив, и можно понять, что она там написала). И, если ему повезет, он найдет этот рецепт, через несколько часов поисков. А теперь представьте, что таких рецептов надо найти много разных, если мы готовим праздничный ужин из многих блюд. И более того, хозяйка, чтобы не затруднять себя, ссылалась на другие рецепты, чтобы не описывать одно и тоже по много раз. Или, записав рецепт с ошибками и положив его в ящичек, потом записала его же в тетрадь, но уже без ошибок. А потом придумала, как сделать это блюдо лучше, но уже записывать не стала, т.к. держит его в голове. Теперь попробуйте найти этот рецепт без нее и решить, какой из них верный… А ведь хозяйка могла предусмотреть, еще до того как записала первый рецепт, что стоит организовать рецепты в один справочник (тетрадь). Чтобы искать нужно было только там, пронумеровав их (чтобы легче было ссылаться из одних рецептов на другие и искать их), разбив на категории (например, мясные блюда, супы, десерты и т.д.). Да и вести их более упорядочено, если рецепт поменялся, то изменить этот рецепт или дописать к нему второй вариант приготовления, или дописав к старому номер нового, улучшенного рецепта. Чтобы, когда кто-то найдет старый рецепт, мог увидеть, что есть более свежий рецепт этого блюда с таким-то номером и смог быстро найти и его. И это все в одной тетради. Если рецептов много, то можно завести для каждой категории (первые блюда, вторые блюда, десерты, напитки) отдельную тетрадь, назвав их томами, например. И хотя это, опять таки, лишь приблизительная и очень упрощенная картина (особенно в свете объектно-ориентированного программирования), но она дает хоть какое-то представление о проблемах и способах организации всех этих многочисленных инструкций для компьютера, которые складываются, в конечном итоге, в программу.
И тут, опять таки, мы уже можем сказать немного о том, чем же одна программа может быть лучше другой, которые делают вроде бы одно и тоже и даже с одной и той же скоростью. Одно из отличий в том, насколько грамотно программист организовал все свои инструкции в единую программу. Разницу пользователь вообще не заметит, если обе программы работают верно, но когда придет необходимость менять, развивать или исправлять программу тем или уже другим или группой программистов, то эту разницу увидят именно они. Насколько, легко будет разобраться во всех этих инструкциях и взаимосвязях их выполнения, чтобы встроить новые, без ущерба для дальнейшей целостной работы программы, или исправить не корректные или усовершенствовать какие-либо из них. Конечно, мы предполагаем, что все программисты владеют своей профессией на должном уровне.

Но, все о чем мы говорили перед этим, лишь часть подводной части айсберга. На самом деле все это актуально для программиста только после того, как он понял задачу, которую он собирается автоматизировать, и изучил ее, разобрался в ней и может приступить к программированию. Давайте продолжим наши гастрономические фантазии и представим теперь, что мы бы хотели, чтобы наш кремниевый друг сервировал стол для приема пищи, как для простых завтраков и обедов, так и для торжественных событий и мероприятий. Прежде чем садиться писать программу, стоит узнать о том, что же такое сервировка стола и какая она может быть. Ведь сервировать стол можно для завтрака, для обеда, для праздника, для чая. Сервировать можно свадебный стол или официальный прием посла. Ведь есть множество нюансов при сервировке. Например, закусочная тарелка должна располагаться строго против каждого стула на расстоянии от края стола примерно в 2 см. На расстоянии 5-15 см слева от закусочной тарелки ставят пирожковую тарелку. При этом центр тарелок должен находиться на одной линии. В зависимости от вида и повода застолья тарелок может быть несколько. В таких случаях под закусочные тарелки ставят мелкие столовые, а пирожковую тарелку (тарелку для хлеба) можно поставить так, чтобы дальние от края стола края тарелок были на одной линии с мелкой столовой тарелкой. Или возьмем столовые приборы. Их раскладывают сразу после расстановки тарелок. Если присутствует большое количество ножей, вилок и ложек, то начинают с приборов для главного блюда. Ножи кладут с правой стороны, лезвием к тарелке, вилки – с левой стороны, острием вверх. Ложку для супа кладут носиком вверх, рядом с ножом. Если в меню предусматривается несколько блюд, требующих использования отдельных приборов, то поступают следующим образом. Ближе к тарелке кладется столовый нож, правее рядом с ним – рыбный нож и последним – закусочный нож. Кстати говоря, если подают сливочное масло к хлебу, то на тарелку для хлеба (или пирожковую), которая должна располагаться слева от вилки, кладут маленький нож для масла. Если подается суп, то ложка для супа кладется между закусочным и рыбным ножами. Она может лежать вместо рыбного ножа, если блюдо из рыбы не предусмотрено. С левой стороны от тарелок располагают соответствующие ножам вилки – столовую, рыбную, закусочную. Расстояние между приборами должно составлять немного меньше 1 см, равно как и расстояние между тарелкой и приборами. Концы ручек приборов так же, как и тарелки должны отстоять от края стола на 2 см. Видите, как много я знаю о сервировке, а я ведь программист и сервировкой стола никогда не занимался :-). Но, если я собрался писать программу для сервировки стола, то мне приходится знать о ней очень много, если не все. Вот такая упрощенная картина получается, когда мы говорим, что программист должен не только владеть профессиональными программистскими навыками, а и еще хорошо изучить и знать предметную область, которую он собирается автоматизировать.

Ну что ж, теперь Вы, дорогой читатель, надеюсь, будете лучше понимать насколько «тяжела и неказиста жизнь простого программиста». И легче сможете находить общий язык с этим подвидом homo sapiens. Удачи Вам в этом нелегком деле…

Автор: Венгер Александр, Одесса, 2008

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Venger (venger) 26.11.08 15:44
Че то аналогии у меня с едой все связаны:-)))
Кризис ... работаю за еду:-)))
vinsentfire; +1 Ответить
2. Василий Демидов (Душелов) 26.11.08 15:48
Еще б покороче чуть-чуть... А в целом ничего! ;)
3. Андрей Скляров (coder1cv8) 26.11.08 16:08
4. mazatrackers (dushich) 26.11.08 16:30
+1
Не каждый раз удается обьяснить это заказчику.
А вот, к примеру, начальнику объяснить абсолютно не возможно.
"- Хачу чтоб сервировалось всё!"
5. Валерыч (Valerich) 27.11.08 02:43
Все правильно, образно и логично, но вот заказчики как правило не обладают образным и логическим мышлением и не читают такие длинные опусы на отвлеченные для них темы.
vinsentfire; +1 Ответить
6. Venger (venger) 28.11.08 11:30
Продолжая тему еды, такой вот парадокс: производство вина, например, есть такие дегустаторы (тестировщики по нашему), так вот, они помимо того, что одарены чувством вкуса от природы, так еще зачастую довольно квалифицированные работники по своей области. А у нас (программирование), тестировщики, как правило, менее квалифицированны, чем программисты...
7. Андрей (vinsentfire) 29.01.09 12:59
Создать программу - это по сути создать некое подобие чего-то, что будет выполнять или автоматизировать некие процессы, которые выполняем мы люди. Чтобы ее создать, нужно создать (написать) механизм, который будет каким-то образом методом перебора условий выполнять те или иные действия, в зависимости от того, как написан алгоритм. Вот автор явно описал этот процесс, на примере, покупки хлеба, где как по мне выразил принцип перебора определенных условий, а в примере с домохозяйкой, описал принципы хранения информации в базе данных и ее использование, при необходимости (когда муж вдруг захотел анчоусов в белом вине). При написании таких программ возникает сразу вопрос как это все организовать, перебрать в голове множество возможных вариантов, которые могут возникнуть. И при этом не все же варианты можно предугадать, а если не предугадал, что робот зависнет.
Тут сразу приходит мысль, а по прообразу чего, творит человек ? Как происходит у нас процес освоения той или иной жизненной программы (поход за хлебом, каждодневное хождение на работу, в школу, в спортзал). Как этот повседневный трудоемкий процесс обучения и исполнения запоминается нами людьми, и как при необходимости, с каких кладовых памяти мы выбираем тот или иной подходящий вариант, при покупке того же самого обычного хлеба. А может всетаки есть какой контроль, который производится не сознанием (тут к примеру робот), а над сознанием (тут к примеру тот же самый хозяин той же машини, которому по тому же телефону или другому приспособлению может приходить сообщение, если робот не может найти белый хлеб, с дальнейшей корректировкой последующих действий). Тут если копнуть дальше, то свободная фантазия может привести к примеру еще множество фантазий. Ну в общем не судите строго, что было на душе почитав данную статейку то и написал.
8. Александр Венгер (venger) 29.01.09 13:11
(7) Задуматься, отвлечься от каждодневной текучки, посмотреть на все со стороны, переосмыслить...
9. Валерий Корженко (motogon) 26.03.09 18:16
10. Александр Венгер (venger) 27.03.09 13:17
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа