Работаю я сейчас как консалтер на одной Успешной Фирме (ТМ). Из-за политики формы, пишущей свой софт руками ПОТУсторонних разработчиков (не в индустрии, Слава Яйцам!), авторов всего того, с чем приходится работать, днем с огнем не отыскать (чтобы дать волшебного пенделя) — на самой фирме сидят лишь саппортеры и кастомайзеры, т.е. документация пользователя для всего, что написано — очень подробная, но это не спасает от спагеттиобразного г-кода (или я даже тот ужас не знаю как назвать). Так вот, попался мне на глаза не виденный прежде класс, начал я его смотреть и обнаружил следующее (вы не поверите! ). Началось все с мелочей, как то: интерфейсы названы как попало, а классы реализующие эти интерфейсы, начинаются с буковки "I" (т.е. перепутаны правила, но это конечно фигня, хотя звоночек — если отдел QA положил болт на этот кусок софта и давно, то это о чем-то должно говорить. И то, что в продуктивную версию пошли результаты освоения разработчиками концепции интерфейсов — тоже о чем-то говорит, ну это тоже ладно — там до меня на шарпе плюсеры кодили — чего с них взять? Эти страдальцы даже специальную иерархию Read-Only -классов написали, и нет же, чтобы доку прежде покурить — в Шарпе такая иерархия единственной командой в коллекции создается (3 раза ха!)). Вишенкой на торте является метод занимающий больше 3 тысяч строк и трижды в if'ах вызывающий сам себя с различными параметрами — превед хвостовая рекурсия!
Внутри себя метод использует шесть переменных-флагов — у меня ум за разум заходил, когда я пытался осознать их функциональность. Требуется (sic!) "существенно увеличить производительность системы" — ну вы понEли... Слово "рефакторинг" — запрещено! Xa-xa-xa! Да, на фирме все экстерны активно друг другу рассказывают про внедрение практик SOLID и непрерывной интеграции (Continuous Integration), даже сервер под это дело уже купили, прости Господи! 3аберите меня отсюда, пожалста!
Здравствуйте, MTD, Вы писали:
MTD>Здравствуйте, sourcerer, Вы писали:
S>>3аберите меня отсюда, пожалста!
MTD>К чему это нытье? Уволься, рабство вроде как давно отменили.
Они платили неприлично много, этож мемуар.
Здравствуйте, sourcerer, Вы писали: MTD>>К чему это нытье? Уволься, рабство вроде как давно отменили. S>Они платили неприлично много, этож мемуар.
тогда просто сидите, ничего не делайте пока не уволят
нечего Дилберта из себя строить. каждый программист занимает ровно то место, которого заслуживает
Здравствуйте, __kot2, Вы писали:
S>>Они платили неприлично много, этож мемуар. __>тогда просто сидите, ничего не делайте пока не уволят
Как не отупеть не потерять ценность на рынке труда- пилить правильные проекты по ночам?
__>нечего Дилберта из себя строить. каждый программист занимает ровно то место, которого заслуживает
Тоесть лучше интересные проекты tm и доширак? Или спагетти-код и икра с маслом?
Здравствуйте, Aртём, Вы писали: S>>>Они платили неприлично много, этож мемуар. __>>тогда просто сидите, ничего не делайте пока не уволят Aё>Как не отупеть не потерять ценность на рынке труда- пилить правильные проекты по ночам?
__>>нечего Дилберта из себя строить. каждый программист занимает ровно то место, которого заслуживает Aё>Тоесть лучше интересные проекты tm и доширак? Или спагетти-код и икра с маслом?
американцы набамперах машин любят лепить наклейки (что по-моему достаточно тупая идея). так вот одна из которых мне нравится — "все в твоей жизни вело тебя именно к этому моменту" — в смысле когда ты будешь стоять и пялиться на эту вот наклейку
я тоже работал над интересными проектами задешево. но я знал, что это лучшее, что я могу найти. просто временно, пока у меня недостточно опыта, я могу найти только дешевые проекты, дорогие мной не интересуются. пока. нужно продолжать искать. я знал, что компании не станут платить мне много, сколько бы я не убеждал их в обратном. но работать было приятно.
я работал в компаниях, где хорошо платят, но проекты и сотрудники такие, что стали нарицательными. я тоже знал, что это лучшее, что я могу найти, поскольку моего опыта недостаточно для того, чтобы поручить мне что-то интересное и при этом дорогое. я просто потратил время в этой компании на отдых, изучение чего-то нового, с чем я никогда не сталкивался и на хождение по собеседованиям. я знал, что компании не изменится, поскольку башка утам полностью сгнила и сколько ты ни старайся, компания делала, делает и будет делать чистейшее гавно.
сейчас я, например, работаю над очень крутой вещью и получаю столько, чтобы спокойно отклонять письма от рекрутеров компаний, в которых многие мечтают просто хотя бы прособеседоваться, хотя конечно же есть какие-то минусы, но мой накопленный опыт дает мне знания как можно не заниматься переделыванием компании под себя, а просто получать удовольствие
Здравствуйте, sergey179, Вы писали:
S>Здравствуйте, sourcerer, Вы писали:
S>Вас плюсисты обидели ?
Я сам 6 лет на плюсах писал, (сразу после первого университета: с 1998 по 2004). Но когда люди не понимают (и не хотят понимать!) что любой ЯП имеет свои особенности и пытаются их игнорировать, ведя разработку в манере любимого ЯП, то это, как минимум, странно. Почему-то это ярко проявлялось именно у адептов С++, ну вот такой у меня опыт — я вовсе не настаиваю, что это правило.
Здравствуйте, sourcerer, Вы писали:
S>Почему-то это ярко проявлялось именно у адептов С++, ну вот такой у меня опыт — я вовсе не настаиваю, что это правило.
Напомнило "Некоторые личности на любом ЯП способны написать программу на фортране" (С)
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, __kot2, Вы писали:
__>сейчас я, например, работаю над очень крутой вещью и получаю столько, чтобы спокойно отклонять письма от рекрутеров компаний, в которых многие мечтают просто хотя бы прособеседоваться
Такие письма, конечно же, щекочут ЧСВ. Ты по приколу сделай пометку в резюме — New H-1B sponsorship required, и сразу все станет понятно.
Здравствуйте, binnom, Вы писали:
__>>сейчас я, например, работаю над очень крутой вещью и получаю столько, чтобы спокойно отклонять письма от рекрутеров компаний, в которых многие мечтают просто хотя бы прособеседоваться B>Такие письма, конечно же, щекочут ЧСВ. Ты по приколу сделай пометку в резюме — New H-1B sponsorship required, и сразу все станет понятно.
Вот тоже отклоняю такие письма. Не потому, что не хочу больше получать- а потому, что рассылка писем по площадям имеет целью сбор резюме рекрутером, эмуляцию бурной деятельности, и т.п. вещи, весьма далёкие от предложения работы.
Здравствуйте, binnom, Вы писали: __>>сейчас я, например, работаю над очень крутой вещью и получаю столько, чтобы спокойно отклонять письма от рекрутеров компаний, в которых многие мечтают просто хотя бы прособеседоваться B>Такие письма, конечно же, щекочут ЧСВ. Ты по приколу сделай пометку в резюме — New H-1B sponsorship required, и сразу все станет понятно.
мне это не надо
в смысле, насколько сильно захотят в этом случае компании собеседовать? наверное, меньше. однако все они спонсируют h1b
B>Такие письма, конечно же, щекочут ЧСВ. Ты по приколу сделай пометку в резюме — New H-1B sponsorship required, и сразу все станет понятно.
если человек уже находится внутри США на h-1b, то последующие h-1b делаются очень легко, быстро и дешево.
Большинство нормальных компаний, даже стартапы легко идут на это.
Сложно сделать первый шаг, когда ты еще за пределами США.
Здравствуйте, sourcerer, Вы писали:
S>>Вас плюсисты обидели ? S>Я сам 6 лет на плюсах писал, (сразу после первого университета: с 1998 по 2004). Но когда люди не понимают (и не хотят понимать!) что любой ЯП имеет свои особенности и пытаются их игнорировать, ведя разработку в манере любимого ЯП, то это, как минимум, странно. Почему-то это ярко проявлялось именно у адептов С++, ну вот такой у меня опыт — я вовсе не настаиваю, что это правило.
Не думаю, что выборка репрезентативна. Первые поколения шарпистов имели в основном С++ прошлое (ну еще дельфисты были).
В любом случае, главное требование к программе — чтоб она решала поставленную задачу приемлым образом. Вот если не решает, то можно и рефакторинг делать.
Здравствуйте, __kot2, Вы писали:
B>>Такие письма, конечно же, щекочут ЧСВ. Ты по приколу сделай пометку в резюме — New H-1B sponsorship required, и сразу все станет понятно. __>мне это не надо
Бинго!
__>в смысле, насколько сильно захотят в этом случае компании собеседовать? наверное, меньше.
Наверное не меньше, наверное около нуля +- стат погрешность.
Здравствуйте, Aртём, Вы писали:
__>>>сейчас я, например, работаю над очень крутой вещью и получаю столько, чтобы спокойно отклонять письма от рекрутеров компаний, в которых многие мечтают просто хотя бы прособеседоваться B>>Такие письма, конечно же, щекочут ЧСВ. Ты по приколу сделай пометку в резюме — New H-1B sponsorship required, и сразу все станет понятно. Aё>Вот тоже отклоняю такие письма. Не потому, что не хочу больше получать- а потому,
А потому, что ты не хочешь получать больше. Точка. Это и есть причина. Всё остальное — это отмазы и производные.
Здравствуйте, binnom, Вы писали: B>>>Такие письма, конечно же, щекочут ЧСВ. Ты по приколу сделай пометку в резюме — New H-1B sponsorship required, и сразу все станет понятно. __>>мне это не надо B>Бинго!
ну, в России тоже есть какой-то выбор. наверное. я особо не в теме. я таких компаний, чтобы проекты интересные и не возникало желания свалить просто из-за низкой з.п. не видел, но, не знаю, может, уже появились.
с другой стороны с точки зрения поехать поработать заграницей программисты — не медики, что-то не нравится — вообще не вижу смысла сидеть ждать у моря погоды. и не Америкой одной все ограничивается. если человек настойчиво сидит в России, то значит, ему там просто нравится. а если ему нравится, то грех жаловаться, соотв-но на что-то.
__>сейчас я, например, работаю над очень крутой вещью и получаю столько, чтобы спокойно отклонять письма от рекрутеров компаний, в которых многие мечтают просто хотя бы прособеседоваться, хотя конечно же есть какие-то минусы, но мой накопленный опыт дает мне знания как можно не заниматься переделыванием компании под себя, а просто получать удовольствие
Ты хоть работал на каком-нибудь месте более полутора лет?
Здравствуйте, __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С на местный завод. Мечтаю попасть на собеседование в горводоканал. У меня там дядя работает. Вот, просто кидаю вам лапшу на уши, пишу всякий бред, чтобы примазаться к великим программистам, которые страшно подумать какие сложные программы программируют и какими денжищщами ворочают.
я извиняюсь, не всегда получается так удачно из себя успешного программиста строить, что поделать, опыта мало.
S>>Встречал достаточно хороший код, который отлично тормозил.
Aё>Если не удовлетворяет требованиям по производительности- это плохой код.
А для бизнеса и нету таких требований по большему счету. Зато есть куча программахеров которые считают что производительность это все. Отсюда и битовые двиги справа вместо деления на двойку (в плюсах), метапрограммирование и еще куча подобной хрени.
Здравствуйте, __kot2, Вы писали:
__>сейчас я, например, работаю над очень крутой вещью и получаю столько, чтобы спокойно отклонять письма от рекрутеров компаний, в которых многие мечтают просто хотя бы прособеседоваться, хотя конечно же есть какие-то минусы, но мой накопленный опыт дает мне знания как можно не заниматься переделыванием компании под себя, а просто получать удовольствие
Корелляция здесь такая: чем чаще ты меняешь работу, тем она выше. Но, с другой стороны, проектом нужно заниматься какое-то н-ое время чтобы видеть все косяки и недоработки. И это не только написание кода, это и поддержка и работа с юзерами.
Резюме: хочешь расти по зарплате, чаще меняй работу (что, однако, не добавляет экспириенса как программисту).
Здравствуйте, Олег К., Вы писали:
Aё>>Если не удовлетворяет требованиям по производительности- это плохой код.
ОК>А для бизнеса и нету таких требований по большему счету. Зато есть куча программахеров которые считают что производительность это все. Отсюда и битовые двиги справа вместо деления на двойку (в плюсах), метапрограммирование и еще куча подобной хрени.
Если отбрость сантименты в сторону- хорошего программиста от плохого отличает способность писать элегантный и оптимальный код. Чем больше логики не помещается в кэш процессора и больше тактов тратится на оверхед (в том числе из-за неправильно выбранного алгоритма)- тем дольше бизнес пьёт чай.
Здравствуйте, Aртём, Вы писали: Aё>Если отбрость сантименты в сторону- хорошего программиста от плохого отличает способность писать элегантный и оптимальный код. Чем больше логики не помещается в кэш процессора и больше тактов тратится на оверхед (в том числе из-за неправильно выбранного алгоритма)- тем дольше бизнес пьёт чай.
берешь код иногда какой-то опенсорсный, например. тестируешь — падает. бывает. например, x264 кодек иногда кадры битые дает. ты задаешь себе вопрос — мы сможем решать проблемы по мере поступления или вставить его в продакшен? открываешь код, смотришь. ну конкретно x264, насколько я помню, неплох.
а если это например OpenSSL, Miranda, или мыщъхвский аналайзер, как он его тут описал, то вывод — нет, мы не будем это использовать в продакшене. качество не то.
Aё>Если отбрость сантименты в сторону- хорошего программиста от плохого отличает способность писать элегантный и оптимальный код. Чем больше логики не помещается в кэш процессора и больше тактов тратится на оверхед (в том числе из-за неправильно выбранного алгоритма)- тем дольше бизнес пьёт чай.
А прикинь, можно вообще запихать весь код в мэйн() и тогда вообще не будет никакого оверхеда связанного с вызовом функций. Но это я так, утрирую. Посыл тут был другой. Во всем нужна золотая середина, если ты понимаешь о чем я.
Ну и в реальной жизни я больше как-то наблюдаю что бизнес страдает из-за нашего собрата а не пьет чай.
Здравствуйте, мыщъх, Вы писали:
М> что вы имеете против того, что сигналом к перестройке внутренних структур аллкокатора служило обращение к памяти за пределами выделенного блока?
Где гарантия того факта, что обращение к памяти за пределами выделенного блока — это преднамеренное действие программиста, а не случайный прострел по памяти?
Здравствуйте, мыщъх, Вы писали:
М>давайте так. в си нет [нормальной] поддержки массивов. malloc вообще возвращает не массив, а указатель. если это чужой malloc, то за массивом может быть пустота, обращение к которой поимеет непредсказуемые последствия. если же это наш malloc, то мы гарантируем, что за массивом то, что нужно. грубо говоря, возвращаем структуру. кстати, в этой структуре явно прописан размер. М>это _сильно_ все упрощает. теперь не нужно передавать функциям указатель на данные и размер данных. скажу больше. если у нас есть функция поиска подстроки в строке и эта строка лежит где-то в середине большого блока данных, то мы передаем указатель на начало данных. да! на начало данных. там есть структура в которой размер данных и индекс строки. М>проблема переполняющихся буферов решается сама собой, т.к. любая функция на любом уровне вложенности может проверить что она не выходит за границы буфера, ибо имеет в своем распоряжении всю необходимую инфу. типа if (scb->idx > scb->len) return -1; какие у вас возражения против кастомного аллокатора?
Мне это дело представлялось не таким заурядным, я полагал, что все обращения к памяти за границами выделенного для функции буфера каким-то хитрым прерыванием автоматически докладывались менеджеру памяти. А описанное вами больше подходит на аллокатор с дополнительным address sanitaizer, доступным (или даже принудительно используемым) для обычных функций. Пусть даже и в виде некого мета надмножества "С с аллокатором и массивами", которое генерировало абсолютно корректно работающий на всех платформах код на С (сильное утверждение), да еще и с дополнительными оптимизациями.
То, что бизнес-дяди вечно торопят с релизами и вообще всячески мешают программировать, — не новость. Обычно они очень не любят выделять людей и время на всякий рефакторинг. Видать в данном случае где-то стало совсем худо, раз они стали так бросать людей на амбразуру, не так ли?
М>реально, дешевле написать с нуля с учетом новых требований чем задрачивать воду в ступе. я категорически против рефракторинга. когда мужикам делать нечего они яйца чешут. то есть рефракторят. что дает рефракторинг? зачем он? пишите сразу правильно. или переписывайте. а рефракторить это имитировать бурную деятельность ничего не делая по существу.
Откуда такая ненависть к рефакторингу? "пишите сразу правильно" — это что за ересь такая? Никто же с сходу не набирает весь код из головы, а сначала делают какие-то минимальные реализации методов, а потом дописывают, как-то упорядочивают абстракции. А это не что иное, как рефакторинг. Расстановка пробелов — это тоже вполне себе рефакторинг, хоть и поверхностный, однако он вытекает из-за отсутствия нормальных средств (и соглашений) форматирования. Плюс тут есть такая вещь, как синдром свежего взгляда. Даже просто беглый просмотр написанного пару месяцев назад кода может запросто привести к цепочке удивительных открытий.
А вот обеспечение возможности вносить изменения и доработки в соответствии с меняющимися требованиями — так это вообще первое дело. Когда этот процесс идет с умеренной скоростью, то количество необходимых изменений должно быть минимальным. Но даже когда shit happens, и требования вообще меняются на противоположные (или просто формулируются в неожиданно четкой форме), бывает вполне возможно переиспользовать уже имеющиеся наработки.
Что касается скрытия файлов, так там вроде как была задача просто исключать "." и ".." из листинга содержимого директорий. Достаточно тривиально, не правда ли?
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, мыщъх, Вы писали:
М>реально, дешевле написать с нуля с учетом новых требований чем задрачивать воду в ступе. я категорически против рефракторинга. когда мужикам делать нечего они яйца чешут. то есть рефракторят. что дает рефракторинг? зачем он? пишите сразу правильно. или переписывайте. а рефракторить это имитировать бурную деятельность ничего не делая по существу.
Сразу видно, что ты не программист (что ты и сам в общем-то уже сказал). Рефакторинг тебе не понятен, и ты сделал вывод, что он не нужен. Это типичное проявления эффекта Даннинга — Крюгера.
Здравствуйте, uncommon, Вы писали:
U>Здравствуйте, мыщъх, Вы писали:
U> Сразу видно, что ты не программист (что ты и сам в общем-то уже сказал). U> Рефакторинг тебе не понятен, и ты сделал вывод, что он не нужен.
не хочу писать большой пост, объясняющий элементарные вещи. меня окружают два типа программистов. первый (намного более многочисленный, "новая школа", поколение Z по пелевину). их девиз: "тут не думать, тут кодить надо". второй (старая школа) может три месяца ходить вокруг компьютера и не написать ни строчки, рисуя закорючки в рабочем журнале и вынашивая дизайн в голове.
второй тип не нуждается в рефракторинге. второй тип зачастую старше, чем индустрия программирования (старички по восемьдесят лет мне встречаются). многие пришли в программирование из инженерных областей. разрабатывали авионику или автомобили. или просто сан-узлы. посмотрел бы я на вас как вы будете сан-узел рефракторить, не говоря уже об автомобилях.
кроме того, если какой-то узел (или модуль программы) хочется отрефракторить, то, возможно, подумав еще немного, его можно выкинуть и заменить другим -- с бизнес-фичами на борту. ну то есть совсем другим. скажем, у вас мультипоиск реализован через ахо-корась а вы предлагаете рабин-карпа. или вообще генерацию DFA дерева. или тут выходит швейцарский нож яры и вы понимаете, что он одним махом заменяет у вас кучу узлов.
все манагеры к рефракторингу относятся в лучшем случае как к неизбежному злу. в худшем -- отказываются понимать зачем переписывать то, что работает и за что вам платили зарплату и премию если теперь вы доказываете, что это нужно рефракторить. если уж рефракторить, то не просто чесать яйца, разгревая говны, а переписывать модули, создавая business value. манагеры это одобряют. потому что появляются новые фичи или улучшается производительность. причем, производительнось может улучшаться и за счет применения алгоритмов жадных до памяти, которые раньше реализовать не было возможности, т.к. тупо не было столько памяти у клиентов...
> Это типичное проявления эффекта Даннинга — Крюгера.
нет, это не типичное проявление. если я не программист, то это значит только одно: в job description у меня не значится написания продакшен кода. однако, я близко знаком и с теми, кто пишет такой код, и с теми, кто контролирует его написание и когда я говорю "рефракторинг не нужен", то это не мой вывод. это авторитетное мнение тех, кто руководит программистами (включая и самих программистов старой школы).
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.
Здравствуйте, мыщъх, Вы писали:
М>что дает рефракторинг? зачем он? пишите сразу правильно.
С "пишите сразу правильно" есть пара проблем Первая думаю почти всем известна и понятна: то что сегодня показалось правильным, завтра может не вписываться в новую или изменившуюся ситуацию/требования. Второе — зачастую чтобы написать "сразу правильно" нужно реально очень много продумывать — получается такой перфикционистский подход, и он конечно с одной стороны неплох, но бизнесу может быть невыгодно и просто не нужно чтобы код был весь такой сразу правильный, потому что на такой код может тратиться в разы больше времени. Ну и особенно обидно будет, когда вы вот так, чтобы написать сразу правильно, "3 месяца думали с ручкой в руках, не написав ни одной строчки кода" (как вы пишете о "старичках" в следующем посте), а потом бац и какое-то непредвиденное изменение ситуации.
Здравствуйте, мыщъх, Вы писали:
М>не хочу писать большой пост, объясняющий элементарные вещи. меня окружают два типа программистов. первый (намного более многочисленный, "новая школа", поколение Z по пелевину). их девиз: "тут не думать, тут кодить надо". второй (старая школа) может три месяца ходить вокруг компьютера и не написать ни строчки, рисуя закорючки в рабочем журнале и вынашивая дизайн в голове.
По-моему оба типа — крайность. Должен быть баланс. Думать и стараться сразу написать хорошо конечно нужно, но время на обдумывание должно быть вменяемым, а не так что можно за час придумать нормальное решение, но мы будем думать неделю чтобы написать сразу идеально и правильно. Я сейчас начинаю приходить к тому, что код должен быть гибким, как глина, и при выборе решения нужно задавать себе вопрос: если вдруг решение окажется не самым эффективным — насколько легко или сложно будет его потом переделать? Какие в данном случае будут последствия не самого оптимального решения или кода? Если исправить будет сложно — ок, надо хорошенько подумать. А если легко — не нужно убивать кучу времени, нужно просто взять и написать, а потом если что отрефакторить или переписать — это нормально.
Да и вообще, по-моему на практике (об этом кажется еще Брукс писал) на серьезных проектах редко бывает что сразу взяли и написали правильно, нужно закладывать определенную гибкость и быть готовым, что много придется переписывать или рефакторить.
Здравствуйте, мыщъх, Вы писали:
М>(старая школа) может три месяца ходить вокруг компьютера и не написать ни строчки, рисуя закорючки в рабочем журнале и вынашивая дизайн в голове.
Требования у манагера меняются каждую неделю, причём часто на противоположные. Нужно или вынашивать нетленку со скоростью света, или адаптироваться к жизненным условиям, и писать простой и расширяемый код, т.е. такой, где можно, не задумываясь, заменить один модуль на другой, а не переписываться вообще всё с нуля.