| |||
![]()
|
![]() ![]() |
![]()
Большой косяк... Не программистам, возможно, будет неинтересно читать. Да и программистам не особо увлекательным рассказ-жалоба покажется. Но, блин, не могу... Надо излить досаду... Ругаюсь матом. И опять жалуюсь. Жутко. Ругаюсь жутко, в смысле. Рабочий день сегодня закончился в 16:45. Сейчас уже 18:15, а я только вошёл в метро... Да и рабочая неделя пошла прахом... Ибо вместо работы я занимался тупым пялиньем в монитор. А почему? А всё потому что... Раздел для непрограммистов. Краткий словарь терминов.Короче, учебник, блин… Не знаю, на кой пишу, но Для того, что бы людям, далёким о творения нетленных кодов, было понятно, о чём речь, привожу краткий словарь терминов. Среда разработки. В общем, что бы написать программу, нужна другая программа, в которой набирается программистом нетленный код. Нет, конечно, можно выбить программу вручную на перфокартах. Или создать в виде устройства на полупроводниках. Но так сейчас мало кто поступает. Программисты берут специальную программу для разработки других программ, называемую средой, и пишут в ней текс программы на языке программирования. В простейшем случае средой может выступить любой текстовый редактор. Даже "Блокнот". Но это будет не совсем среда. Так как код, набранный в "Блокноте", если только это не двоичный машинный код, который очень сложно писать, так и останется простым текстом. Что бы программа могла работать, нужны ещё 2 программы. Вернее, хотя бы одна из двух. Нужны компилятор и интерпретатор. Компилятор нужен для того, что бы взять текст программы на языке программирования, лёгкий для понимания человеком, но непригодный к пониманию машиной, и преобразовать его в тот самый двоичный код, который может понять процессор. Ну это так, довольно грубо, но суть, думаю, ясна. Каждый компилятор понимает и может "оцифровать" только свой набор команд. Например, компилятор QBasic понимает команды этого языка, но не поймёт команд языка С. И даже может не справиться с кодом на очень родственном TurboBasic. После обработки компилятором программа преобразуется в привычный всем файл, который запускается простым "кликом". Ну это в грубом приближении. Есть масса тонкостей, которых 90% читателей знать не нужно. Интерпретатор, в целом, действует так же, как компилятор. Но он не преобразует всю программу, а берёт её строку, преобразует в двоичный код, выполняет. Потом так же обрабатывается следующая строка. То есть, интерпретатор не выдаёт в итоге исполняемый файл, а это программа, внутри которой Ваш код может быть выполнен аналогично настоящему двоичному коду, но на выходе Вы получите не готовую к употреблению программу, а результат её работы. Для чего же они нужны, эти два зверя? Ну компилятор, понятно, нужен для того, что бы любой пользователь мог пользоваться результатами Вашего труда. Интерпретатор же нужен разработчику. Как правило, интерпретатор позволяет останавливать работу программы в интересующем месте, править её в процессе работы, проверять промежуточные результаты... Правда, программа, запущенная компилятором, выполняется медленнее, но зато в этом режиме легко искать ошибки. Далее под "запустить программу" я буду иметь в виду запуск программы при помощи интерпретатора. Так вот, обычно в современную среду разработки встроены компилятор и интерпретатор. Таким образом, программист, не особо заморачиваясь, может проверить работу программы, поправить ошибки, а потом создать привычный Вам файл. Кроме того, уважающие себя среды обладают различными средствами, облегчающими работу ваятеля кодов. Средства разные: от подсветки синтаксиса, до средств ускоренного ввода типовых команд. У уважающих себя компиляторов и интерпретаторов есть такое свойство, как контроль синтаксиса. То есть, если я укажу в тексе команду, которую они не знают, либо затребую действие, которое выполнить невозможно, они сообщают об ошибке. Этот пункт запомните. Он ключевой в повествовании. Кроме того, думаю, читателю нужно ознакомиться ещё с несколькими терминами. Библиотека. В общем, эта шняга нужна для существенного ускорения разработки программ. Это, грубо говоря, отдельная программулина, которая предназначена для выполнения неких типовых действий. Грубый пример. Вы пишете с десяток программ, в которых нужно в определённый момент получать НДС с какой-либо суммы. Конечно, НДС вычисляется легко. Но, если Вы в 10 программах 10 раз опишете процесс его вычисления, Вам на это смотреть станет противно. Одним из выходов из создавшегося положения является написание библиотеки подсчёта НДС. Вы пишете программу, которая занимается только тем, что получает на вход сумму, вычисляет НДС и возвращает каким-либо образом результат. Потом, внутри своих 10 программ, в местах, где нужно получить НДС, Вы, вместо цепочки расчетов, просто указываете: «а вот тут нужно запустить программку такую-то (Вашу библиотеку), передать ей такое-то значение, а результат этих действий будет равен НДС.» В общем, вместо N строк подпрограммы вычисления НДС, Вы в 10 местах пишете, как правило, только одну. Но это пример грубый… Обычно библиотеки реализуют какие-либо более сложные действия (хотя вычисление НДС тоже имеет место быть). Иногда бывает так, что целые большие программы практически не имеют собственного кода, а состоят из одних вызовов библиотек. Особенно часто это бывает у программистов с большим стажем работы, у которых на все случаи жизни уже накоплены готовые откомпилированные подпрограммки. Бывает и так же, что человек, работающий над программой, не знает, какие библиотеки из неё вызываются. Да и, часто, просто не отличает вызов библиотеки от обращения к какой-либо части программы. Особенно часто такое случается, когда человек просто поддерживает программу, созданную другим программистом. Например, есть большая и очень сложная программа, контролирующая какой-либо бизнес-процесс. Её писал кто-то другой. И Вам говорят: «Реалии изменились. Теперь при закупках оборудования не должно учитываться время перевозки, но должно учитываться время развёртывания оборудования.» И Вы не перекапываете всю программу. Вы не изучаете назначение каждой её строки. Вы просто находите место, в котором осуществляется учёт тех, или иных параметров, а делаете анализ того, что повлечёт за собой изменение порядка расчета, обрабатываете соответствующим образом «тонкие» места, и модифицируете программу в необходимом месте. Если наличие или отсутствие учёта пути не влияет на то, какие стёкла заказываются для производственного помещения, то Вам незачем лезть в алгоритм заказа стёкол. Если Вы будете везде совать свой нос, то не успеете справиться с задачей в срок, и Вас просто однажды попросят с работы. Ну а я, на будущее, всегда стараюсь писать так, что бы для изменения параметров нужно было не лопатить программу, а изменить легкодоступные настройки. Ну это так. Хвастаюсь, блин… Вот… Теперь есть один немаловажный момент. Когда Вы начинаете отлаживать программу, либо начинаете создавать двоичный файл программы – компилировать её – интерпретатор и компилятор, как я выше говорил, проверяют синтаксис кода программы. Таки образом, если они наткнутся на обращение к библиотеке, о существовании которой программа «не знает», то это будет расценено как недопустимая команда. И все нормальные компиляторы/интерпретаторы сообщают об ошибке… По крайней мере те, мелкомягковские, с которыми я привык работать. Ну, блин, избалован я Майкрософтом. Даже продуты Борланда забыл напрочь… Прогресс, понимаете ли… Теперь хочу пояснить ещё один немаловажный термин. Триггер. У меня под триггером будет пониматься объект базы данных. Это вовсе не означает, что триггеры бывают только в базах данных. Триггеры бывают электронные, логические и т.п. Но на них нам пох***. Тот триггер, который я имею в виду, суть некая программка, которая автоматически срабатывает при возникновении некоего события. Например, у Вас есть таблица. Пофиг где эта таблица создана. В Excel’е, Access’е, MS SQL, либо вообще в «Блокноте». Назовём эту таблицу «А». В таблицу «А» записываются имена клиентов фирмы. Ну пофиг зачем. Что бы было. И есть таблица «Б». В неё нужно, например, отмечать сколько раз и в каких строках в таблице «А» упоминается… Ну, например, фамилия «Литвиненко». Ну пофиг, зачем. Например, это нужно Вашему другу из СВР. Или кому-то из друзей Б.Березовского. В общем, пофиг… Вы, конечно, можете написать программу, которая будет запускаться раз в сутки, колбасить таблицу «А» и делать пометки в таблице «Б». А можете каким-либо образом отслеживать все изменения а таблице «А». И на добавление или изменение записи каким-либо образом вызывать маленькую программку, которая будет оценивать вносимую запись, и в соответствии с этим работать с таблицей «Б». Это и будет триггер. Ну это грубое, конечно, описание. Но, в целом, надеюсь, понятно… Вот теперь, блин, сама суть жалобы. Всего 3 строки, блин… (И ради них-то я весь этот словоблуд развёл!)В общем, теперь программерам можно читать. Теперь они меня поймут. :) Короче, писал я в последние года в средах Microsoft. Ну, блин, был, конечно, опыт небольшой работы на разных совершенно языках. И под ОС ЕС писал, и Паскаль-Москва видывал. И на Фокале что-то ваял. И MSX Basic мучил… Всё встречалось… Даже чуть было в «дельфятники» не подался… А когда была мысля поюниксоидить, брался за продукты Borland… Но, во-первых, всё, с чем я сталкивался, при имеющихся минусах, было вполне удобоваримо… А во-вторых, блин, последние лет, хм… Лет 5, наверное, я на 98% работал с продуктами Microsoft. В частности, последние 3 года были всецело посвящены всеобще обожаемому VB. Правда на C# как-то отвлекался. Но это уже давно и неправда. Уже всё забыл… Та, к чему это я строю из себя такого крутого (хотя, на деле, ничего из себя особенного не представляю), А к тому, что, блин, вы теперь понимаете, что знаком я со многими средами. Да и с ОС’ями и «железом» разными знаком. Видать приходилось многое. Удивить меня трудно… И вот… На последнем месте работы (кстати, место просто классное, безотносительно к среде разработки) выясняется, что большая часть прог написана на неком языке Centura SQL Windows. Язык этой среды SAL SQL Windows. Ну, блин, среда и язык малораспространённые. Известно о них мало… Просто так вот повелось. Когда лицензии Microsoft конторе были не по карману, купили они эту «Центуру», блин. Написали на ней гору софта. Благо, позволяла она разрабатывать, по тогдашним меркам, всё быстро и наглядно. Правда язык её очень неудобный. Ну, программисты поймут. Не-программерам читать не рекомендуется. Пример такой. Есть окно. Ну, например, лейбл. Так вот. Что бы сменить его кэпшн (текст), нужно обращаться к внутренним псевдо-API. Причём виндовыми API воспользоваться, как я понял, не получится… При этом для мены текста в лейбле нужны один API. Для смены текста в текстбоксе – другие. А у фрейма Вы вообще лейбл не поменяете. Я, по крайней мере, способа не нашёл. Ну это так, с поверхности пример. Далее не-программеры могут продолжить чтение. В общем, погрустил я над тем, что Короче, вздохнул я тяжко, и принял несколько проектов, написанных на этой Центуре, блин… Изначально всё шло просто ништяк. Задачи по этим проектам были плёвые. То поле подправить, то библиотечку подменить. Как только немного изучил интерфейс, да язык, начал такие вещи за 2 минуты выполнять. Ну и, потом, больше на SQL писать приходилось. Целые многомодульные проги довелось писать в «ковыряй анализы». Ну так как все новые проекты мы пишем в средах мелкомягких, то работа спорилась… До недавнего времени… А недавно пришла мне задача… В общем, в одно старой и страшной программе на Центуре были реализованы изменения. В соответствии с ними, документы того типа, который раньше считался ничтожным, получали силу и должны были обрабатываться соответствующим образом… В общем, лезу в базу… Ищу триггера… Нашёл. Зафиксировал. Разобрал… Всё чин чином… Начинаю трассировать программу, что бы понять, какой триггер «дёргает» запись (дело в том, что нарыл несколько аналогичных триггеров). Трассирую… Вернее, сначала без трассировки запустил – в реалтайм… Завожу документ. Указываю тип. Запускаю трассировщик базы… Нажимаю «сохранить»… Вижу один запрос, второй… Все на выборку… И тут… И тут Центура зависает… Анализирую запросы. Все коротенькие, и возвращают совсем немного записей. Виснуть на них нечему… Дубль 2. Результат – аналогичный… Лезу ко всем, кто сталкивался с этой прогой. Никто ума не может приложить, где же «косяк». Для чистоты эксперимента компилирую (!) (ключевое слово, блин!). Устанавливаю на другой комп… Результат – аналогичный! Докладываю начальнику. Ну он, естественно, отвечает: «Вот ты ещё один баг нашёл. Правь его!» Начинаю трассировку… Теперь нужно опять упомянуть среду Центуры… Среда дурная… Во-первых, кода совершенно не видно. Сплошное мельтешение, несмотря на то, что код выстраивается в подобие иерархии. Всё мелкое. Строку просто так не вставить. Даже отладочную. Брейкпоинты несть. Стек отследить можно. Значения переменных посмотреть, ну по мнению создателей этого языка и среды, тоже можно… С одним НО. Брейкпоинт работает, как надо. Но при его срабатывании код модифицировать нельзя. Часть кода, особенно «пришаренную», можно редактировать и только в отдельном экземпляре среды. Стек мало что даст, так как прога в процессе работы прыгает по событиям, в том числе и виртуальным, как заяц по молю. Причём на все события автогенерится код… В общем, что бы по стеку что-то отследить, нужно обладать большой усидчивостью и недюжим упорством. Запрос значения переменной Вам, в 90% случаев, возвратит только внутренний адрес значения в памяти… Особенно, если это переданный параметр… Прибавьте к этому мелкий шрифт кода. Отсутствие разделителей между кодом модулей, классов, функций и подпроцедур. Отсутствие более-менее логичной подсветки синтаксиса. Абсолютно бестолковый хелп. Отсутствие автодополнения код, а так же бестолковейший «выпадающий хелп-список» допустимых к вызову операторов, функций и т.п. В общем, то, что в 90-ххх годах было крутым, ну никак не может сейчас даже претендовать на чин удобной среды. И вот внутри этого монстра начинаю колбасить код… День. Два. Три… Сроки поджимают. На меня все косятся, а у меня результат – ноль. Программа виснет. Виснет, и всё тут! Путём прямой пошаговой трассировки, день за днём сужая круг поисков, ценой перенапряжения глаз, нашёл-таки виртуальную функцию, в которой возникает зависон. Причём, брейкпоинт на неё поставить было нереально – эта функция вызывается при любом событии в программе. Ну и, сами представляете, поставь я туда точку останова, я бы только и занимался бы кликанием на RUN. (К слову, быстрых клавиш там очень мало, а те. Что есть, далеки от общепринятых.) Ну да ладно. Функцию выщемил… Трассирую.. И обнаруживаю, что при вызове из определённого места внутри этой функции прога виснет априорно. То есть, не только на той строке, которую я нашёл, а вообще. Вот, не доходя до строки, нажимаешь «стоп»… И всё.. Только «три пальца», с гроханием экземпляра среды в памяти… То есть, висла не столько прога, сколько сама среда… Собрал консилиум… Было высказано предположение, что, либо среда криво стоит, либо не хватает библиотек… Тут засада… Если бы не хватало библиотек, то, по логике, компилятор не дал бы мне собрать бинарный файл. А это я делал… Если среда… Тут вообще беда. Среду переустанавливать нельзя. Ибо нужно ставить её в такой последовательности: Centura, а только потом продукты Microsoft. Особенно «Студию»…Иначе продукция мелкомягких «отвалится»… Сами понимаете, что переустанавливать машину из-за одной грёбаной Центуры приятного мало. В итоге, уже в пятницу вечером, когда начальник начал гневно поблёскивать зрачками, установил бинарник на машину другого «центурщика»… И… И, блядь, там он заработал!!! Началась, не извинюсь, ебля мозга – сверка библиотек… И, как Вы думаете, что? Ну да, этот тупой, блядский, ёбаный компилятор просто не проверяет наличие библиотек. Или где-то стоит хитровыебанный обработчик… В общем, одна из библиотек, объявленная на уровне проекта, отсутствовала на моей машине. Блядь! Неделя работы пошла прахом!!! Устанавливаю библиотеку… Запускаю… Всё работает… Ну и??? И??? Кому отрывать руки? Я зол. Зол до невозможности… Перед этим начальник мне сказал, что ошибка, с которой всё началось, должна быть исправлена до обеда понедельника… На часах было 17:00. Пятница… Это когда рабочий день до 16:45… Да, блядь, через 5 минут трассировщик показал, что ни один из триггеров не срабатывает… Я поколдовал 10 минут, стрельнул у коллег сигарету (да, блин, я с этой работой вновь начал баловаться сигаретами. Так и закурить недолго.) А потом я плюнул на всё, да поехал домой. Один фиг в голове катались чугунные шары, а глаза отказывались глядеть… Ну и??? И это не есть Большое Блядство? |
||||||||||||||
![]() |
![]() |