Здравствуйте, __kot2, Вы писали:
__>сейчас я, например, работаю над очень крутой вещью и получаю столько, чтобы спокойно отклонять письма от рекрутеров компаний, в которых многие мечтают просто хотя бы прособеседоваться, хотя конечно же есть какие-то минусы, но мой накопленный опыт дает мне знания как можно не заниматься переделыванием компании под себя, а просто получать удовольствие
Слушай, заинтриговал! А в каких компаниях многие "мечтают просто хотя бы прособеседоваться"?
Здравствуйте, kaa.python, Вы писали:
KP>Слушай, заинтриговал! А в каких компаниях многие "мечтают просто хотя бы прособеседоваться"?
Amazon-Google-Microsoft? Регулярно отклоняю спам
Здравствуйте, MTD, Вы писали:
MTD>Здравствуйте, sourcerer, Вы писали:
S>>3аберите меня отсюда, пожалста!
MTD>К чему это нытье? Уволься, рабство вроде как давно отменили.
поручили одному чуваку рефракторить мой код. чувак посмотрел на это дело и подал на увольнение. серьезно. сказал, что его инфаркт хватить может. сердце не выдержит. он же ведь старенький. за пятьдесят. многое видел в своей жизни. но...
ну там сначала все с мелочей начиналось. выходы за границы буфера. на си. причем в оба конца. как по отрицательному смещению так и за конец. компилятор ругается матом. компилятор же не знает, что у меня свой собственный аллокатор. реал-таймовый. на реал-таймовой оси под mips. выход за границы буфера это такой протокол общения кода с аллокатором. код говорит когда аллокатор может взять тайм-аут на майнтенс и перестройку структур данных.
убрали выходы за границы буфера -- перестала освобождаться память. сюрприз, да. но это чувак еще стерпел. тем более что это как бы логично, чтобы с аллокатором был протокол. пускай и не доументированный и реализованный не через api функции (их же тогда документировать нужно будет), а через выход за границы.
дальше -- идет обращение к неиницилизированным данным в куче. на самом деле иницилизированным. это аллокатор возвращает указатели на api функции в начале каждого выделенного блока. это нужно затем чтобы код программы мог их динамически перекрывать своими собственными. и это реально нужно коду. без этого программа разваливается. но.. компилятору такое не нравится.
короче, чувак обдумал ситуацию и решил не рисковать здоровьем.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, binnom, Вы писали:
B>А потому, что ты не хочешь получать больше. Точка. Это и есть причина. Всё остальное — это отмазы и производные.
Хочу. Просто я не вижу "больше" в этих компаниях мечты. Ты почитай откровения на том же Рсдн, что 60% сотрудников редмондской компании в редмонде родом из Индии. Не хочу ничего плохого именно как про нацию говорить- отличные ребята, но вот везут на рабочую визу чаще всего с целью экономить на зарплате. "Мы не можем найти местных с нужной квалификацией"- лапша на уши для иммиграционной службы.
Здравствуйте, Олег К., Вы писали:
ОК>Ну что ты как маленький? Впервые увидел что ли плохой код? Ну так привыкай. Даже на этом форуме только единицы могут и писать нормальный код.
Самое печальное не то, что код ужасен, а то, что его не позволяют поправить так, как нужно, (я уже думаю оставить (не удалять) эти г-классы, а написать новые, с собственными представлениями о прекрасном) — иначе попадет в протокол, а протоколы начальство почитывает, а оно само из бывших программистов (что вообще-то нехарактерно). Поэтому — "улыбаемся и машем".
Здравствуйте, Aртём, Вы писали:
B>>А потому, что ты не хочешь получать больше. Точка. Это и есть причина. Всё остальное — это отмазы и производные. Aё>Хочу. Просто я не вижу "больше" в этих компаниях мечты.
Да ладно? И это с учетом того, что AUD плавает почти как рубль? Очередная отговорка.
Аё>Ты почитай откровения на том же Рсдн, что 60% сотрудников редмондской компании в редмонде родом из Индии. Не хочу ничего плохого именно как про нацию говорить- отличные ребята, но вот везут на рабочую визу чаще всего с целью экономить на зарплате. "Мы не можем найти местных с нужной квалификацией"- лапша на уши для иммиграционной службы.
В отличии от многих других ты имеешь привелегию выбирать компанию или даже команду, но не пользуешся ей.
Здравствуйте, мыщъх, Вы писали:
М>выход за границы буфера это такой протокол общения кода с аллокатором
простреливание ноги это такой повод сходить к врачу
Это очень показательный пример. Показательный в том плане, что не стоит пренебрегать выразительной силой языка.
На самом деле можно было начать просто с изложения причин использования такого подхода. Такая каша же не просто так заварилась?
А если жизненную необходимость прыгать за границу массива для "общения" с аллокатором не удается внятно объяснить в письменной форме другим людям, то это явный повод не говнокодить.
То, что С обделен многими плюшками и сахарком других языков, вовсе не принуждает писать на нем нечитаемый код. Тут можно вспомнить про невидимые файлы с точкой в начале. Какому-то байтогрызику было лень написать пару функций типа Path_Is_FolderSelfAlias(), и он написал просто if(p[0] = '.'). Затем, заметив баг, он переписал if(p[0] == '.') и чувством выполненного долга пошел в бар. Суть не в том, что в результате получился лаконичный способ помечать файлы как скрытые, а том, что кто-то пренебрег ясным изложением смысла этого сравнения, которое на самом деле должно было определять, показывать файл или нет путем извлечения признака принадлежности к скрытым объектам, котором по случайности оказалась проверка первого байта на равенство с '.'. В данном случае ему повезло, но обычно такие фокусы кончаются плохо.
Так что по мне подобное срезание углов на ровном месте — просто признак лени и некомпетентности. Я вполне уверен, что и в данном случае можно было все четко запрограммировать и не доводить людей до инфаркта.
Еще интересно, как там различался ошибочный выход за границы массива от целенаправленного?
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, sourcerer, Вы писали:
ОК>>Ну что ты как маленький? Впервые увидел что ли плохой код? Ну так привыкай. Даже на этом форуме только единицы могут и писать нормальный код. S>Самое печальное не то, что код ужасен, а то, что его не позволяют поправить так, как нужно, (я уже думаю оставить (не удалять) эти г-классы, а написать новые, с собственными представлениями о прекрасном) — иначе попадет в протокол, а протоколы начальство почитывает, а оно само из бывших программистов (что вообще-то нехарактерно). Поэтому — "улыбаемся и машем".
Если код работает — зачем его править ? Ну страшный, ну и что ?
Здравствуйте, binnom, Вы писали:
B>Здравствуйте, Aртём, Вы писали:
B>>>А потому, что ты не хочешь получать больше. Точка. Это и есть причина. Всё остальное — это отмазы и производные. Aё>>Хочу. Просто я не вижу "больше" в этих компаниях мечты. B>Да ладно? И это с учетом того, что AUD плавает почти как рубль? Очередная отговорка.
Как-то незаметно снижения покупательской способности внутри страны. А поехать ну пусть на 150 в Калифорнии и купить там можно разве что курятник в мексиканском гетто в часе от непригодного для купания океана? Ну и зачем, я уж как нибудь с восточно-европейскими группировками на пляже проживу — 8 мес из 12 купальный сезон.
B>В отличии от многих других ты имеешь привелегию выбирать компанию или даже команду, но не пользуешся ей.
Сиэтл или Канада (я про Амазон)- и что там ловить? Мне вообще интересно много получать где сейчас живу.
Здравствуйте, sergey179, Вы писали:
S>Если код работает — зачем его править ? Ну страшный, ну и что ?
Требуется увеличить производительность. Про оптимизацию использования памяти я молчу — память нынче не ресурс, хотя поработать с dotMemory страсть как хочется
Здравствуйте, kaa.python, Вы писали:
KP>Здравствуйте, мыщъх, Вы писали:
М>>короче, чувак обдумал ситуацию и решил не рисковать здоровьем.
KP>Я правильно понимаю описываемую ситуацию: KP>ты нагенерил кучуговнокода за которую никто KP>браться не хочешь и теперь этим как флагом размахиваешь?
ситуация выглядит так. по пунктам.
1) я не девелопер и никогда им не был;
2) job description предполагал, что мой выход это writeup;
3) мой исследовательский код кто-то (не я) решил включить в продакшен;
4) я предупреждал, что не девелопер и за такой код убивать надо;
5) мне сказали расслабиться и дышать носом и что у большинства код еще хуже;
6) из компании ушли все носители тайных знаний, ну то есть абсолютно все, включая меня;
7) мой алгоритм секрета не представляет и мыщъх даже засабмитил патент с подробным описанием;
8) "переписать заново" (с) (тм) предлагали по меньшей мере три человека, включая меня и тим-лида;
9) ...а воз и ныне там... код работает и работает не только на x86, но и ARM, MIPS и так далее...;
"говнокод" (с) (тм) это или нет -- не суть важно. это исследовательский код, который в лучшем случае тянет на маект. вы к макету какие требования предъявляете? если кто-то решил, что качество кода достаточно для включения его в продакшен и если код, изначально написанный под x86 цент-ось (такие были требования) простой перекомпиляцией без изменений работает на x86-64, ARM, MIPS и т.д. и т.п. -- то какие проблемы?
мне религия рефракторить не позволяет. тем более, что код писался под одни требования, а вышло что под другие. и потому там много хаков и мощный осадочный пласт исторических насаждений. это как если вам сказали разработать спортивную машину чтобы порвать феррари, а под конец выяснилось что мы строим карьерный экскаватор. и если движок машины не только рвет феррари, но и копает от забора до обеда, то это хороший движок, который переходит из одного подразделения фирмы в другой.
у нас были одни требования к продакшену, в других отделах -- другие. их кто-то заставляет адоптировать исследовательский макет, который кстати моя первая (и последняя) программа, написанная мной в жизни, на которой я изучал основы программирования? и на момент написания мой рейт составлял $800/mo.
так что да, размахиваю кодом как флагом, ибо он работает и все еще в строю. "не хочет браться" -- партия сказала "нужно" и теперь или увольняться или рефракторить.
кстати, что вы имеете против того, чтобы аллокатор протаскивал свое API посредством размещения указателей на функции в начале выделенных блоков памяти? что вы имеете против того, что сигналом к перестройке внутренних структур аллкокатора служило обращение к памяти за пределами выделенного блока? получается естественная синхронизация действий в многопоточной среде.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
М>поручили одному чуваку рефракторить мой код. чувак посмотрел на это дело и подал на увольнение. серьезно. сказал, что его инфаркт хватить может. сердце не выдержит. он же ведь старенький. за пятьдесят. многое видел в своей жизни. но...
Короче было так
Мыщьха хотели уволить. Но решили не рубить с плеча, а сначала посмотреть, сможет ли его горы кода нормальный человек дальше поддерживать, или там чёрт ногу сломит. Попросили незаинтересованное лицо оценить код и может быть даже отрефакторить. Он сразу сослался на возраст. Начальство поняло, что дело плохо, и дешевле будет Мыщьха оставить в покое.
Здравствуйте, VTT, Вы писали:
VTT>Здравствуйте, мыщъх, Вы писали:
М>>выход за границы буфера это такой протокол общения кода с аллокатором VTT>
простреливание ноги это такой повод сходить к врачу
давайте так. в си нет [нормальной] поддержки массивов. malloc вообще возвращает не массив, а указатель. если это чужой malloc, то за массивом может быть пустота, обращение к которой поимеет непредсказуемые последствия. если же это наш malloc, то мы гарантируем, что за массивом то, что нужно. грубо говоря, возвращаем структуру. кстати, в этой структуре явно прописан размер.
это _сильно_ все упрощает. теперь не нужно передавать функциям указатель на данные и размер данных. скажу больше. если у нас есть функция поиска подстроки в строке и эта строка лежит где-то в середине большого блока данных, то мы передаем указатель на начало данных. да! на начало данных. там есть структура в которой размер данных и индекс строки.
проблема переполняющихся буферов решается сама собой, т.к. любая функция на любом уровне вложенности может проверить что она не выходит за границы буфера, ибо имеет в своем распоряжении всю необходимую инфу. типа if (scb->idx > scb->len) return -1; какие у вас возражения против кастомного аллокатора?
VTT>На самом деле можно было начать просто с изложения причин использования такого подхода. Такая каша же не просто так заварилась?
угу. там были свои причины. сначала появился api и был задокументирован, а затем его потребовалось расширить без изменения инклудов и прочей бодяги.
VTT> А если жизненную необходимость прыгать за границу массива для "общения" с аллокатором VTT> не удается внятно объяснить в письменной форме другим людям, то это явный повод не говнокодить.
это был исследовательский код и объяснений не требовалось. на самом деле даже обычный malloc зачастую возвращает структуру типа: [служебные данные][буфер данных], вот только указатель не на начало служебных данных, а на буфер. это, разумеется, недокументированно. но если мы сами пишем аллокатор и сами же пишем остальной код, то мы точно знаем что там за служебные данные и они у нас в распоряжении.
на самом деле у нас есть паблик инклуд для аллокатора с malloc и free и приватный инклуд, где описаны внутренние структуры данных. чтобы не включать приватный инклуд в остальной код там хитрый ход котом. там метапрограммирование. там программа читает приватный инклуд и генерирует остальной код на си, где смещения захардкорены, но этот код генерируется автоматом и перегенерируется при изменении служебных структур. генератор — в билд системе, т.е. за пределами программы. но все работает и работает абсолютно корректно на любой платформе.
на самом деле ошибка не у меня, ошибкой были многочисленные попытки рефракторить код, сгенерированный автоматом. он выглядит ужасно, да. но он работает. и он, кстати, делает оптимизацию на графах и этому оптимизатору доступны данные недоступные компилятору и потому оптимизация таки рулит.
VTT>То, что С обделен многими плюшками и сахарком других языков, вовсе не принуждает писать на нем нечитаемый код.
согласен. но проблема гораздо глубже. и проблема тут не в си. тут проблема в ореентации (не сексуальной).
VTT> Затем, заметив баг, он переписал if(p[0] == '.') и чувством выполненного долга пошел в бар.
...пошел празновать увольнение? а если там ../foo/././../../bar/foo/baz/../././ -- это алисас или нет? пикантая подробность -- bar это хардлик на baz. так что на уровне разбора строки эта проблема не разрешима вообще. и даже если вас устраивает частичное решение, то это очень сложный код и в этом коде у ms было аж три ошибки переполнения буфера. потому что писали на си. потому что сложно на самом деле это.
> а том, что кто-то пренебрег ясным изложением смысла этого сравнения, > которое на самом деле должно было определять, показывать файл или нет
у ms в этом месте был код, который допускал передачу управления на хакерский шелл-код, засунутый в этом самый путь и ms исправила ошибку только с третьей попытки. сначала ошибку исправили только для "/", на второй итерации для "\\". наконец, исправили ситуацию в которой хакер использовал "\\" и "/" в _одном_ пути.
> В данном случае ему повезло, но обычно такие фокусы кончаются плохо.
угу. у ms все было хуже и там была дыра, которую хрен исправить.
VTT> Так что по мне подобное срезание углов на ровном месте — просто признак лени и некомпетентности.
в вашем примере -- не срезание углов, а просто некомпетентность, т.к. если немного подумать, то становится ясно, что тут нужна функция на 100500 строк, которая все равно не будет работать, т.к. на ANSI C ее написать невозможно в принципе.
в моем случае -- не было никакого "срезания углов". там был автоматически генеририруемый код, который править нельзя. вернее, можно, но бессмысленно. если уж приспичило, то править код генератора.
признаю, что дизайн был ужасным. но именно совершая ошибки и наступая на грабли мы понимаем как нужно писать программы и чем хороший код от плохого отличается. но с учетом что я не девелопер и никогда им не был и что в job description от меня требовали выполнение исследований с последующим изложением мыслей на БУМАГЕ, то... этоо сильно другая ситуация, не?
мой поинт в том, что исследовательский код на уровне прототипа, будучи полигоном для обкатки различных идей, нужно писать с нуля. даже не переписывать, а именно дизайнить с нуля. если вам говорят построить самый быстрый в мире автомобиль, то вы еще не знаете каким он будет. электромобиль? или присобачить реактивный двигатель от самолета? будут там колеса или монорельс? хз. нужно пробовать и то, и другое. наконец, оно таки работает. теперь можно работать над дизайном конструкции с учетом наработок в этой области.
срезание углов имело место быть на вышестоящем уровне, когда руководство посмотрело на мой макет и сказало: качество кода выше среднего по рынку и потому включаем его в продакшен как есть. а через лет пять или шесть код решили отрефракторить, когда ни меня, ни того кто принял решение о его включении в продакшен уже не было. кстати, это вторая ошибка. "работает -- не трожь". ну или трожь, только переписывай заново, благо алгос уже запатетован и в патенте все подробно изложено как оно устроено.
реально, дешевле написать с нуля с учетом новых требований чем задрачивать воду в ступе. я категорически против рефракторинга. когда мужикам делать нечего они яйца чешут. то есть рефракторят. что дает рефракторинг? зачем он? пишите сразу правильно. или переписывайте. а рефракторить это имитировать бурную деятельность ничего не делая по существу.
> Я вполне уверен, что и в данном случае можно было все четко запрограммировать и не доводить людей до инфаркта.
можно, конечно. но можно было и не пытаться это рефракторить. давайте так: если код плохой и неправильный, причем не на уровне наименования отдельных переменных, а на уровне дизайна, то этот код или не включать в продакшен или включать, но мириться с тем, что рефракторить его нужно с носителями знаний. попытка рефракторить код с плохим дизайном без носителей знаний... особенно, поручая это людям со слабым сердцем... это уже садизм в особо обостренной форме.
VTT> Еще интересно, как там различался ошибочный выход за границы массива от целенаправленного?
различается очень просто. дизайн специально разработан так, чтобы исключить ошибочный выход за границы массива. за это отвечает часть кода на си, которая генерирует другую часть кода на си и если там ошибка, то она на стадии работы билд-системы.
невозможность выхода за границы массива обеспечивается как раз за счет того, что я прикрутил к си полноценную поддержку массивов, а не просто указателей на безразмрную память. "прикрутил" за счет метапрограммирования. и это сработало. после чего о выходе за границы было можно не парится. более того, исчезли проверки выхода за границы в рантайме и они были перенесены на стадию трансляции. разумеется не стадию трансляции си, т.к. си не располагает подобной инфой.
тут, конечно, можно поспорить насколько оправданы подобные выходки. но! я тупо учился программировать. это был лабораторный исследовательский код. однако, каким-то чудом он работал и работал без нареканий.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, uncommon, Вы писали:
U>Здравствуйте, мыщъх, Вы писали:
М>>поручили одному чуваку рефракторить мой код. чувак посмотрел на это дело и подал на увольнение. серьезно. сказал, что его инфаркт хватить может. сердце не выдержит. он же ведь старенький. за пятьдесят. многое видел в своей жизни. но...
U>Короче было так U>Мыщьха хотели уволить.
если бы хотели, то уволили бы. в феврале предложили релоцироваться в штаб квартиру в калифорнии. я отказался. в августе сказали ходить отдыхать. а через три года начали рефракторить код. так что все было не так.
> Но решили не рубить с плеча, а сначала посмотреть, сможет ли его > горы кода нормальный человек дальше поддерживать, или там чёрт ногу сломит.
мыщъх не девелопер и никогда им не был. у меня совсем другое пердназначение.
> Попросили незаинтересованное лицо оценить код и может быть даже отрефакторить.
не попросили, а приказали. это скорее его хотели уволить, но решили рубить не с плеча, а дать мыщъхиный код чтобы человек сам ушел. и это сработало. человек сослался на проблемы с сердцем.
> Начальство поняло, что дело плохо, и дешевле будет Мыщьха оставить в покое.
а толку? у нас был тим но за короткое время все решили свалить и свалили. остался только мыщъх. поддерживать весь проект мыщъх не мог ибо не программист. но тупо уволить мыщъха было бы оскорблением. предложили релоцироваться в калифорнию в другой тим. мыщъх отказался. и компания, проявив уважение, держала меня как балласт еще пол-года, а потом освободила от занимаемой должности со всеми почестями и офигенным выходным пособием. так что претензий к коду не было никаких. собственно говоря, на верху и не ведали, что лабораторный код попал в продакшен со всеми вытекающими отсюда послдствиями.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, sourcerer, Вы писали:
S>Здравствуйте, sergey179, Вы писали:
S>>Если код работает — зачем его править ? Ну страшный, ну и что ? S>Требуется увеличить производительность. Про оптимизацию использования памяти я молчу — память нынче не ресурс, хотя поработать с dotMemory страсть как хочется
Ну вначале надо профайлерами пройтись. Встречал достаточно хороший код, который отлично тормозил. И наоборот.
В общем, перфоманс крайне опосредовано связан с чистотой кода.
Здравствуйте, Олег К., Вы писали: __>>сейчас я, например, работаю над очень крутой вещью и получаю столько, чтобы спокойно отклонять письма от рекрутеров компаний, в которых многие мечтают просто хотя бы прособеседоваться, хотя конечно же есть какие-то минусы, но мой накопленный опыт дает мне знания как можно не заниматься переделыванием компании под себя, а просто получать удовольствие ОК>Ты хоть работал на каком-нибудь месте более полутора лет?
да, должен признаться, вообще я сисадмин в комьютерном клубе Усть-Ольгинска. до этого в колбасном цехе работал и сторожем в детсаду. хочу перейти на 1С на местный завод. Мечтаю попасть на собеседование в горводоканал. У меня там дядя работает. Вот, просто кидаю вам лапшу на уши, пишу всякий бред, чтобы примазаться к великим программистам, которые страшно подумать какие сложные программы программируют и какими денжищщами ворочают.
я извиняюсь, не всегда получается так удачно из себя успешного программиста строить, что поделать, опыта мало.