Так как я писал в предыдущем посту о том,что очень уютно и хочется сделать что-то креативное,но совершенно не хочется писать код (в отличие от писать всякие букоффки в ЖЖ),нашел я тут забытую в холодильнике бутылочку пива,а посему буду сейчас разливаться мыслью по древу (то бишь,пикселями по экрану).
Итак,как программист с дофигалетним стажем,попробую я объяснить феномен,почему так получается,что программисты,не являющиеся,вроде как,тупыми людьми,постоянно пишут такой код,от которого пользователи лезут на стены от количества глюков,а компании вынуждены нанимать роты тестеров. А потом эта рота тестеров и армия злых пользователей шутят на тему того,что,мол,их программисты спасают полмира,так как не работают хирургами или строителями...
Так вот,дорогие мои,все на самом деле очень и очень просто. Рассмотрим в качестве примера постройку высотного дома и написание программы - первое делает моя мама по работе,второе,как уже говорилось,я сам.
Итак,дом. Начинается все,грубо говоря,с того,что приходит дядька с мешком денег в строительную компанию и говорит: "Хочу дом. Тридцать этажей,вот что я хочу на каждом этаже,а вот мне мой дизайнер нарисовал фасад. давайте строить,бабла дам,сколько надо". Дальше начинается стройка,говорите вы? Хрен там,господа! Дальше начинается Проектирование.
Итак,садятся Умные Дядьки,которые в мельчайших подробностях рисуют чертежи этого дома,включая целый список мелочей,о которых заказчик даже не подозревал - типа системы пожаротушения,вентиляционных ходов и кучи разных технических помещений. В том числе эти же умные дядьки рассчитывают минимально необходимую толщину стен,марку бетона,расположение коммуникаций и еще множество различных приколов.
Этот процесс называется подготовка проекта и без него ничего делаться не будет (ну разве что кроме ограды стройки и первичной подготовки территории). Причем проект этот делается не одним человеком и под пиво с орешками,а несколькими разными людьми,каждый из которых отвечает за что-то одно: сантехник планирует свои коммуникации,электрик тянет по чертежу провода,спец по бетону рассчитывает стены и проемы... Это очень долгий и очень сложный процесс,который,к тому же,достаточно жестко подчиняется ряду правил,написанных в СНиПах - санитарных нормах и правилах. И когда планируется,скажем,фундамент,то все,начиная от выбора технологии (сваи или ленточный фундамент,какие и на какую глубину) и заканчивая,скажем,толщиной стяжки,которая будет на полу подвала,ЧЕТКО и ОДНОЗНАЧНО рассчитывается,учитывая всевозможные ньюансы,учитывая все,начиная от гиологии данного места и включая птиц на карнизах (плюс,разумеется,большой запас). Причем там все очень продуманно устроено и двое разных Умных Дядек по определению получат в результате одни и те же цифры для одного и того же дома,так как вариант "ну,давай будем считать пять и накинем для надежности еще три" рядом правил жестко и однозначно исключен.Причем один из Умных Дядек еще и отдельно проходится по всему проекту сопроматом - вдруг где-то что-то упущенно и трубы такой длинны лопнут?
Итак,толпа умных дядек составила огромный документ,в котором учтено все,включая буквально каждый кирпич для баллюстрады и гвоздь для плинтуса. Причем мало того,что все учтено до мелочей,оно еще и составлялось по четким правилам,с которыми Умные Дядьки постоянно сверялись,исключающим человеческий фактор (читай: ничего не будет забыто и все расчеты будут сделаны на основании тысячу раз проверенных норм (утвержденных СНиПами и ГОСТами) и на основании тысячу раз проверенных формул (прописанных там же),учитывающих все ньюансы.
Дальше за этот проект садится толпа сметчиков,которая по тем же (но немного другим) СНиПам пишет:
1. Смету,где четко написано,на какие работу идут какие материалы и в каком количестве,включая даже такие,казалось бы,очевидные вещи,как укладка пола.
2. Детальные планы работ (как общие,так и локальные),где четко и однозначно написано,что в каком порядке делается,включая возможные паралельные работы.
И только потом бригада строителей приступает к непосредственно строительству по всем этим многократно проверенным и утвержденным бумажкам. И каждый прораб четко знает,что когда делается,зачем и как. И четко знает,где какой проем должен быть,чтобы потом все "срослось" в один огромный дом. Возможность того,что дырка в одной стенке будет на высоте 50 см от пола,а в другой - на 80 см,исключена полностью (если,конечно,по ряду других причин,НЕ НАРУШАЮЩИХ норм и правил и общей концепции дома.в этом есть нужда).
Если в процессе строительства дома заказчику вдруг срочно захочется достроить еще один рад балконов или,скажем,аквариум высотой в два этажа,опять зовутся Умные Дядьки и пересчитывают весь проект,учитывая новые требования,на основании чего делают Проект Реконструкции,где написано,какие стенки надо усилить и где чего перенести. И только так и никак иначе.
А теперь,уважаемые мои,поговорим о том,как это делается в чуть менее,чем всех,случаях разработки любой программы (от системы типа 1С до веб-сайта "Я и моя собака").
Итак,приходит дядька с мешком денег в софтверную компанию (пусть даже из одного человека - не суть важно) и говорит: "Хочу программу. Она должна делать вот это вот (список требований),а вот мне мой дизайнер нарисовал дизайн. Давайте писать,бабла дам,сколько надо". Начальник фирмы вызывает начальника Отдела Разработки (а в реале чаще всего - Главного Программиста) и говорит: "Напиши Техническое Задание и план работ".Чувак берет листочек и идет ваять ТЗ (Техническое Задание то есть).
В идеале он прикидывает,какие надо написать модули,какой из них что должен делать в подробностях. Подробности в идеале включают в себя даже типы переменных для хранения той или иной информации,но на практике ТЗ пишется в основном для заказчика (типа программисты не тупые,им не надо говорить,что год рождения - это число) и многие подобные моменты часто упускаются. Ну и он же пишет план работ.
Тут надо отметить один момент. Если в проекте дома учитывается каждый кирпич и каждый проем,то тут подобных деталей достаточно мало. Ну действительно,не указывать же программисту,как создавать базу данных,равно как и не указывать каменщику,как класть кирпичи - он и сам это знает.
Потом ТЗ утверждается заказчиком и программеры начинают писать... И вот тут-то начинается самое интересное. Программист А в ТЗ читает: "дата рождения клиента" и создает поле,рассчитаное на дату рождения. Программист В в другом месте читает: "в зависимости от возраста клиента..." и думает,что в базе хранится информация о возрасте в полных годах. Вообще-то он должен внимательно прочитать ТЗ и знать,что вводится дата рождения,но иногда бывают очень неоднозначные случаи (и лично видел много раз),когда каждый из программистов сделал какой-то вывод о какой-то информации,держа в голове только свой кусок ТЗ и по его логике все было верно! Но в целом не увязывалось ни разу. А не свои части ТЗ все программисты хоть и читали,но невозможно же помнить все ньюансы из,скажем,тридцати страниц ВОРДовского документа! повторюсь: тут я привел очень очевидную ошибку,а иногда бывают такие моменты,что не сразу вообще поймешь,как это лучше сделать,куда уж до рассуждений о возможных связях с другими кусками работы...
Но беда еще и в другом: в коде. Так как почти весь код (кроме,разве что,самых сложных и очень неоднозначных расчетов - там да,частенько набрасывается некое подобие блок-схемы) пишется из головы,на ходу сочиняя алгоритм (ну действительно,рисовать на каждый свой кусок кода блок-схему и алгоритм замахаешься и времени уйдет больше,чем на сам кодинг),то вылазит много логических косяков,которые не сразу и заметишь. Как минимум потому,что компьютер НЕ ПОНИМАЕТ задачи "нарисовать сбоку кнопочку,как в ТЗ",ему надо расписать все в малейших подробностях.
Чтобы не придумывать правдоподобный пример,объясню на другом примере. Ну вот,скажем,планы на завтрашний день: утром тихо поехать на работу,не разбудив любимую жену,вечером сходить в кино с женой и в магазин за продуктами. Все просто? А теперь напишите это в духе:
1. Проснуться.
2. Понять,на каком боку лежишь.
3. Если на левом,то встать и далее п.6.
4. Если на спине или правом,то повернуться и п.3.
5. Если тебя обнимает жена,аккуратно освободиться,не разбудив и п.3.
6. Если тапки стоят перед тобой на полу,одеть.
7..... и еще примерно сотни три подобных пунктов....
Я задолбался уже на седьмой строчке,а их в хорошей программе вполне могут ТЫСЯЧИ. Кстати,в том алгоритме,который написан выше,есть аж две ошибки - желающие могут попробовать найти сами.
Не нашли? Ну вот пожалуйста: если вас обнимает жена,а вы лежите на левом боку,то вы встанете,ее разбудив,что нарушит условия задачи,где четко написано: "не разбудив". И второе: если обнимает не жена,а,скажем,любовница (или любовник) - кусок программы уже не сработает (любовник - это НЕ любимая). В идеале надо уточнить,что надо делать в случае любовника,но за каждой мелочью к нему замахаешься бегать,так что пишется,как считается более правильным (об этом ниже еще будет)
Так вот когда какой-нибудь твой кусок программы состоит из нескольких десятков строк,такие мелочи в голове еще держатся,но когда строк в итоге получается пару сотен,что-то обязательно вылетает из головы (и никакое перечитывание не спасает,потому что перечитав,теряешь суть того,что пишешь - возможности мозга не бесконечны). И начинаются косяки.
Ну ладно,кое-как программисты это все написали,и даже тщательно отладили (на практике,кстати,так как всего не предусмотришь,а компьютер - железка очень тупая,потом даже в самой-самой отлаженной программе вылазят косяки типа того,что утром вы проснулись на левом боку,но вчера была пьянка и ваш пьяный друг придавил вас тумбочкой - ой,критическая ошибка).Потом показываем заказчику.
А тут начинается веселуха и аврал для программеров. Потому что кнопочка не та и делает не то ("извините,я сразу не подумал"),форма ввода неудобная,в качестве количества товара надо было использовать дробное число (а все думали,что целое...),а в название товара должна влазить чуть ли поэма,но печататься только первое предложение. Плюс упомянутый выше прикол с любовником,которого,оказывается,надо бить по морде (а не стараться не разбудить,как мы думали). И программеры начинают вставлять в свою программу тонны "костылей",особо уже не глядя по сторонам (ибо некогда,а косяков море,а сроки горят). Если фирма крупная,начальник не идиот,а ТЗ составлено идеально,то под это еще дополнительно вытрушиваются деньги - но на практике чуть менее,чем всегда эти косяки надо исправлять на ходу,по живому - то есть с сегодня на вчера и под пиздюлями...
Чтобы понять,как это весело,попробуйте вставить в вышеприведенный алгоритм например то,что надо в случае жены еще ее поцеловать в щечку,в случае любовницы еще и вспомнить имя,а если проснулись в лесу,то край кровати может быть не слева,а с любой из сторон (оказывается,вы еще и в походы ходите!)и не тапочки,а берцы... Чтобы в итоге,когда все эти костыли вы уже вставили,то заказчик верещит,что программа проснулась в вытрезвителе и почему-то поломалась! Ахтунг! Кто виноват? На кого валятся все шишки? Кто самое слабое звено? Правильно - программист.
Потом,когда все костыли более-менее вставлены (и даже программа идеально отлажена,чего на практике вообще никогда не бывает),начинается внедрение,когда пользователи учатся ей пользоваться... Тут оказывается,что одни идиоты не знают,что кнопка "Закрыть" не сохраняет данные ("ой,а мы думали,оно само,а "Сохранить" так,на всякий случай"),другие вводят в количество товара имя своей собаки,третьи не умеют пользоваться мышкой,а четвертые просто идиоты по жизни и верещат "вот,блядь,долбоебы программисты,у меня ни хера не работает",хотя у них не включается компьютер... Нормальные пользователи,кстати,жалуются или на явные косяки,то есть по делу,или не жалуются вообще,а только спрашивают "А как сделать?" или "А почему?".
Поняли теперь,почему дома не падают,а программы часто глючат со словами разработчика "ну вы пока тут не нажимайте,а мы починим"? Поняли,почему на любую просьбу доделать программу первая наша реакция - слепить отмазку,почему нельзя это сделать ни в коем случае? Поняли,почему мы упускаем из виду казалось бы очевидные вещи даже типа неудобно расположенной кнопки "ОК"? И почему пьем пиво и жалуемся,какие идиоты эти пользователи? Если поняли,то постарайтесь относиться терпимей - мы ведь тоже живые люди... :)
P.S. Нет,это не нагорело прям сейчас,просто давно хотел написать,а вот только сейчас дошли руки. :)
P.P.S. Спокойной всем ночи,я подремаю трошки и на поезд. :)