Привет друзья! Совсем недавно, в одном из чатов, у меня состоялся весьма интересный диалог, который помог мне понять разницу между… (между чем, прочитаете в самом диалоге). С разрешения второго участника я опубликую этот разговор, поскольку думаю, что его содержание будет интересно и новичкам, и опытным пользователям, которые гуманитарии (нам особенно). Итак, речь шла о качестве написанного когда, в том числе кода блокчейнов Голос и Стимит.
— Каждый человек, если он делает что-то, заинтересован сделать свою работу хорошо. Кодеры же тоже люди ))) Я просто не представляю себе, что значит «хороший» и «плохой» код. Вероятно, это так — когда написано сложно то, что можно написать гораздо проще?
— Ну, в чем разница между хорошим рерайтом и плохим рерайтом? Ведь можно же сделать хорошо. А поди ж ты...
— Да. я поняла. Пример с рерайтом очень удачен!!! )
— Вот тебе самый примитивный пример. Сравни три кода.
Первый:
- Купи яблок
Второй:
- Купи килограмм яблок
- Предпочтительно красных, если нет, то зеленых, если нет, то желтых, если нет — то любых.
- Не дороже 1000 за кг, не дешевле 100 за кг.
- Если не будет яблок купи килограмм груш (соответствующих условию из пункта 3).
- Если не будет ни яблок ни груш — не покупай ничего.
Третий:
- Купи килограмм яблок
- Список сортов яблок в порядке предпочтения смотри в модуле 1
- Допустимый диапазон цен смотри в модуле 2
- Если не будет яблок купи килограмм груш. Список сортов в порядке предпочтения в модуле 3, диапазон цен в модуле 4.
- Если не будет ни яблок ни груш — не покупай ничего.
В результате первый просто зачастую не сработает, во втором все переменные зашиты внутри кода и чтобы что-то поменять — надо лезть внутрь, а в третьем логика кода отдельно, сама по себе, а все настройки вынесены отдельно и легко меняются.
— Второй самый лучший?
— Третий самый лучший.
— Но там нет данных, к которым отсылают. Значит, данные лежат отдельно где-то? Это там, что называется докером или контейнером?
— Ну, мне было лень писать сорта яблок, я в них не разбираюсь. Но смысл именно в том, что они вынесены... Нет. Их называют библиотеками.
— И эти библиотеки могут использовать и другие люди, получаются. То есть, польза для общества. Ага.
— По разному, есть публичные библиотеки, а есть узкоспециальные. Более того. Допустим, надо изменить допустимые цены для груш, их можно покупать дороже — мы можем унаследовать цены для яблок (скопировать модуль) и добавить к нему условие, что все цифры там умножаются на 2. Тогда если со временем из-за инфляции все подорожает, нам достаточно будет поменять только цены в главном модуле, и все унаследуется в производные модули.
— Понятно. Получается, прежде чем писать код чего-либо, кодер должен четко представлять себе алгоритм его работы. Пока я уяснила, что хороший код — это правильный, четкий алгоритм + правильная запись команд + оптимизация команд + возможность его легкого изменения в случае необходимости.
Конец диалога
...Скажу я вам, тема меня зацепила. Тем более, что она часто обсуждается в Делегатском чате тоже. Я совсем, совсем не кодер. Иногда мне удавалось заглядывать в записи кода в блокчейне Голоса (спасибо Вику), порой подсматривала то, что кодил сын. Да, еще лазала в код страничек Word Press, опять же с сыном, поскольку на вордпрессе у меня сайт. И все. Но решила немного почитать в инете, что об этом говорят «кодо-гуру», и нашла очень интересную статью, а в ней — весьма интересную книгу, называется она «Совершенный код», и написал ее Стив Макконнелл. В этой книге 900 страниц, но авторы статьи уверяют, что ее прочтение — необходимо любому, особенно начинающему кодеру!
Тезисно изложу основные позиции, на которых останавливаются авторы статьи, надеюсь, они «совершат просветление» у вас в голове а может быть, даже будут интересны.
Код — это эсперанто
Помните, было время, когда энтузиасты пытались ввести этот искусственный язык? Цель очевидна — чтобы люди на всей планете, изучив его, могли понимать друг друга. Так вот для прогеров он не нужен. У них есть свой эсперанто. И это код.
Конечно, существуют некие «правила написания кода», но они не жесткие и не всегда кодеры им следуют.
Авторы статьи шутят, напоминая об одном из принципов проектирования - KISS (Keep It Simple, Stupid! Делай это проще, тупица!). То есть, во главу угла ставится ясность и простота. Но простота простоте рознь! Простота никак не должна повлиять на продуктивность.
Хороший, чистый код должен решать ряд задач. Среди них:
- Легкость тестирования и последующей настройки
- Иметь четкую логику именования, читабельный стиль интерфейса и реализации
- Отличное структурирование — для возможности работы программы на любом аппаратном обеспечении или разных платформах
- Создать возможность оптимизации — в том числе, изменения самого кода и его архитектуры, добавления новых свойств, повышения быстродействия
- Обеспечить устойчивую бесперебойную работу программы
- В случае открытого кода — дать возможность работать над ним разным людям или сообществам
Если я правильно поняла пожелание авторов статьи, то эти правила должны стать мантрой, которую любой продвинутый кодер должен знать наизусть!!!
Далее в статье предлагаются 8 правил хорошего кода по версии GeekBrains, и я не буду их повторять, потому что там в текст уже включены страшные картинки с непонятными буквами, словами и цифрами! Кто знает, что это, какие команды — почитайте статью!!!
Надеюсь, было полезно!
совершенный код это как последняя ошибка - многие об этом говорят, некоторые пытаются это найти, но никто не видел первого и не нашел второго...
ой кто появился у меня! привет! рада видеть тебя!!! ))
код - это сокровище ))
надеюсь, меня прогеры не побьют за такое вольное изложение )
Не побьют ИМХО.
спасибо спасибо за приятную новость! я расслабилась!
@ladyzarulem очень интересная статья)) я перед поступление в универ три года занимался программированием, выбирал поступать на мехмат или физфак)) в итоге выбрал физфак, физика пришлась больше по душе, чем программирование))
А я выбирал сначала Программирование, но мне сказали, что " на экзамен все билеты проданы" и предложили выбрать между Приборостроением и Робототехникой. В итоге все равно занимался мат. моделированием и стал программистом.
о ты крутой!!!
ого, какой ты грамотный!!! вот молодец! я там не спорола ерунды?
@ladyzarulem, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за количество голосов
Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
@ladyzarulem, Леди, плиз, ВК или твиттер)
Отличный пример с яблоками. Сам раньше баловался программированием, даже писал простенькие игрушки на флеше. И да — "механизм" и его "вводные" обязательно нужно держать отдельно. Собственно, для этого (в том числе) и нужно объектно-ориентированное программирование.
P.S. надеюсь, программисты здесь поправят меня, если я не прав)
@ladyzarulem, благодарю, за то что я прикоснулась к этому.
Танечка! да вот ты уже внутри. мы все внутри, раз в блокчейне увязли )) теперь понять бы, как тут руками ногами правильно шевелить, чтобы настроить так как нам надо )))
Да, Наташа, но вот и тут мой характер проявляется... вникать лень, глубоко копать лень, есть все время что-то важней, видимо. то что кормит. А это не дает в бюджет ничего, так что просто делаю то что люблю - общаюсь и пишу. ) . То есть плыву , не задумываясь )
лень - двигатель прогресса!!!!
От А до Я код был прекрасен -
сияли буквы в темноте.
Был оптимален, безопасен...
но выполняться не хотел.
привет уважаемый!!! спасибо что заглянул ) твое пришествие всегда приятно ) вот только паук твой меня пугает каждый раз! ))) а строки нет. строки - нравятся. кстати, про код - идеально!
прости что поздно отвечаю - инет лежал весь день (
ага... а мне с этим насекомым вообще жить приходится
но испуг - это же нормально, тренировка второй сигнальной системы
вторая сигнальная система... ага... есть о чем почитать теперь... )
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
francisgrey, narin, max-max, vadbars, vict0r, semasping, ladyzarulem, ladynazgool, arhangel, oksana0407, lenutsa, aiparnyuk, baltiyka, seagull15, bag, tortellini, abloud, amidabudda, galinakim, enkeli, benken, leonid96, brainmechanic, vp-cosmos, rualev
Поэтому я тоже проголосовал за него!
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
@ladyzarulem, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Ваш пост получил наибольшее количество комментариев за день
Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
Я ничего не поняла, но все равно мне понравилось!)
хи ) ну как про яблоки-то не понять!!!
Классная статья! Я рекомендую купить и прочитать (изучить) замечательную книгу Владимира Парондажнова "Учись писать и читать алгоритмы" - алгоритмы для правильного мышления.
Мне она очень помогает и в работе и просто в жизни.
Наша жизнь собственно и состоит из алгоритмов, а успешность и скорость решения задач зависит от того, насколько верно мы расставляем приоритеты, т.е. последовательность выполнения шагов, промежуточных задач, в рамках выполнения некоей общей задачи. Если же мы слепили общий алгоритм основной задачи на тяп-ляп, то мы начинаем путаться в последовательностях и в итоге мы выбиваемся из прогнозируемых дедлайнов и быстро устаем, от чего собственно и происходит выгорание, а вслед за ним, проявляется заниженная самооценка и билетик в страну "депрессия".
Успех - это верное прогнозирование. Верное прогнозирование - это верный расчет последовательности. Верная последовательность - это верный алгоритм.
Натали, спасибо тебе дорогая за эту статью, ты меня навела на интересные мысли)
ой вот тебе спасибо. обожаю алгоритмы. они реально очень важны, помогают, особенно когда надо что-то объянснять. книжку твою скачаю обязательно. а лучше куплю. потому как темная, не читала (
Эту книжку, однозначно, нужно иметь в бумажном виде! В электронном виде с ней будет сложно работать.
пойду куплю. раз говоришь )
@ladyzarulem, поучили без меня, пополоскали опять же - без моего участия! Могу сказать одно: шествуя вперед - смотри под ноги!
я на лонжу поцепилась, если что ))
@ladyzarulem, статья прям за живое и трепещщущщее задела! Спасибищще прям ваще от душищщи!!
а сам почему не рассуждаешь на эту тему, Леша? )) давай, я с удовольствием поучаствую с точки зрения чайника )))
Тут у меня ясности нет. А сумбуром голову людям забивать не хочется. Это философский вопрос почти. Может и сподоблюсь, разрожусь на эту тему.
Леша. а ты по кусочкам.
@ladyzarulem Нет, ну я, видимо, здесь тупее всех высказавшихся, но моего высшего технического, а также, когда-то, изучения Фортрана, явно не хватает, чтобы понять, зачем мне "писателю")) эта информация? Я в ней не поняла ничего...Она мне поможет писать тексты? Наташа, в одном слове, если можно, разъясни для бестолковых)) Или это чисто для общего развития?
Я с нетерпением жду продолжение твоей истории из частной практики, а тут, вдруг на тебе, какие-то коды?)))
Алиску не так просто написать жеж!!! обещаю скоро продолжить ))
зачем она тебе, Лара? да ни за чем, не нужна тебе эта информация! ))) не надо было читать, да и все )
Окей, в следующий раз так и пиши, Лара это не для тебя. Ха-ха!! А то я тут сижу, остатки мозгов напрягаю))
ой, не могу! )) тебе про остатки еще рано думать, дорогая! у тебя полный комплект! )
Спасибки!, моя дорогая, умеешь поддержать)))
дя!!! ))))
В писательстве также важен компромисс между многословностью, точностью информации и красотой.
О, да!) Это моя мечта! Достичь такого состояния дзен-писателя))) Иногда, я даже себя убеждаю в том, что я крайне близок к цели)))) Однако потом, откуда-то из глубин подсознания, возникает мой внутренний перфекционист и начинает рассказывать про идеальных сферических коней в вакууме)))
точку поставь!!! это дзен!!!!
Не шуми) Точка мешает смайлику, она делает его одноглазым.)
одноглазый смайлик!!!! ох!
))
Не тужтесь... сначала пишите как автор-перфекционист не раздумывая долго.. потом переключайтесь в режим ленивого читателя, помечайте места, где слишком долго читать и в конце создавайте баг-репорт самому себе на исправление.
Отказался от такого подхода, ибо после проработки каждого баг-репорта и вычитки, появляется новый баг-репорт))
Теперь пишу без баг-репортов. Написал, прочитал, в процессе вычитки подправил где нужно и в публикацию.
Ахтунг #nsfw #мат
На правах представителя касты "костыльных программистов"...
Написание книги сродни написанию хорошей программы.. ну прям одно и то же..
Я в бытность мою студентом подрабатывал копи-врайтером (писал про Соловки Кижи и Валаам). Так подход у меня был тупейшим: читаешь фразу и переделываешь ее синонимами чтоб слова не повторялись.
Потом, когда перечитывал все вместе - волосы шевелились везде, где успели вырасти :)
Спасибо за отклик. Да я в курсе, сама застарелый копирайтер. Правда, рерайтом никогда не занималась, бог миловал)))
И, тем не менее, не поняла какое отношение эта информация имеет ко мне? С чем мне ее "есть"?)) Попобую, конечно, почитать ссылку, а вдруг, наступит просветление...
Ну вот представьте, Вам надо познакомить читателя с новым персонажем.. Вы можете долго перечислять все его характеристики (внешность, нордичность характера, как он поступает в некоторых типичных ситуациях).
А можете просто написать: "Он такой же как тот Вася Пупкин, только добрее.." или "Попади он в ту жи ситуацию, что и Аркадий Паровозов надысь, он не стал бы снимать с себя штаны, чтоб затушить стог сена.. ибо совсем не герой.. штанцов пожалел бы"
Бывает хочется все максимально точно прямо тут и прямо сейчас описать, но читатель уснет читая и переключится на чтение журнала Бурда Моден.
Спасибо за Вашу попытку мне объяснить,извините, для меня очевидные вещи. Но я упорно продолжаю не понимать, что, конкретно, я смогу подчерпнуть для себя из кодов Эсперанто. То, о чем Вы говорите, учат на хорошем, на мой взгляд, курсе Юлии Волкодав " Школа писательского мастерства".
Или я, по-прежнему, продолжаю не понимать смысл того, какую мысль Вы до меня пытаетесь донести? Я думаю,что я все же, для начала, пройдусь по ссылке, данной в посте, а уже потом буду делать выводы, что там для меня будет полезным, а что - пустая трата времени.
Если код не вызывает вот такой реакции, то можно сказать, что код "ничотак".
Сюда добавить следует строгое соблюдение конвенций и процессов принятых в сообществе свободного ПО, а также мировых инженерных практик в целом.
ну это само собой же - все оперсорсники это ведь соблюдают? иначе можно же запутаться вообще
Представь себе.. ядро операционной системы Linux имело более 15 млн. строк в 2010 году, кажется. Линус Торвальдс всем этим проектом в одиночку дирижирует. Представляешь как там важно строгое соблюдение процессов. Тысячи разрабов со всего мира.
Сейчас очень сильно взгляды крупного бизнеса поменялись на опенсорс.. после того как даже Майкрософт начал открывать много своего кода, корпоративщики начали принимать активно процессы и стандарты опенсорс мира. Так что их практики уже де-факто становятся мировыми стандартами.
да!
Неверный перевод.. Вот так должно быть: "Старайся делать это Простым, Тупым".
Из советской теории надежности: "чем больше блоков в системе, тем менее она надежна".
С этой точки зрения Вариант 2 в начале статьи выглядит вполне уместным, если не предполагается больших изменений требований в будущем.
а вот я тоже выбрала второй вариант!!!
а перевод - не знаю, взяла из статьи, как было предложено )) наверное, ты прав )
Фишка в том, что в программировании нет возможность сказать прав я или нет. Всегда есть "обстоятельства"...
Правильно начинать ответ с "It dependds on..." <== вот это работает всегда :D
подожди. вот как это нет возможности. работает - прав. не работает - переделывай! )))
Вот к примеру нам говорят: "Запуск ракеты Союз".. а мало кто догадывается что каждая ракета Союз уникальна была. Под конкретные спутники переделывается многое в ракете.
Мне кажется я даже видел в таком порядке "Keep It Stupid Simple", т.е. "до тупизны простым".
Оптимизация команд однозначно ведет к значительному ухудшению кода. Оптимизация делает код более удобным для ЭВМ, но уничтожает читабельность для человека. Поэтому оптимизацию используют преимущественно для очень зрелого кода.
для зрелого кода... ага... еще бы знать что это такое...
Когда, за месяц ты только пару раз делаешь что-то новое, а основное время чинишь неисправности, то значит код уже зрелый. Когда кускамы выкидываешь и вместо этого делаешь замену, то значит "перезрелый" или "гнилой".
фу. нам такой не нужен!!!!
Существует много критериев "плохого кода", так же как и критериев рукожопости инженера.
Примеры:
Код, который очень чувствителен к изменениям требований. Если модифицировать логику программы оказывается очень сложно, то с большой вероятностью для удовлетворения поставленным срокам модификации программист не будет глубоко продумывать последствия конкретного способа изменения логики, а "накостыляет абы как".
Решая "инженерную задачу" инженер должен иметь целью удовлетворить максимум требований минимальными усилиями. И это в определенной степени конфликтует с понятием "идеальный код". Всегда приходится взвешивать решения и искать компромисс между качеством кода и скоростью / стоимостью решения задачи.
Мотивации у инженеров-программистов бывают совершенно разные. Если человек знает, что для него это работа разовая, то и "закустарить" для него по-быстрому уже будет не зазорно. А вот ежели он допускает, что потом через какое-то время придется самому править этот код, тогда может еще и комментарий напишет вразумительный.
То чувства, когда возвращаешься к своему коду, который не комментировал.
Леш. вот ты специально эту сс дал чтобы мы все, девочки, напугались? )))
спасибо тебе за подробное разъяснение. в принципе, если убрать слово "код", то этими характеристиками можно описать любую работу )) ну, почти любую!
Ну инженерия любая имеет общие основы.. Советская школа она как фрактал...
общие основы - это важно. согласна с тобой. это базис )) и кстати, в университетах этому раньше неплохо учили. ))
Офигенно учили.. Самое главное достоинство советской инженерной школы - систематизация и отлаженный процесс обучения, поэтапный. При этом между разными специальностями много общего было. К примеру процесс подбора источников информации, научно-техническое обоснование оптимальности выбранного решения имеет одинаковые принципы для приборостроения, программирования выч. систем и машиностроения (то с чем я успел в политехе познакомиться).
Опять же системный подход в решении сложных задач.. дробишь задачу пока до атомарных действий не распишешь.
Ну и теория надежности по сути одна на весь политех.
ну, мне про политех сказать особо нечего. но филологов и журналюг учили хорошо!!! )))
хорошо, что я не кодер)
а я вот жалею иногда, Галюнчик. сейчас бы столько вещей упростилось... мне иногда так неудоббно очевидные вещи у ребят спрашивать ) представляю, как это смешно выглядит!
Эээ... Это такая фантазия. У меня другая. Мне смешнее, когда знают не зная.
это как?
Просто. Когда человек уверен, что знает, но на самом деле знаний нет.
бр. а как это может быть? если человек изучал что-то, значит, знает! ))
Леди Вы провокатор?
Я слишком давно занимался программированием. Делал рассчеты фильтров для двухмодовых кварцевых ганераторов в эпоху СМ1 (это машина, которая занимала подвальное помещение. Большая.) Было это в конце 1970-х. И потому примеров о знайках привесть в программировании не получится. Но в иных областях - сколько хочешь.
"Отнимите от числителя и знаменателя два нуля", или
"сокращаем дробь на три нуля", или
"периметр прямоугольника это длинна плюс ширина, умноженная на два"
Поясняю:
от числа отнимать можно только число (потому как вычитание) и сколько нулей не отнимай, число не изменится.
Сокращать - это значит делить на одно и тоже число. Делить на ноль нельзя. До того времени, пока не изучат пределы.
Р = (А + В) * 2, а не так, как сказала учительница Р = А + В*2.
У учительницы документы с самыми высокими оценками по всем предметам.
Все эти люди изучали, их уверили и они были уверены, что знают. Такие дела...
Про меня. Я понимаю, что ошибочки при переводе в письменный текст моих мыслей - мой "козырь". И именно это понимание позволяет составлять мне тексты, в которых мало ошибок. Потому как я могу пользоваться подсказками, спрашивать... Но что было бы, ежели меня уверовали б в хороших знаниях по языку? ( у меня красный диплом, кста) Вот Вы и так смеетесь, а так бы и не читали б даже!
Не возможно знать все.. всегда есть рядом кто-то знающий больше. Учиться - не постыдно.. стыдно не учиться.
безусловно!!!! между прочим, Голос учит хорошо!!!! )))
Наташа, спасибо за статью :) Я не кодер от слова совсем, но пример с яблоками великолепен. И еще хочу заметить, что не только для кодера важно понимать, что на выходе получится...
это ж мне человек объяснял. вот умница же, скажи. замечательно объяснил. сказала ему, что надо в универе преподавать! ))
Было полезно, спасибо за интересную статью 🤗
пожалуйста. но прощения на проси! не прощу!!!!
Когда-то давно было к программистам ещё одно требование - быть изобретательными в построении алгоритма, чтобы экономно расходовать ресурс оперативной памяти. Некоторые коды тогда были изящным искусством. При нынешнем изобилии ресурсов это стало необязательным, и коды зачастую стали избыточно громоздкими.
Избыточночть кода и импользование оперативки или дискового пространства вещи и понятия немного разные. короткий и совсем неизбыточный код бесконечного цикла сожрет всю оперативку за секунду. В этом мире мало контор, которые готовы платить за искусство, потому как стоит, но есть достаточно тех, кто хочет подукт быстро-дешево-седито. Потому и пишется точнее состовляется все из готовых блоков копипастой с небольшим дебагом и все счастливы.
короткий неизбыточный код бесконечного цикла... как это романтично звучит!!!
Это просто. Как в анекдоте.
Программист сидит в ванной который час.
Жена заходит, спрашивает:
— Ты чего?
Он показывает бутылку с шампунем.
На ней написано:
— Нанесите шампунь на волосы. Смойте водой. Повторите.
ой. вот это мне уже надо перечитывать несколько раз )))
Однажды давным-давно, когда компьютеры и периферия были большими (и вообще, кроме мейнфреймов, ничего не было), я получил премию за то, что оптимизировал код на Fortran, после чего программа перестала сбоить, и время расчёта месячного производственного плана крупного НПО сократилось в разы. Но сначала хотели впаять выговор за самоуправство ))
самоуправ!!!
Молодой был, горячий )
ага. я видела как они пишутся на коленке. что не правильно или не сработало - просто закомменчивается, чтобы было неактивно и все. это плохо. мы за чистый и красивый код!!! спасибо тебе за отклик, друг @rualev!
Такая небрежность это ведь отражение небрежности мыслей и общей натуры кодера.
ну вот делают так, да. ( приходят другие кодеры и подчищают за ними!
Всё как в жизни )))
эбсолютли!!
Вот ведь умничка! так написала, что даже я почти поняла ))))
да ладно! почти! уверена, ты абсолютно все поняла!!!
Ты хорошо обо мне думаешь ))))
я думаю о тебе адекватно ) а ты о себе - нет )
Мда, походу я не техник не гуманитар и вообще я детский сад, ясельная группа, потому как даже с примерами яблочки-грушки запуталась. Только есть захотела от всей этой информации. Пошла я яблочко грызть. Не дано мне оно, не дано и не надо.)))
моя хорошая. не можешь ты запутаться с этими примерами! ну не можешь. и мозги у тебя там где надо!!! не прикидывайся чебурашкой!
Вот, прочитал и призадумался!
Блондинка уверенно рассуждает о коде. А кто ж я тогда, раз ни бум-бум в этом. Спасибо за ссылку, Наташ! Ушел читать 900 страниц. Вернусь к осени)
Меня возьмите с собой за компанию. Я тоже ни бум-бум.
Берем))
берем!
Леша, не ходи! я не уверенно рассуждаю. я рассказываю что прочитала в статье! и я уже давно не блондинка! )) я эта, ну, почти рыженькая такая ))