Это копия, сохраненная 28 сентября в 07:34.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Я тут сел на геймдев после разработки сайтов и надрочился на c#. Как же на нем сука легче делать операций, насколько он лаконичный, насколько строг, но при этом не сложный, как c++. Хуле все пиздят, что Джаваскрипт проше?? Джаваскрипт полное дерьмо сука, как же меня заебало плясать с динамичной типизацией вонючей нахуй, а также {} и ; с (), которые в отличий от c# ставятся куда угодно, абсолютный хаос нахуй. Ненавижу джаваскрипт
Он едийнственный в мире язык который используется буквально везде - от разработок сайтов, программ под виндовс, игр, драйверов бэкенда, везде сука и везде под ним огромный рынок
Это один из самых быстрых языков, особенно сли сравнивать с питоном
>как же меня заебало плясать с динамичной типизацией вонючей нахуй
Про typescript слышал что-нибудь?
Лол, так не сравнивай с питоном. Сравни с гулангом, например. C# реально хорош, но гуланг круче, т.к. современней. Хотя на гуланге ты работу никогда не найдешь
Typescript не дает статической типизации, скорее имитацию, или как говорят type assertion
Ахахахахахах
А разве в жабе нет асинк/эвейт? Сами же языки похожи настолько, что временами беру решение на жабе, копипаст в студию и чутка синтаксис поправить.
Проход в жабодебила всего на 11 посте. Сегодня без премии.
https://2ch.hk/pr/res/2973076.html (М)
Розжиг со стороны конкурирующих платформ прошу репортить
>Просто когда пробовал JS и Python, там конечно побыстрее развернуть прототип например веб приложухи.
Это уровень сравнения "язык Х лучше потому что хеллоу ворлд можно на 10 символов короче написать"
>Просто когда пробовал JS и Python, там конечно побыстрее развернуть прототип например веб приложухи.
Ты смеешься? Один npm install у тебя больше времени займет чем VS поставить, это не говоря уже про еблю с пакетами версиями ноды и т.д.
Что лучше: Vosk, Picovoice, MS.Speech, System.Speech? Из требований возможность работы полностью офлайн и возможность бескостыльной работы вне Windows. Пока лидирует Vosk т.к. Picovoice требует акк хотя бы для первоначальной настройки, с MS.Speech и System.Speech непонятно как это будет работать вне Windows, в частности неясно как языковые пакеты ставить вне винды т.к. на сайте Майкрософт я вижу только MSI
Скорее я пришел узнавать у анонов с какими косяками они сталкивались при работе с этими пакетами. Если System.Speech может оффлайн работать на Linux, то ест-но я выберу его
База...
блазОр-хуязор
Хуёво, что при всех MS заявлениях об опенсорсе единственный официальный дебаггер для дотнета - проприетарщина, которая работает только в студии и вскоде.
Дык уже есть
https://github.com/Samsung/netcoredbg
Только я слишком даун чтобы прикрутить его к вскоду
Ээээхххх, объяснил бы кто на пальцах...
>>3097629
Да, там ещё и какая-то тупая лицензия к оф расширению паровозом идёт
Но у майкрософтов лучший в истории человечества дебагер. В 90-х он лучий был у Борланда.
900x720, 0:09
>>3097820
>у майкрософтов лучший в истории человечества дебагер. В 90-х он лучий был у Борланда
> для комфортной разработки нужно ставить этого бегемота VS
Да, это так, или надо запоминать ебучие консольные команды. Райдер мне не нравится, потому его анализатор на монолитах в килотонны строк срет ошибками, которые исчезают после рестарта со сбросом кеша но появляются в других местах. При том, что все билдится и работает
Студия с решарпером даёт лучший DX, но медленнее даже райдера.
Сейчас на шарпах меньше пишу, кажется, что все идёт к тому, что везде будет VS Code, которой хватает для базовых рефакторингов типа ренейма, а для всего остального есть копайлот. Потом ещё энтерпрайз допилят, который будет обучаться на репозитории, подсказки будут ещё полезнее
>c# самый лучший язык программирования в мире
Только если ты не живешь в РФ. В эРэФии потихоньку выпиливают всех этих вендоров и майкрософт в первую очередь. Вообще С# - это идеальный вариант для работы в США.
>В эРэФии потихоньку выпиливают всех этих вендоров и майкрософт в первую очередь.
И при чем тут C# ?
Каким образом отказ от майкрософта, азуры, MSSQL и прочего мешает и дальше работать с шарпом?
>потихоньку выпиливают всех этих вендоров
И тут еще стоит добавить, что выпиливают ну совсем потихоньку. Вон тот же банкинг как крутился на IBM-вских серваках, а там такой дичайший вендорлок, что никакому майкрософту и не снилось.
Куча госухи пилится на дотнете, не только легаси кал, а .NET 6, 8.
На скрепный астра линукс и отечественное импортозамещение
>IBM
Это вообще кто? Перфокарты выпускают?
>И тут еще стоит добавить, что выпиливают ну совсем потихоньку. Вон тот же банкинг как крутился на жабе, так и дальше крутится
>Каким образом отказ от майкрософта, азуры, MSSQL и прочего мешает и дальше работать с шарпом?
Юнити тоже помрет из за охуевших кабанчиков. А пет-проекты можешь хоть на шарпе хоть на делфи делать.
Ну не знаю, он у меня буквально в эту пятницу в вс-коде работал. Такую хуйню предлагал - я его отключил нахуй.
А у меня как-то на лайвкодинге по фронту охуительно так помог в кодесандбокс. Кста, из фронта на шарпы перекачиваюсь после 7 лет.
> Кста, из фронта на шарпы перекачиваюсь после 7 лет.
хоспаде, нахуй оно тебе нужно, на фронте спокойно можно по 4 часа в день работать, найди себе такую же вторую работу и не еби мозги
Двачую. Сишарп - это умирающая технология, достаточно прочекать линкедин. На сишарпе есть три типа вакансий:
1. Фулстек с ангуляром в говностартап. Казалось бы, нахуя тут дотнет, если весь бэк можно прекрасно сделать на нодежс.
2. Тимлид девопс с навыками QA на хохляцкую галеру уровня люксофт, оплата ветками.
3. Какое-то древнее легаси на WPF, где будешь разгребать каловые залежи от преддыдущих 20 поколений писателей.
Ни денег, ни славы, ни перспектив. Нахуй так жить?
>на фронте спокойно можно по 4 часа в день работать
Ты не знаешь о чем пишешь. Последние два года как сеньор-фронтенд разработчик я въебывал как ебанутый и в итоге все равно увольнялся либо меня увольняли потому что "мало времени уделял работе". При этом видел рядом с собой всяких джавистов которые вникли в предметку и были как святой грааль и им прощали всё, даже две недели работы на какую=то хуету банальную. Просто ноль вопросов. А фронтендеру по еблу хлыстом, потому что на рынке еще 50 тысяч таких же после курсов и с накрученными резюме. Да, кста, забыл сказать, на фронта теперь будучи реальным синьором невозможно фактически устроиться меньше чем за 2-3-4 месяца. Столько приходится искать работу на ру рынке. Можете верить, можете не верить, так оно и есть. На шарпы перекатываюсь фактически из-за безысходности.
Это правильное направление мысли. Продолжай думать так же и дальше.
Все так, есть еще один тип это старые проекты которые решили переписывать на cloud native с норм облаком, там как правило интересно работать, но такого мало и не для СНГ быдла, а для белых господ из бритахи \ иногда для хохлов за миску риса
В целом у дотнета один минус это ебучий майкрасофт со своим говном и "СВОЙ ПУТЬ", Blazor, .NET Aspire и прочее не ликвидное на рынке говно, но которое зачем-то кто-то использует
>>3133093
хз где ты работал, везде где я работал фронты в целом не напрягались
Ты забываешь что в добавок к шарпу тебе нужны БД, а они разные, а еще желательно понимать внутрянку т.к спросят на собесе, а еще микросервисы и паттерны к ним, брокеры сообщений и тд, если зарубежный рынок то еще и Azure нужен
На фронте же все проще, на выбор один из трех фреймворков, везде один и тот же HTML, чуток отличаются препроцессоры и собственно все, ну может еще где микрофронты делать придется и либа с компонентами другая, но все равно все плюс-минус одинаковое
А теперь вопрос, нахуя перекатывать?
Зарплаты на шарпе не сильно выше фронтендерских, я бы еще понял перекат в ГО где сейчас платят дохуя
Ремоут вакансий на забугор конкретно на дотнете очень мало, сильно меньше чем на ноде
Если уж тебе так хочется бэкендом заниматься возьми ноду для начала
>>3133093
>накрученными резюме
Сейчас и на ГО и на Питон крутят опыт, если уж собираешься тоже перекадываться, то тоже крути опыт, т.к в противом случае шансов у тебя нет
Дружище, у тебя понимание фронта из 2009. Сейчас ебаный тайпскрипт с пересечениями типов, дженерики, дженерики дженериков, а как тебе в целом такая индустрия в котором в один год просто говорят "а чо, нам давайте теперь новый язык вместо джаваскрипта". То есть ты берешь все что у тебя есть: детей, животных, увлечения и просто отодвигаешь потому что кабан теперь хочет новый язык програмиирования во фронте, не говорю уже про новые фреймворки раз в 3 года (именно как стандарт и доля на рынке) и каждые три месяца новые мажорные версии с новыми ебучими хуками, компонентами и прочей дрянью красноглазой.
Я бы с удовольствием дальше верстал интернет-магазины и делал корзины к ним, но этого всё меньше и всё больше оверинжиниринга. Я хочу один раз выучить говно и чтобы это говно было хотя бы лет 10 актуально и можно было сидеть в пыльном банке и ковырять потихоньку его.
Я в целом весь фронт с 2013 года застал (где-то до 22 года); и knockout js с angular js до react без хуков и с хуками, и ангуляр свежий и svelte; не трогал только vue;
И все это в сравнение не идет с тем что там на бэкенде за эти 11 лет произошло
Хз если у тебя план вкатится в банк и сидеть 10 лет на одном проекте то может и ок, но учти что на бэкенде тоже дохуя чего меняется, банально при смене компании те же вещи будут решаться другими инструментами \ внутренними велосипедами и по сложности они сильно сложнее фронта
Например
Базы: MsSQL, MySQL, PostgreSQL, Oracle, MongoDB, Cassandra, MemCache, Redis
Cloud: AWS, GPC, Azure
Продолжать можно бесконечно
Я уже молчу что MS стабильно раз в пару лет срут новыми фичами языка, хотя на это как правило похуй
Если тебе просто фронт приелся можешь конечно вкатываться, но будет больно, так что удачи и не забудь резюме крутануть, т.к в противном случае это гиблое дело
Как вариант кст можешь на фронта куда вкатиться в банк и попросить тебе иногда задач на бэк наваливать, мб пойдут на встречу и вкатишься, кажется что этот вариант должен быть сильно проще
Ой, ну спасибо за мнение. Может и подумаю тогда. Пока буду в любом случае барахтаться во фронте, ибо тут хотя бы реальный опыт и знания есть. А так съебал бы из этой айтишной срани, если бы были где-то похожие деньги и перспективы. Уже почти невыносимо. Тоже заставал уже и первый ангуляр и жквери и нокаут даже могу вспомнить собесы из 2016 когда спрашивали пишу ли я на прототипе, была такая библа.
А щас на чем пишешь? Если на шарпах то как у тебя с активностью эйчарок? На фронте просто пиздец мертвяк, я уже думал что может мне мразь какая поставила ЕДИНИЧКУ в профиль или что-то подобное, но не похоже. Собесы есть, просто максимум одно в неделю. Больше не выходит.
>А щас на чем пишешь?
Все так же на шарпе, только уже без фронта
>>3133389
>Если на шарпах то как у тебя с активностью эйчарок
Я в аутсорсе, рекрутеры от хотелок как правило сливаются, но у меня еще параллельно позиция полупогонщика на галере, поэтому и зп выше
Если в целом брать - жопа сейчас везде и на дотнете в том числе, хотя мне кажется сеньерам бэкендерам действительно попроще чем фронтендерам
>>3133389
> так съебал бы из этой айтишной срани, если бы были где-то похожие деньги и перспективы. Уже почти невыносимо
А это нормально, меня тоже заебало, но я помню как нищим студентом был, как рукой снимает и выбивает говно из головы, благо сча мозг не ебут
Как вариант в русском айти еще можно тимлидом заделаться, на западе как правило тимлид все равно код пишет, хоть и меньше, иногда над этим задумываюсь, но это дорога в один конец, все таки лучше пока просто кодить, желательно где мозг не ебут
Ну или погонщиком на галере, но их тоже сейчас прут, сытые времена закончились
>>3133398
Смотришь asp net core, rabbit mq, без деталей, желательно по-минимуму на практике пробуешь основы, читаешь про kubernetes, про микросервисы базу
Пиздишь у кого-нибудь резюме и крутишь опыта на одном проекте года два
Дальше важно складно пиздеть на собеседовании чтобы не спалили
На испыталке ебашишь по 12 часов
Ну или честно ищешь голодного работодателя кто тебя за миску риса согласится терпеть пока ты будешь в процессе учится
> хочу один раз выучить говно и чтобы это говно было хотя бы лет 10 актуально
Никогда такого не было. Никогда! Технологии меняются раз в 2 года. Не умеешь переучиваться - вон из профессии.
>Последние два года как сеньор-фронтенд разработчик я въебывал как ебанутый и в итоге все равно увольнялся либо меня увольняли потому что "мало времени уделял работе". При этом видел рядом с собой всяких джавистов которые вникли в предметку и были как святой грааль и им прощали всё, даже две недели работы на какую=то хуету банальную. Просто ноль вопросов. А фронтендеру по еблу
Ну это довольно странно. Сколько раз тебя увольняли? Скорее всего ты просто не потянул проект или еще что-то. В чем смысл увольнять сотрудника и нанимать нового на его место, если он действительно перформит и закрывает таски?
Найм нового чела это всегда в определенной степени лотерея + несколько недель он будет разбираться в проекте и не сможет быстро таски закрывать.
Возможно ты просто не сошелся характером с лидом или с командой в целом. Если у тебя за последние 2 года 2 увольнения было, при том, что ты не джун, который ради зп прыгает с места на место, а сеньор с 7 летним опытом, то это будет красным флагом в резюме.
Ну и перекатываться в сишарп после 7 лет на джаваскрипте это как-то очень странно. Возможно тебе стоит понять, каких скиллов тебе не хватает сейчас на фронтенде. Либо попробовать перекатиться в nodejs бекенд, все же это будет проще, чем с нуля новую платформу осваивать, которая на рынке РФ сейчас сильно сдала позиции из-за изначально малого количества РУ проектов.
>Не умеешь переучиваться - вон из профессии.
Многовато берешь на себя. Даже в интернетике. Поспокойнее.
> я уже думал что может мне мразь какая поставила ЕДИНИЧКУ в профиль
Что?
>>3133183
> Я хочу один раз выучить говно
Реакт не подходит? Ну да, был один крупный переезд с классов на функциональные компоненты, а потом как-то все устаканилось. Конечно, это не 10 лет, но года три жизни без дообучения можно устроить.
Тайпскрипт же просто облегчает жизнь, женерики женериков только в коде библиотек, в клиентском коде, как правило, так не пишут, потому что потом придет какой-нибудь челибобик и не сможет поддерживать. TS не новый язык, это надстройка
>>3133398
> Да как вкатиться в этот ваш шарповый бэк?
Вкатился в бэк, потому что слишком тупой для WPF. Эти депенденси проперти и ксамл просто чудовищная параша
> вообще не понимаю что учить
Да хуй его знает, сначала пройдись по aspnet, чтобы веб пощупать
> Каждая гребаная это свой отдельный набор технологий
Не обязательно все знать. Половина стека совпадает – окей. Например, ты знаешь шарпы и бд, а в вакансии какая-нибудь монгодб. В среднем людям ок, если ты на месте освоишься, потому что это та же бд, только в профиль
>>3133949
> Не умеешь переучиваться - вон из профессии.
Лицо этого чухана-ноулайфера имаджинировали? Столько злости, а ведь ИРЛ будет тупить глазками в пол, если попадется вам на пути
> Вкатился в бэк, потому что слишком тупой для WPF. Эти депенденси проперти и ксамл просто чудовищная параша
А прям хотел в впф что ли?
Нет, я искал работу после универа, хватался, за что было. Посидел на wpf пару месяцев, потом надо было новый проект начинать, я взялся и писал его уже на razor pages. Конечно, первый блин комом, но как я кайфовал от html, css и js (даже не react с typescript)
Xaml это конченная технология, я не понимаю людей, которые ее хвалят. Тулинг говна, синтаксис мочи (там ещё надо вначале файла xmlns и прочие заклинания писать?), разбивать на компоненты сложно. Я пытался читать статьи, как писать поддерживаемый код, но ты как будто ссышь против ветра. В том же вебе все для людей сделано (в сравнении)
Ну и, конечно же, килотонны бойлерплейта. Я когда react/vue для себя открыл, охуел, насколько все лаконично получается
Так что если ты xaml осилил, то с вебом как-нибудь разберёшься, надо только чутка попотеть на начальном этапе, всё-таки другой стек, поначалу может быть отторжение
>я не понимаю людей, которые ее хвалят
Никто его не хвалит, это максимально ублюдочный пиздец. Поэтому микрософт и проебал десктопную разработку, а когда-то это говно пытались засунуть даже в веб. Для WPF есть библиотеки для людей типа caliburnmicro, но оригинальная технология - это хтоническая шизофрения и рак мозга в терминальной стадии.
Ты - это я!
Мимо меня судьба выкатила из фулхема в чистый фронтенд. А тут ебанная потогонка, долгий поиск работы из-за миллиона вкатунидзе и версточка. Хотя мне всегда больше бек нравился... Хотя я не синьор, а 20-летний мидол.
Зачем перекатываться с технологий, на которых дохуя вакансий в технологии, на которых хуй найдешь работу?
Ну по твоей логике надо вообще гей-шлюхами работать.
>Если прошел
>ты мидл
Нет
Если ты выполняешь таски как мидл - ты мидл. А прошел ты или пролез не играет роли
Если тебе объясняют что делать, ты мидл
Если у тебя спрашивают как делать, ты сенька
Если у тебя спрашивают что делать, ты лид
Думаю даже школьник бы интуитивно догадался, а я не могу.
Как развить элементарную логику?
На ларе и вуе делают сайты для дилдаков. Мало вакансий из числа нормальных. Можно замараться об битрикс. А я хочу в банке работать!
Схоронил! Это же база!
>Как развить элементарную логику?
Ну очевидно решать задачки на элементарную логику. Идешь в книжный магазин и покупаешь стопку книжек из раздела "задачки для дошкольников". И сидишь решаешь пока все на автоматическом уровне не отложится. Затем переходишь на задачи для младших школьников и так далее. Весь смысл обучения как раз в том, чтобы задрочить мозг, чтобы он сам все понял и на автомате делал, а ты на расслабоне решал только что-то высокоуровневое. А всякие концепции вроде "достаточно понять тему и ты сможешь в ней разбираться" - хуета.
576x1024, 0:06
Кекс даже Avalonia для xaml запилил и продает платную бесшовную миграцию с wpf. Было бы странно хейтить то, во что вбухал несколько лет усилий и что приносит тебе доход
Доверия к отзывам простых девелоперов, которые прохавали devex, больше
> которые прохавали devex
Он же небесплатный. В чём вообще проблема? Как тянул с торрентов, так и тяни.
Пытался понять, но не смог. Авалония бесплатная, но у нее есть некоторые различия с WPF. Слой совместимости платный, его и продают. Тянуть с торрентов – такое видел только один раз за всю дорогу. Хер его знает, что там выложили самаритяне, а крутиться оно будет с настоящими данными, так что нахуй надо
Диван, ты подрасти немношк, узнаешь жизнь, как на галерах работают (пиздят на торрентах все тулкиты, какие понравились)
720x1280, 0:09
Я только в продуктовых компаниях работаю, на галеры страшновато идти – самое сложное, это домен в голове уложить, а если проекты разные, то это часто придется делать
Когда домен понял, можно пилить код и чилибобить в свободном темпе (если процессы ок). Или я не прав? Послушал бы историй с другой стороны
Мидлу просто ставишь задачу - он ставит сроки и делает ее, сам может гуглить и т.д.
Джуна надо контролировать и учить всему, к самостоятельному решению он не способен.
Сеньор может учить джунов/мидлов и руководить ими.
Тимлид может руководить сеньорами.
PM может руководить тимлидами.
>Не умеешь переучиваться - вон из профессии.
PHP/1C учится один раз и на всю жизнь. Раньше еще была Delphi, но теперь десктоп умер.
> десктоп умер
У меня куча десктопных приложений, работающих автономно, без сети, и только одно веб-приложение (json editor online) хз, каким хуем тебе пришла в голову эта хуйня про десктоп умер. Наверное ты повёлся на чей-то троллинг.
Так у тебя опенсорс, который не приносит денег. А вакансий нет. В нулевые каждая контора писала для себя софт на Delphi и искала программиста для этого.
Сейчас полтора приложения, которые не могут перенести в браузер, пишут на Electron'е.
>Сейчас полтора приложения, которые не могут перенести в браузер, пишут на Electron'е.
На ИДЕшках ~75% рынка - это приложения на Java/Swing
Если JetBrains, то они теперь не на Swing. А остальные IDE не являются коммерческими.
> на Electron'е.
Кстати электрон, если его уметь применять, неплох. Я все свои прожекты кодирую в мс-коде, который как известно, на электроне. И считаю мс-код лучше титанической студии. Для меня лучше.
Надо будет попробовать самому на электроне чё-нить сделоть.
Не во всех, таракан.
Не надо MVC. Это для убогих.
Делай или блейзер, или API + SPA на каком-нибудь js фреймворке.
Ну я вот недавно смотрел видос, там челик на серьёзных щщах затирал, что вот он может из шарпа в жс транпилировать.
Я тоже могу из шарпа в жс транспилировать.
Открываешь в одном окне код на шарпе, и пишешь во втором окне аналог на жс.
> где можно взять идеи для таких работ?
У нас есть спецтред с идеями. Берёшь любую и хуячишь. >>2669550 (OP)
Только на самом деле нет никаких транспиляторов жс-шарп и наоборот. Может есть что-то совсем убогое, которое сильно урезанные подмножества языков умеет переводить.
Смеяться не будем. Смотря, что хочешь сделать. Вбиваешь в гугл(яндекс) "Как создать платформер/topdown/рогалик/метроидванию 2д на Unity". От версии к версии процесс создания игры меняться не будет, так что ты спокойно можешь смотреть гайды хоть пятилетней давности
Дело в том что моя идея мне казалось простой, но я не смог найти нужную информацию, да и без опыта в этом деле возможно тупо не умею правильно искать, например я сделал клетку 8 на 8 квадратиков, как я это сделал, добавил пустой объект, добавил компонент sprite renderer, добавил спрайт png белую картинку с темными рамками, и скопировал этот объект 64 раза чтобы была сетка 8 на 8, теперь вопрос в чем, допустим у меня есть новый объект, как заставить его крепиться к углам этой сетки, в общем трудно расписать, поможешь? В дискорде или типо того? Я объясню что хотел бы сделать)
Сделай на блейзоре с сигналр чтобы новые посты моментально подгружались
На вижуал бейсик 5.
на jcef, суть вебвьюшки в дажве
public static string FormatSeconds(float seconds)
{
var mins = (int)(seconds / 60);
var secs = (int)(seconds % 60);
StringBuilder sb = new();
sb.Append(mins);
sb.Append(":");
sb.Append(secs.ToString("D2"));
return sb.ToString();
}
Убери StringBuilder. Просто используй стандартную интерполяцию строк. Для нее сейчас компилятор эффективную реализацию с использованием DefaultInterpolatedStringHandler генерирует.
Анончик, а можешь раскидать +- приблизительный роадмап что вообще учить и в каком порядке для вката в гейдев на юнити? Я в айтишечке не совсем нуб, работаю веб-макакой на питоне, но вот с С# и Юнити познакомился только неделю назад, пока посоздавал квадратики в редакторе Юнити и прошел немного базы синтаксиса С шарпа.
Спасибочки
Если у тебя геймплей нестандартный, то выгоднее так пилить, без движков-редакторов, чисто в IDE, с тулкитом типа этого твоего моногейма, или SDL. А если геймплей стандартный, то зачем изобретать велосипед? Ты полюбас в одиночку не сделаешь лучше то, что сделали тысячи кодеров до тебя.
Только если ты профи в геймдеве (знаешь механики, умеешь в геймдизайн и т.д.) и разработке (шаришь за паттерны, архитектуру и т.д.). Тогда через 3..4 года можешь сделать неполохую инди-игру.
Ну т.е. имеет смысл если для тебя весь фан именно в процессе пиления игры или движка.
Это байтоёбство всё. Используй просто TimeSpan.FromSeconds, а потом ToString с нужным форматом.
>Можно ли сделать так
Нет. Если чат-гпт, сказал, значит должно работать так и никак иначе. По другому просто работать не будет.
Где посмотреть/почитать гайды по этой хуйне?
Оно иногда ломается на ровном месте ( буквально всё работало, а через два дня снова запустил и ошибка какая-то) и неприятно все файлы копировать в новый проект, но починить иначе не могу, тк даже хз, что это и нихуя не понимаю.
Спасибо, теперь смогу изучить это, чтоб проще было работать с визуалкой.
Поддерживают, да? А почему последний релиз был в 2020?
Я был бы рад хоть в SharpDevelop работать, если бы мейнтейнеры не забили на эти проекты хуй, оставив выбирать из проприетарщины.
Давным-давном пилил небольшую игру на нём. Я, конечно, далёк от игровой индустрии, но больше смысла имеет сейчас вкатываться в Unity/Godot имхо, на monogame слишком много приходится руками пилить
Я тут попробовал у гопоты функцию объяснения кода и заметил такую закономерность. Если подсовывать ему куски которые написаны по Clean Code, СОЛИД-у и т.д., то он их в принципе неплохо понимает и объясняет, даже угадывает некоторые моменты которые явно не обозначены. Плюс может понять чисто алгоритмическую хуйню (всякий ширпотреб с литкода). А вот если подсовывать ему реальный код с реальных проектов, который написан обычными кодерами (а не солидодрочерами) - то он начинает нести откровенную хуйню.
Выводы:
1) Хуй он меня заменит.
2) Нахуй чистый код.
Джунов уже заменил. Вкат всё.
asc.puk не существует в данном контексте , то же для asc.i
код внутри класса public partial class Form1 : Form внутри неймспейса. Всё, больше вложенности никуда нет.
Так, а ты зачем вызываешь asc.puck вне функции?
Создать объект вне функции можно, но вызывать функцию вне функции - нельзя (?). Я сам пишу на джаве, так что за с# могу слегка ошибаться
А, тип у него в функции мейн штука исполняется, а у меня вне функции никогда не исполнится?. Спс, попробую сейчас.
Я изначально вообще функцию класса, получается, пытался отдельно объявить.
вне функции ни одна функция не исполняется, если она не привязана к чему-либо (ну это чутка другая тема, сам разберешься, когда будешь изучать работу функций более подробно)
Какие подводные
Мимо 2 курс недоинтерн с гошкой
Жирно. Сишарп в 2024 году никому не нужен. Все вакансии - это или нищебродские стартапы, где ты фулстек девопс с навыками qa, или древнее легаси с wpf и mongodb (почему-то именно такое сочетание). На бекенде дотнет умер нахуй.
Десктоп интереснее бэка же. Если бы только еще платили нормально.
Хотя WPF никогда не нравился, вот WinForms годнота. Прямо как в Delphi, только еще и растягиваться сам умеет.
Сьеби в загон клоун.
Ну прям реально сервер арендовал или vps? Сколько памяти жрет дефолт-сайт под небольшой нагрузкой?
80мб в простое и в пике ну 300мб, 330к get запросов от ботов в сутки. Я их побанил птому но это так для примера. С учетом того что при первом заходе нужно было сгенерить тело страницы и сохранить на диск, последующие заходы на эту страницу уже брал это тело, собирал страницу и отдавал.
Дело не в шарпе а в самом сайте. Делай кеш в раме и будет у тебя как нехуй делать 300рпс на впс за 1$.
О, спасибо, полезная информация.
>С учетом того что при первом заходе нужно было сгенерить тело страницы и сохранить на диск, последующие заходы на эту страницу уже брал это тело, собирал страницу и отдавал.
Генерировал html'ку? Или ты про сборку html-шаблона (у вас вроде razor pages)?
На одном приложении asp net core висело 10 сайтов. У каждого сайта свой шаблон, из бд бралось наполнение(текст) вставлялся в html шаблон, эта страница сохранялась на диск. При следующий заходах эта страница бралась уже с диска, на неё добавлялись еще некоторые данные и отдавалась юзеру.
Разор пейдж это другое.
Я просто не знаю какие у вас шаблонизаторы. То что ты описал это какой-то самописнный шаблонизато, я так понял? Или дефолтный (как называется, куда копать)?
А с обычными шаблонами работал? При таких нагрузка в впске 512мб уместиться?
Шаблон это просто каркас html страницы в которой есть тег [TEXT] который я регуляркой заменяю на текст для каждой страницы.
Всё это были костыли. Говорят в пхп мультисайтник делается гораздо проще.
У меня просто юзеру возвращало return Content(htmlPage, "text/html");
В данном случае MVC не подходил так как там дизайн страницы компилируется и его нельзя менять в рабочем приложении.
Обычные шаблоны это какие?
И куда тебе копать и зачем?
Ну у asp.net есть же свой сервер-сайд шаблонизатор?
По типу jinja, mustache, Handlebars, Thymeleaf, Freemarker идт.
Нету такова. Или я просто не понимаю про что ты говоришь.
в mvc или razor pages страница рендерится на сервере и передаётся клиенту, что бы поменять дизайн страницы нужно менять его в исходниках и полностью перекомпилировать проект
Тебе нужно понять как устроен ASP.NET Core. Язык шаблонизации у него 1, это язык Razor, но он может использоваться в разных типах генерации страниц. Например, есть приложение Blazor. Оно рендериться или на сервере или на клиенте. Есть другие виды приложений, там рендеринг немного другой.
>При таких нагрузка в впске 512мб уместиться?
Лол, на однодолларовую польскую впс 512 мб ты можешь хоть сотню сайтов поместить. А данные ты откуда будешь брать, из жопы? PostgreSQL с включённым движком innodb минимально требует 1 гигабайт оперативной памяти. Это уже больше чем 512. Выход либо на sqlite переходить, либо брать движок myisam/aria. Либо у тебя будет тупо статический сайт и всё.
LiteDB же. Самая быстрая база.
> PostgreSQL с включённым движком innodb минимально требует 1 гигабайт оперативной памяти
На 256мб сидел на пхп с мускулем, что у вас там не так?
Да можешь хоть в 100 мб уместить. Я просто говорю, что это зависит не только сишарпа. Свежезапущенная убунта жрёт 300 мб. Плюс база данных. Если это монга - то минимум 4 гига. Если innodb - то минимум гиг. Если там ещё clamav какой-нибудь, то ещё гиг. Если там php-fpm, то минимум 128, умножим на количество воркеров, 8 воркеров x 128 = ещё гиг. Если там вордпресс с кучей плагинов, то 128 мб будет мало, увеличиваем до 256. Ну и т.д.
Естественно, это всё регулируется.
Да я знаю что убунту можно на firecracker заменить
Да я знаю что бд можно легковесную поставить
Подкрутить демоны, отключить модули ядра
Общей сути не меняет
512 мб может хватить, а может и нет, зависит от задачи и твоих хотелок
>Да я понял, пойду на гошечку.
Пойдешь копать вилкой (Go) вместо того чтобы взять экскаватор (.NET)? Все из-за экономии 200 рублей в месяц? Разрабатывая на Go ты потеряешь намного больше времени, а оно бесценно. И все равно твое решение будет хуже чем ASP.NET Core - лучшая веб платформа на данный момент, сочетающая в себе плюсы многих других платформ и не имеющая их минусов.
Да реальные тесты mvc тормозят так же как все остальное, дебагер прибит к вижле, вижла к винде, тупит хотрелоад на линуксах. С мауи они четко показали как относят к кроссплатформе и линуксу. Половина либ то на винду то на коре, половина положили болт. Туча базвордов в которых путаешься. Вот тот же razor и razor page, разная херня, непонятно (как и всякие версии стандартов, эти нет кор и не нет кор, эти версии шарпа эти отдельные версии дотнета, я даже не понял LINQ для всех или для избранных, да и вообще на котлине это тупо калбэки, лол.).
В общем, это реально опять какой-то наяб от мягких. Вам нравится, кушайте, но уж лучше взять жабу и сидеть в честном опенсорсе. Ссори за срачный выпад (думал даже об юнити, как плюс, но там свой сишарп, ппц).
>реальные тесты mvc тормозят так же как все остальное
Показывай.
>дебагер прибит к вижле
https://learn.microsoft.com/ru-ru/visualstudio/debugger/remote-debugging-dotnet-core-linux-with-ssh?view=vs-2022
Чем тебя не устраивает VS Code?
>тупит хотрелоад на линуксах
Конкретней. Что за хотрелоад вообще?
>Туча базвордов в которых путаешься.
>Вот тот же razor и razor page, разная херня, непонятно (как и всякие версии стандартов, эти нет кор и не нет кор, эти версии шарпа эти отдельные версии дотнета, я даже не понял LINQ для всех или для избранных, да и вообще на котлине это тупо калбэки, лол.).
Поначалу действительно можно запутаться. Все очень просто если разобраться.
>лучше взять жабу
Пожалуйста, но там ты не получишь Blazor, SignalR, LINQ и другие фичи.
Как там в 2015-м?
> Да реальные тесты mvc тормозят так же как все остальное
Не упирался в тормоза, да и похуй как-то – это бд сложно распараллелить, а поднять ещё один инстанс приложения за балансировщиком вроде бы несложно (мне не приходилось, но видел, как делают)
Плюс, mvc уже давно не вижу в ходу. C# – это webapi, а фронт на react. Периодически вижу вакансии на angular, но пахнет пуками
> проще взять жабу
Тот же самый си-подобный синтаксис, а система типов отличается незначительно и сосет. Разве что без LINQ грустно, но, по иронии, лямбды в шарпе срут в кучу, а в джаве нет. Если что, я на джаве не писал, но кореш свичнулся с шарпов, так как х2 предложили (он только начинал), так что говорю с его слов
> unity
В геймдеве кранчами массируют простату и ЗП на карту капает меньше, если посмотреть статистику. Ладно для себя игры писать, но идти туда с головой и завязывать свой доход на гейминдустрию – не понимаю таких людей
> кор не кор
Уже все понятно, а года четыре назад, да, путаница была
> Maui
Реинкарнация уебского xamarin с не менее уебским xaml'ом. Впрочем, не знаю ни одного способа писать десктопные приложения с удовольствием:
- чтобы приложение стартовало быстро, а не как просмотрщик фотографии винды. Кажется, на языках с gc и рантаймом это плохо получается
- без рантайма есть плюсы, но деды рассказывают такие истории, от которых мурашки по коже. Ещё есть Раст, но тут без комментариев. Хотя, добавлю один: в нем нельзя нормально описывать деревья, а интерфейс это как раз дерево компонентов. Так что писать на нем сложный ui вряд ли будет приятно
В итоге на десктоп даже не смотрю, все в браузер ушло
Есть Авалония (если любишь XML) и есть Ето.Формсы (если ненавидишь XML).
>mvc уже давно не вижу в ходу. C# – это webapi, а фронт на react. Периодически вижу вакансии на angular, но пахнет пуками
База.
Почитай Metanit. Потом доку когда поймешь что есть что. Еще книги можно.
> блазор
Если это blazor-server, то задержка ощутима, так как пинг. В каждой локации по серверу держать? Ни одна похожая технология не взлетела
А если это blazor wasm, то нужно подождать полминуты, пока clr скачается и начнет крайне неспешно работать. За примерами можно сходить на любой сайт ui-кита, типа syncfusion. Лагает даже на m1pro маке
Блазор, наверное, подойдёт для внутренней админки, когда пользователь никуда не денется
>задержка ощутима
Че ты лепишь, всякие spa грузятся несколько секунд и потом тормозят ужасно. Эти задержки это мизер. Запросы по вебсокетам всегда быстрее.
Есть в .net возможность runtime compilation. Как эта херня по факту работает? Net Компилит представление каждый раз при запросе или только когда представление изменилось?
Как эта фича влияет на производительность?
Дорогой мой, поехавший, свидетель блазора. Твой обожаемый блазор на сокетах это подмножество так нелюбимых тобой SPA – при открытии страницы сперва должно скачаться около 200кб js-кода, который и будет отвечать за рендер. Или ты думал, что браузер слушает сокет, а тот ему нашёптывает, как кнопку отрендерить?
И это ещё пустяк. Когда я говорил о задержках, я имел ввиду задержки, которых SPA лишены. Например, ты решил ответить на мой пост. Жмешь кнопку ответить, моментально появляется форма и ты в нее пишешь. Почему моментально? Потому что это SPA, и работает оно на клиенте. Тебе пока не надо слать ничего на сервер – тебе надо открыть форму, а, значит, ты можешь сделать это даже оффайн.
При блазоре на сокетах клиент не знает, что, например, вышеупомянутая форма должна открыться. Он шлёт запрос на сервер, в котором передает, условно, айди кнопки и событие. А сервер уже рендерит изменения и шлёт инструкции по модификации страницы клиенту. Получается пинг на весь интерактив, и это очень дерьмово ощущается. Вязко и заторможенно. Чекбокс, который имеет задержку, ощущается как сломанный
Я думаю, что ты просто толстишь, но ведь кто-то мог купиться, поэтому вот такой маленький разбор
Какие задержки. На таких spa с тонкими клиентами на вебсокетах делают игры, делали еще 10 лет назад. Никаких доказательств у тебя нет, просто болтовня свидетеля реакта.
>Для себя
Ты представляешь количество рутины, которое надо для реализации даже простых вещей? Забьшь даже толком не начав. Для себя можно делать только костыли на скриптовых языках, типа питухона, автоматизирующую какую то часть работы. Приложение - это очень долгая рутинная работа по запиливанию фич. Поэтому говорить, что сейчас как Денис Попов себе весь десктоп заменю очень смешно.
1. Я уже пишу на котлине (мобилки) и иногда на спринге фикшу личный сайт. Вполне успешно, работаю 2 года.
2. Если нет по делу сказать, нахрен ты пишешь? Сам не осилил и теперь думаешь, что никто не осилит?
1. Фикшу* на джаве, конечно же
А зачем тебе для себя гуи?
Гуй лишняя ебня, для себя проще консольные приложения делать. Ну или морду управления делать в web если уж очень сильна нужна.
Да мне надо сделать мультиплатформенное приложение, чтоб было проще смотреть аниме и читать мангу. Вот и решил взять шарпы, узнать что там да как. Делать что-то под веб мне вообще не хочется из-за некоторых причин.
Ты будешь сравнивать игры, где применяют компенсирующие пинг алгоритмы с сайтами? Причем даже ui в игре, типа того же меню, будет работать на клиенте. Меню-то мгновенно открывается
Для остальных: можете сами убедиться тут. Только попробуйте с телефона, с сотовой сети – через wi-fi, как правило, пинг меньше:
https://demos.devexpress.com/blazor/CheckBox
Особенно рекомендую пораскрывать тут select'ы
https://demos.devexpress.com/blazor/CheckBox#Alignment
Попробовал и что? Работает не хуже Озона или Сбера. Они даже медленнее чем это. Еще неизвестно как это написано, надо бы код смотреть. Никто не говорил, что нужно все на Блэйзоре писать. Можно использовать все варианты рендеринга asp.net в одном проекте.
Захотел поиграться с OpenIddict. Создал новый проект, в csproj честно прописал
<PackageReference Include="OpenIddict.AspNetCore" Version="5.6.0" />
<PackageReference Include="OpenIddict.EntityFrameworkCore" Version="5.6.0" />
Пишу - services.AddOpenIddict() - symbol not found.
Пишу - using OpenIddict.Server - symbol OpenIddict not found.
Какое-то КВН получается - купил, включил, не работает.
dotnet restore? Если не поможет то посмотри что внутри сборок, может там такого и нет с какого то хуя
>Startup.cs
Да тебе еще и протрезветь надо, если у тебя до сих пор в проектах startup.cs есть.
>>3168778
Ставил сейчас скорость 256кбитс и пинг 500 (в сети хрома)
чекбоксы тут реагировали нормально, не прям GUI, конечно, чувствуется что-то, но сеть не влияла.
Но при загрузке, когда UI прогрузилось, оно не отвечает, это бесит.
Вероятно чекбоксы к сети не привязаны, но для UI тормозные.
Если в реале правда весь отклик привязан к сети, то мягкие обосрались. Спасибо анон за инфу.
> Если в реале правда весь отклик привязан к сети, то мягкие обосрались. Спасибо анон за инфу.
Зависит от реализации, если вставки на js, то они будут работать локально. CSS анимации тоже позволяют сгладить углы, но, в целом, да – шляпа это все
У меня мак и говноноут на винде, на котором когда печатаешь обжигаешь пальцы....
Бекенд да, на райдере пишу
Приятно, что можно лёжа с ноутом работать и он не превращается в печь при открытии монолита
> говноноут на винде, на котором когда печатаешь обжигаешь пальцы....
1) Выкинь/поменяй раздувшуюся батарею (которая скорее всего и дает самый большой нагрев).
2) Поставь энергопотребление проца на 99%.
3) Разбери, прочисти, поменяй термопасту.
От с самой покупки такой.. мсай за 30к
А вместо MVC они сделали тайпскрипт и ангуляр.
Вс код написан на жсе, а не на шарпах.
А что на их серверах происходит это же ужас, там стоит линукс, а не винда.
Ахуеть куда мир катится!
А еще они разрабатывают Rust и многие другие языки и платформы. Майкрософт уже много лет лидер по количеству опенсорс проектов и по величине вклада в опенсорс.
>Раст мозиловцы же создали
Майкрософт тоже участвует в разработке. Еще участвуют в разработке Ubuntu или Red Hat Linux.
https://foundation.rust-lang.org/members/
Это EEE.
>Морды шарпомух имаджинировали?
Нормальные морды.
План - пушка-гонка. Оттянуть часть корпоратов на поддержку и затянуть их в свою среду. А потом всех мягко посоветовать "зачем вам уебищная JVM, давайте меняться на наш охуенный блестящий CLR".
Видимо так и рассуждают бигбосы в микрософт, пока индусы добавляют в сишарп нахуй не нужные спаны и серчвэльюс. В реальности же дотнет катится в сраное говно. На линкедине все какансии по дотнету - это или фулстек у нищебродов, или легаси помойка на wpf, куда срали десять поколений паджитов. Нишу веба проебали, мобильники проебали, в геймдеве дали жидкого, на серверах везде линукс, осталось просрать десктоп и все. Зато можно генерить похабные картинки в нейросетке, невероятно полезная вещь.
Да как проебали-то, если под веб на шарпе больше всего вакансий. Или это только на линкедине такое попадается? Может, у тебя в навыках в профиле эти самые вкусные десктоп-фреймворки?
когда жабаскрипт выкинут на помойку я буду пить и танцевать неделю напролет
Покажи эти вакансии. Вангую там asp.net core + angular + azure expert для стартапа из Израиля, лол. Иными словами, классический фулстек у жлобов.
Знаешь, что такое фулстек? Это когда вместо трех человек (фронт,бэк,девопс) нанимают одного и вешают на него все проблемы. Заканчиваются такие проекты всегда одинаково: разраб просто исчезает, оставив за собой кучу кривого говна, которое роняет прод по кд. Нанимается новый фулстек из Индии с 30 годами опыта из прошлой жизни, он высирает еще большую кучу говна и тоже сваливает. Снова нанимается фулстек, в этот раз хохiл из епама, он творит всякую хуйню и сваливает, когда становится совсем плохо. Вы находитесь здесь. В итоге проект или закрывается нахуй, или переписывается уже с нормальной командой.
>Видимо так и рассуждают бигбосы в микрософт
Ну конечно, куда менеджерам самой богатой компании планеты до Васяна с двачей. Он то точно знает какие фреймворки и технологии развивать. Ща он тут нам полный расклад даст почему .Net не нуж0н, и вообще C# умер.
> Майкрософт уже много лет лидер по количеству опенсорс проектов
лидер
Много лет реализует ЕЕЕ, последняя попытка подмять жабу обернулась судом и последующим рождением шарпа.
Эти менеджеры за десятки лет просрали все рынки, даже покупая готовые решения, кроме гитхлама, хотя еще не вечер.
Так что да, васян может быть компитентнее тут.
>.Net не нуж0н, и вообще C# умер.
Пытались попенсорс поджать, но чет не поджимается? Почему?
После того как кинули с мауи линупсоидов, можно уже сворачивать эти смешные попытки EEE.
Работал с американскими заказчиками через бодишоп, хочу выйти напрямую. Язык достаточный, чтобы проходить технособесы и общаться по задачам. ИП и банковский счет в Сербии есть.
Думаю, что выгодно будет изучить ML.Net. По нему не так много специалистов, но он производительнее, чем змея. Ну и набить руку на Ангуляре.
Что ещё делать и как?
>Выучить все алгоритмы и устроиться в майкрософт
Типа сесть за "Грокаем алгоритмы" и олимпиадное программирование? + Они увидят, что я шарю в ML.Net, скажут "молодца" и пригласят работать в Рэдмонд за овер 9000 USD?
>Эти менеджеры за десятки лет просрали все рынки
Однако капитализация компании растет. Васька, ну давай не будем делать свой убогий анализ на основе твоего пук-среньк опыта. Корпорация в триллионы $ со штатом более 100 тыс. сотрудников наверное знает что такое бизнес и в какие активы вложиться.
Если думать в духе "ну, эта, там большие дяди с огромными головами за нас все продумали, куда ты свой нос суешь", то далеко так не уедешь. От неверных решений никто не застрахован
Реши какую то свою задачу, напиши доку, настрой ci, запили релизы, проверку апдейтов
>решение какой-то твоей проблемы
Проблема в том, что у меня нет проблемы, которую нужно решить. Мне просто нужно сделать пет-проект в портфолио
Мне бы такую проблему как отсутствие проблем которые нужно запрогать.
Увы тогда у меня лапки
> "ну, эта, там большие дяди с огромными головами за нас все продумали, куда ты свой нос суешь"
Однако это так и работает в крупных корпорациях. От ошибок они застрахованы целыми департаментами с просчетом всех рисков и финансов. В таких компаниях как IBM, Oracle, Huawei, Российском БигТехе тысячи людей делают прогноз куда бабки вложить акционерам. Это еще не считай консалтинговые агентства оказывающие им услуги. Да даже если Microsoft тупо похоронит все свои продукты, они милиарды будут лутать с одного MS Excel
так что вскукареки местных "хелоувордщиков" про смерть .NET просто пыль. Java - хоронят уже лет двадцать, а спецов до сих пор не хватает.
Так надо смотреть за счет чего растет, за счет купленного скайпа, может за счет релиза старфилда, или успехов вин-телефонов, а может быть за счет интернет эксплорера?
Было бы все хорошо, не занимались бы EEE.
Такое на MAUI можно сделать?
Чтобы жить, оно должно хотя бы выстрелить, нельзя только на одном поддуве от мягких развиваться, надо чтобы попенсорс жил сам по себе, а с последней новости что даже Avalonia ливнула с фонда, говорит о плохой судьбе кроссплатформы. С учетом какая у мягких репутация они просирают последний шанс и как только просрут и облака, то линусовый шарп потеряет всякий смысл.
То есть, большая вероятность, что коре-дотнет это не эволюция, а просто попытка сделать кусь у рынка. Что мягкие делают не очень.
>Двач, как развиваться в профессии?
Очевидно либо вкачивать ветку лид->ПМ, либо в архитекторы.
>>3173103
>Думаю, что выгодно будет изучить ML.Net. По нему не так много специалистов, но он производительнее, чем змея.
То что в ML реально требует производительности, пишется на плюсах. А пайтон поверх этого по сути "удобный" интерфейс который любая домохозяйка может освоить.
>Какие пет-проекты вообще делать?
Именно "петы" для устройства - нахуй не нужно. Пет - это по сути рабочий проект который делается под какие-то свои задачи, которые у тебя никогда не совпадут с работодателем.
Если же тебе нужен просто проект типа дипломного, чтобы показать работодателю, что ты не хуй с горы, а ровный джун, то сделай проект электронной очереди. Там ты сможешь абсолютно любую технологию пощупать, чтобы было что предъявить.
>.NET и C# во всем превосходит Джаву
В пресс-релизах от мелкомягких маркетологов. В жизни достаточно открыть линкедин, вычеркнуть мусорные вакансии уровня "фулстек девопс в израильский финтех стартап" и осознать, что дотнет никому нахуй не нужен.
>лид->ПМ
Да че-то не слишком хочу в ПМ, они там какие-то грустные и больше занимаются созвонами ради созвонов.
Хочу в мышинное обучение, АИ, вот это всё.
Нам божественный Шарп не заблокируют так?
>После блокировки докера дизмораль поймал
>Нам божественный Шарп не заблокируют так?
Уезжай в Сербию, тут няшно.
Всегда есть полностью опенсорсная джава без корпоративного хуя от майкрософта в жопе. Собсвтенно поэтому все банки в России сидят на джаве.
>База
>В сишарп скатываться НЕ НАДО
>Надо учить ДЖАВУ
Нахуй нужна эта ваша джава с этим вашим богомерзским спрингбутом, где программирование сводится к написанию xml-файлов настроек?
Я бы сказал, что всегда есть языки общего потребления, типа джавы, с/с++, js, где нет центрального хера, который решает только в свои интересах. Поэтому го, шарпы, котлины, тайпскрипты - идут лесом.
А еще важно наличие опенсорс библиотек и желательно не только есть, но еще не кривые и заброшенные.
На счёт SDK сомневаюсь что будут запрещать,. А вот доступ к nuget.org могут с российских айпишников перекрыть.
>где нет центрального хера, который решает только в свои интересах
Как тебе Большой дядя с Майкрософта мешает писать на .Net, Конкретно аргументы можешь привести. Где он он тебя конкретно ограничивает ? Какой из инструментов от тебя зажали и не дают. Только аргументировано и без воды.
>достаточно открыть линкедин
Что и требовалось доказать. Нет ни одного аргумента чем джава лучше. Потому что она ни чем не лучше.
>>3174093
Да, но ты опровергаешь мое утверждение. Вот и приведи аргументы. Я не опровергал ничего. Мне просто интересно что вы будете писать. Ведь джава ни чем не лучше. Современный .NET обощел ее очень сильно. Это не старый .NET Framework только для винды, и это даже не главное его преимущество.
>>3174106
Вообще то Майкрософт уже не занимается развитием C# и .NET. Есть специальная организация .NET Foundation, которая это делает. Проекты все опенсорс. Вы отстали. Версий .NET с тех пор как он опенсорс вышло наверное больше чем когда он был закрытым. Развивается он так быстро, что не успеваешь узнавать фичи.
> язык плохой, так как вакансий нет!
Во-первых, вакансии и качество языка напрямую не связаны. Хаскель, например, неплохой язык, но вакансий оче немного
Во-вторых, если ты утверждаешь, что вакансии говно, нужно это как-то подтвердить. Не все носятся по собесам, чаще зовут знакомые на проверенное место, где подлянки не будет. Без знания рынка невозможно понять, правду ты говоришь или нет. Я вот не наблюдаю говна в репе компании, мой друг тоже. Может быть, что-то с тобой не так? Без конкретных цифр это разговор ни о чем
>>3173890
> После блокировки докера дизмораль поймал
Заблокировали докерхаб. Если провести аналогии, могут заблочить nuget. Сам по себе язык, кажется, под MIT лицензией, стало быть, ничего с ним не будет. А по поводу nuget – наверное, нужно ставить посередине что-то вроде jfrog
Джавистам тоже могут обрубить доступ к их хранилищу сборок, js'ерам к npm, расту к карго и так далее – инфраструктурные ограничения мало от языка зависят
Таракан, успокойся.
Во-первых, там как правило вообще ничего менять не приходится.
Во-вторых, хотя jvm обратно-совместима, жаба таковой не является. Поэтому код точно так же приходится "обновлять". Ну или сидеть на древних версиях с кучей бойлерплейта.
В-третьих, иди чини дедлоки в луме.
BTW, у тараканов несколько репозитариев пакетов, причём они не являются точными копиями друг друга, где-то есть нудный пакет, а где-то нет (и иногда один и тот же пакет имеет разные версии в разных репах лол), поэтому приложения зачастую тянут пакеты сразу из нескольких репозитариев. Поэтому может стать очень плохо, если даже один из репозитариев заблокирует РФ.
>Обезумивший шарпо-дотнетовский мух поспешает на захист майкрософта.
Давай без детского сада, если это тот анон что жалуется на ограничения. Я повторяю свой вопрос
>Какой из инструментов .Net от тебя зажали и не дают пользоваться. Только аргументировано и без воды.
Дебагер и горячая перезагрузка норм только на винде. То есть, мне как бы дядя намекает, что комфортнее будет на более правильной ОС, причем последней версии.
Это смешно продавать свой мейн продукт через 1,5 программиста.
Я дал обобщенный ответ на твою позицию. Ты сразу заплакал и попросил конкретизации, на что я уточнил, что сначала конкретизировать должен ты.
Ты хочешь победить в логике бывалого программиста?
>Вообще то Майкрософт уже не занимается развитием C# и .NET. Есть специальная организация .NET Foundation
Ты пытаешься всех переиграть через наивность?
>О боже, у шарпового колосса две глиняных ноги
У жабы, кстати, тоже так же, тоже слишком раздут пузырь величия.
-Нехера не развивается.
-Срыг тормозит, если юзать кроме срыга - тотальных колхоз.
-Всякие тырпрайз базворды - нечитаемы, тонна размазанного говнокода.
-У котлина асинхронщина тормозит на уровне динамикодресни, то есть ты берешь асинки и у тебя становится хуже, лол
-Жрет память аке быдло, бобр курва!
-Тормозит ппц, пока джит не проснется и не уберет говно из кода, а потом в середине накроется тазом и снова вставит не оптимизированный байткод, чтобы в прайм-тайм все от нагрузки офигели.
-Легаси, одно сплошное легаси, спасет только вакансия котлина, раз в месяц.
Ну еще туча говна, которого я не вспомнил.
Пиздец 👍
Так так и есть. Я участвовал в проекте распределенного фултекстового поискового движка, так он гигабайты перемалывал полностью на джаве без проблем. А если начитаться клин кода или ещё какой-нибудь мало связанной с реальностью дрисни, так можно и с++ заставить лагать, дурное дело - нехитрое.
Ну вот, может даже гранты какие-нибудь выбъете с таким названием
Пахахаххахахах, вот это гениально. Просто похлопаю в ладоши за этот "маркетинговый" ход.
Горячая перезагрузка -- это изначально порочное говно, которое никогда и нигде нормально не работает.
Кто куда выиграл? Я просто говорю, что на каких бы языках я не писал, везде хот релоад работал глючно, через жопу, и единственным нормальным способом убедиться, что твоё изменение кода работает как надо, приходится перезапускать программу. Потому что дохуя всего происходит при инициализации приложения или сайта, и простая подстановка нового кода на уже существующее неактуальное состояние приводит твоё приложение в совершенно невообразимую форму, где могут появляться несуществующие глюки или, наоборот, существующие могут себя никак не проявлять. Никто никогда не может тебе дать гарантий, что твой софт после хот релоада работает так же, как и при перезапуске, поэтому эта фича не только бесполезная, но и просто вредная.
Вот это наброс. Пойду всем проповедовать кубы на винде, надеюсь только обоссут
Да лан тебе, в флаттере и фронтенде хот-релоад это благо, без итераций по 5 сек было бы очень неудобно. Так что это не порочно, это хуево реализовано
>>3174339
Думаю, это так же все фиксится jfrog'ом. Сама мера, правда, топ – олигархи как кайфовали, так и кайфуют, а вот ты, Ваня, нехороший такой, хуй тебе, а не докер-образ! После этого ведь все сразу станет хорошо
Алсо CLR via C# 2008 года издания устарела? Взял в буккроссинге.
В рамках моей задачи было то что нужно. Я даже поэтому в шарпы залез, увидев рекламку где-то.
Но мягкие видимо начали закручивать EEE, раз работает норм только на винде.
Ну мы тут и говорим, хочешь хорошие шарпы, изволь маздаять, а то видишь ли, попенсорсу захотелось.
Ну мало ли, может фундаментальные принципы, БАЗА так сказать, остались неизменными.
Или ты это к вопросу про джунов...
2011, а чо?
"У меня есть спринг и у тебя есть спринг. У меня есть asp.net, а ты идешь нахуй."
>Ну мало ли, может фундаментальные принципы, БАЗА так сказать, остались неизменными.
Та самая бааз-база, которая описана у Рихтера может быть и актуальна, но джуну совсем нахуй сейчас не уперлась.
У меня как раз во флаттере вообще постоянно ломался хот релоад.
Это всего год назад было. Может, конечно, сейчас что-то починили, но это кажется сомнительным. Мне вообще задача хот релоада кажется уровнем задачи останова, то бишь нерешаемой. Могут быть только приблизительные решения, которые, как я уже писал, никаких нормальных гарантий дать не могут.
Да похуй собственно. Все равно в своей нише удобнее asp.net-а для разработки человечество ничего не придумало пока.
>но джуну совсем на🌶 сейчас не уперлась.
Джуну не нужно много знать про CRL. Есть C# in Nutshell.
А вообще, джуну нужно МНОГО ПРАКТИКИ, а не теорию дрочить.
Почему эта хрень отжирает память в 2-3 раза больше чем жаба?
https://youtu.be/6WL4UjubvOE?t=162
Маня-тесты, в которых замеряет размер дефолтного пула.
Единственно кто там дал 1млн тасок это го (2кб на горутину)
Находил российскую компанию AgileFluent, но отзывов о ней мало, и те, что находились, плохие. Везде светились с агрессивной рекламой, а по факту правят CV и работают с ленцой.
Берут они до🌶. Например, 1000 USD за 200 вакансий, аналогигчные фрилансеры https://www.fiverr.com/ берут по доллару за вакансию.
Есть ещё recruitment agency, но это надо изучать. Там рынок честнее, как я понимаю.
есть таблица
CREATE TABLE [dbo].[Table] ( [Type] CHAR(3), [Author] TEXT, [Name] TEXT);
Да, без первичного ключа. у меня база данных 30 летней давности в которой никто этого не делал. мне с ней работать - запросики пулять
соответственно к ней модель
class Table
{
public string Type { get; set; }
public string Author { get; set; }
public string Name { get; set; }
}
Пишу запрос
var sql = "SELECT FROM [dbo].[Table] WHERE Author = '@authorName'";
var table = connection.Query<Table>(sql, new { authorName = "test" }).ToList();
хуй, выдает ошибку
The data types text and varchar are incompatible in the equal to operator."
ИИ Чат даппера предлагает переписать запрос так
"SELECT FROM [dbo].[Table] WHERE CONVERT(nvarchar(MAX), Author) = @authorName"
ну это же хуеблядство - я же и беру ORM чтобы не ебаться со всеми этими конвертациями типов
>я же и беру ORM чтобы не ебаться со всеми этими конвертациями типов
Ну так даппер - это мини-ОРМ, не хочешь трахаться - бери полноценную.
Даппер не виноват, что у убогого sql несколько типов для хранения строк.
А если подумать
Char хранит ASCII.
Char(3) - это три символа ASCII, например HEX будет (48 45 58)
А если будет конвертировать в UTF16, то первый символ будет иметь код u+4845, а второй - u+58... а второй код какой? Ну значит такая строка не конвертируется
https://www.youtube.com/watch?v=72y2EC5fkcE
Chatgpt (только 4 и 4о, но никак не 3.5!) объяснит и ответит даже на самые тупые вопросы
Только неправильно в половине случаев.
"Мне повезёт"
https://futurism.com/the-byte/study-chatgpt-answers-wrong
Так это фича игровых движков (и то не всех), она к майкрософтовскому хотрелоуду отношения не имеет от слова совсем.
Практический как и шарп в юнити
Ты напоминаешь какого-то деда с хабра с фурри на аве, который тоже в лютое отрицалово уходит, мол, да как можно пользоваться нейронками, надо верить только сертифицированным кадрам!
Просто попробуй. Если нет доступа, я могу заскринить ответ на твой вопрос. GPT-4/4о уж точно сможет объяснить массивы, это не какая-то сложная математика, где можно столкнуться с неверной инфой. Маленькая вероятность поесть говна с лихвой перекрывается возможностью спросить что угодно
+ если пользоваться учебниками и просить объяснить непонятные моменты, то вероятность галлюцинаций еще меньше. Если что, новую инфу я только так и постигаю, потому что план обучения в книге явно лучше будет составлен. А когда уже знаешь, как должен выглядеть конечный результат, но лень самому его воплощать руками – тут-то нейронки раскрываются во всей красе
>Ты напоминаешь какого-то деда с хабра с фурри на аве, который тоже в лютое отрицалово уходит, мол, да как можно пользоваться нейронками, надо верить только сертифицированным кадрам!
>Просто попробуй. Если нет доступа, я могу заскринить ответ на твой вопрос. GPT-4/4о уж точно сможет объяснить массивы, это не какая-то сложная математика, где можно столкнуться с неверной инфой. Маленькая вероятность поесть говна с лихвой перекрывается возможностью спросить что угодно
Я те конкретно скинул ссылку на исследование результатов, где написано, что вероятность поесть говна не маленькая. Плюс я сам некоторое количество времени провёл оценивая эти ответы (см. dataannotation), и ни разу не встречал идеально хороший ответ.
>+ если пользоваться учебниками и просить объяснить непонятные моменты, то вероятность галлюцинаций еще меньше. Если что, новую инфу я только так и постигаю, потому что план обучения в книге явно лучше будет составлен.
Совсем базовые вещи, ок. Да, на вопросы, которые разжёваны сотни раз, гопота ответит нормально. Только непонятно нахер она нужна, если этот ответ и так будет во всех десяти первых ссылках в гугле.
>А когда уже знаешь, как должен выглядеть конечный результат, но лень самому его воплощать руками – тут-то нейронки раскрываются во всей красе
Это полная чушь. Если я знаю, какой должен быть код, мне проще его написать самому, потому что нейронка напишет его в неправильном стиле. И вообще нейронка не создаст мне структуру из десятка дто и сервисов с интерфейсами, и не пропишет их все в DI, а это как раз самое тупое занятие, которое неплохо бы автоматизировать.
А если ты не знаешь ответ, то за нейронкой надо всё проверять, а для этого надо самому разобраться, а это как раз занимает больше всего времени, и толку от нейронки, получается, никакого нет. Ну или можно это хуяк-хуяк и в продакшен, а потом извиняться перед клиентами за проёбанные данные и полгода баги фиксить. Короче говоря, то же самое, что в Индию на аутсорс отдать проект, получив if(val.ToString()=="True") на выходе.
>Ты напоминаешь какого-то деда с хабра с фурри на аве, который тоже в лютое отрицалово уходит, мол, да как можно пользоваться нейронками, надо верить только сертифицированным кадрам!
>Просто попробуй. Если нет доступа, я могу заскринить ответ на твой вопрос. GPT-4/4о уж точно сможет объяснить массивы, это не какая-то сложная математика, где можно столкнуться с неверной инфой. Маленькая вероятность поесть говна с лихвой перекрывается возможностью спросить что угодно
Я те конкретно скинул ссылку на исследование результатов, где написано, что вероятность поесть говна не маленькая. Плюс я сам некоторое количество времени провёл оценивая эти ответы (см. dataannotation), и ни разу не встречал идеально хороший ответ.
>+ если пользоваться учебниками и просить объяснить непонятные моменты, то вероятность галлюцинаций еще меньше. Если что, новую инфу я только так и постигаю, потому что план обучения в книге явно лучше будет составлен.
Совсем базовые вещи, ок. Да, на вопросы, которые разжёваны сотни раз, гопота ответит нормально. Только непонятно нахер она нужна, если этот ответ и так будет во всех десяти первых ссылках в гугле.
>А когда уже знаешь, как должен выглядеть конечный результат, но лень самому его воплощать руками – тут-то нейронки раскрываются во всей красе
Это полная чушь. Если я знаю, какой должен быть код, мне проще его написать самому, потому что нейронка напишет его в неправильном стиле. И вообще нейронка не создаст мне структуру из десятка дто и сервисов с интерфейсами, и не пропишет их все в DI, а это как раз самое тупое занятие, которое неплохо бы автоматизировать.
А если ты не знаешь ответ, то за нейронкой надо всё проверять, а для этого надо самому разобраться, а это как раз занимает больше всего времени, и толку от нейронки, получается, никакого нет. Ну или можно это хуяк-хуяк и в продакшен, а потом извиняться перед клиентами за проёбанные данные и полгода баги фиксить. Короче говоря, то же самое, что в Индию на аутсорс отдать проект, получив if(val.ToString()=="True") на выходе.
>Был оракл и авс, но теперь их нет
Не 🍑и чепушило. Кого нет-то, долбоёбина? Можно любую рандомную страну на любом рандомной сайте указать. Чё они пойдут паспорта проверять или что? Вбиваешь в гугл "виртуальные номера для приёма смс", стоит от 1 до 5 рублей активация. https://5sim.biz/ и всё берёшь пользуешься.
Угомонись, чурка
>>бесплатный хост куда можно залить аспнет приложение с базой
>localhost
А можно я залью свое приложение на твой локалхост? моргание ресницами
Заливай на dumb@127.0.0.1
Бамп вопросу.
Как вообще расти профессионально? Работаю лет 5. Подрочить Литкод? Писать и дальше микросервисы? Проходить курсы по мышинному обучению в Coursera?
>Как вообще расти профессионально?
Брать на себя все более сложные и навороченные задачи. Попробовать утянуть часть функционала лида/аналитика/архитектора.
>>3184175
>Работаю лет 5. Подрочить Литкод?
Если у тебя после 5-ти лет работы возникают вопросы, а не политкодить ли мне, то что-то ты делаешь неправильно. Для тебя это должен быть уже пройденный этап.
>а не политкодить ли мне, то что-то ты делаешь неправильно. Для тебя это должен быть уже пройденный этап.
Я не заморачивался алгоритмами, но слышал, что это полезно для воображения.
.net core - must
Asp.net core - recommended , must if working with APIs
Angular/react/blazor - 1-2 of listed is essential
Node - good to have
Python, powershell - meh
Docker, Microservices - must
Kubernetes(k8)- good to know
Sql server - good to know
NoSql, cosmos/mongo - one is must
Devops, Jenkins - good to know
Azure/AWS/GCP - you must be a living god in one of them
ARM/Bicep/Terraform - one or more is good to know
Service bus/Kafka/RabbutMQ(Eventing) - one is a must
AI, LLM - very nice to have
.net core - must
Asp.net core - recommended , must if working with APIs
Angular/react/blazor - 1-2 of listed is essential
Node - good to have
Python, powershell - meh
Docker, Microservices - must
Kubernetes(k8)- good to know
Sql server - good to know
NoSql, cosmos/mongo - one is must
Devops, Jenkins - good to know
Azure/AWS/GCP - you must be a living god in one of them
ARM/Bicep/Terraform - one or more is good to know
Service bus/Kafka/RabbutMQ(Eventing) - one is a must
AI, LLM - very nice to have
I have been job searching recently and I found the below skills in order of highest demand in the UK market.
Docker/Kubernetes. Requested by absolutely everyone even companies that are not using them. Particularly for backend jobs, this also comes with the expectation of knowing some bash/powershell for scripting build automation.
AWS/Azure. Same as with above, universally asked even where not practiced. Most .NET shops want Azure but every non-.Net role (if you’re okay with branching out) seemed to want AWS. Every Java, Go, Node.JS job out there was AWS. If you’re more backend than frontend, expect to be asked about Terraform too.
JS/TS + React/Angular. I would say 7-8/10 full stack roles I came across were React, it’s that dominant in my region. Also, more than half of the jobs were full stack. There are backend-only jobs in .Net if that’s your thing, but it seems rather limiting job-wise if you cut front-end work completely off.
SQL/NoSQL. On the SQL side MS SQL Server is dominant for .Net roles. PostgreSQL seemed to have more traction outside of them, with MySql secondary. On the non-SQL side it was mostly MongoDB and ElasticSearch. Some CosmosDB and Azure AI search here and there. SQL skills in demand, EF a nice bonus but not must have.
Messaging and Distributed Caching. Azure Service Bus, Rabbit MQ, Kafka and Redis seemed most dominant here.
В рамках рф клауд не нужен, нода тоже, ангуляр почти не встречается, LLM вообще в рф проспали кабаны.
Хайп - это конец 2022, когда во всех тредах каждый третий пост был про чатботы. Сейчас так, отголоски прошлого. Лет через 5 и вовсе перестанут упоминать.
>В рамках рф клауд не нужен, нода тоже, ангуляр почти не встречается, LLM вообще в рф проспали кабаны.
А если я не в РФ?
Они намешали три роли в одну: фронт, бэк и девопс. Так бывает в помойных израильских финтех стартапах и на галерах у индусов и хохлов, которые эти стартапы обслуживают. Один человек не может работать за троих, получается всегда говно. В продуктовых конторах такой хуйни нет, там или ангуляр, или тераформ, а не заебаный человек-оркестр.
Nosql - это кафка и редис, есть почти везде. Монга - это литерали говно без задач, постгрес умеет делать то же самое и намного больше.
Это неправда. В продуктовых конторах вполне может быть в команде 5 программистов, каждый из которых фуллстек и даже немного девопс. Суть в том, что они более-менее взаимозаменяемые, и если один сваливает в отпуск, увольняется или попадает под автобус, то работа внезапно не встаёт, потому что все остальные не знают как терраформ настроить или в галпе что-то поменять.
>Они намешали три роли в одну: фронт, бэк и девопс.
https://www.youtube.com/watch?v=SuQb-FksaRI
>В Белоруссии всё то же самое.
>>3182857
>А если ты не знаешь ответ, то за нейронкой надо всё проверять, а для этого надо самому разобраться, а это как раз занимает больше всего времени, и толку от нейронки, получается, никакого нет. Ну или можно это хуяк-хуяк и в продакшен, а потом извиняться перед клиентами за проёбанные данные и полгода баги фиксить. Короче говоря, то же самое, что в Индию на аутсорс отдать проект, получив if(val.ToString()=="True") на выходе.
Нейронка помогает изучать некоторые нюансы по принципу "уточнил у нейронки затык, протестировал решение на практике, читнул доки и статьи, разобрался в теории и практике, отлично запомнил".
Уровень "it-юмор на пикабу", oh wait...
=UwU=
то что надо збс
Что конкретнее тебя интересует? По чатам лучшие это:
- https://t.me/DotNetRuChat (общий по дотнету без геймдева)
- https://t.me/pro_net (для байтоебов)
DotNetRuChat
Помойка ебеная, года так 3 назад забанили за вопрос так как посчитали его не этичным. А всего то спросил как текст со страницы взять, или что то в этом роде, корочи нубский вопрос.
>у майкрософта просто наипарашнейший нейминг
К сожалению да, это всегда было.
>У жабы куча всяких чатов в телеге, где можно быстро что-то спросить
У майков для этого есть нормальная документация и stackoverflow, на которых практически все разжевано. Если ты не найдешь этого там, то и чаты тебе не помогут.
>Насколько часто используется record?
Постоянно.
>Приведите пример использования.
Любой кейс где нужна иммутабельность.
Часто. Для различных DTO-х.
>У майков для этого есть нормальная документация
Ну хуй знает, я только с wpf работал в основном и это была просто, блять, худшая документация
Тут уже выше горели с этих трёх букв
У wpf нет документации, там сплошь xml магия и люди пользуются отладчиками чтобы отследить иерархию объектов ради накостылять хаков чтобы работало как тебе надо. Ебучий вендорлок.
Ты дурачок? Документация в ВПФ одна из лучших, если не лучшая, среди всех фреймворков. И с чего ты решил, что какая либо документация может избавить тебя от необходимости заглядывать в дерево объектов мне не ясно.
Либо кейс либо ифы, если ты решишь сделать свич по строкам вида "Систем.Инт", то тебя рано или поздно отпиздят
Ты ебанутый? ты скажи, не стесняйся
Я и во фронт умею, и в бэк, и в обработку данных, но когда в самом начале моего опыта, мне дали проект на wpf, это был пиздец, это был кошмар, это была моя Варфоломеевская ночь в мире разработка
> Typescript не дает статической типизации
Как раз её он и даёт, если не выключать проверки. Статическая типизация = проверке корректности работы типов во время компиляции.
В рантайме все также динамическая типизация, и очень ограниченная информация о типах.
https://www.youtube.com/watch?v=bXzTXD_OJo0
Cкажи это Луговскому.
КАВО нах? У впф её считай нет. Хочешь посмотреть, как работает такая-то хуйня, гуглишь, а там просто описание в одну строчку. Всё. 0 примеров, 0 пояснений, просто нихуя. Даже хуй пойми какие аргументы передавать.
Делаю бинарный кастомный сериализатор. Хотел по свитчу все типы красиво мэппить в байты и обратно. В одну сторону на сериализации нормально работает т.к. там значение передается, а в обратную хер там, т.к. на руках только массив байт и тип.
byte[] Serialize<T>(T obj);
T Deserialize<T>(byte[] bytes);
Нет. Думаю, с таким опытом много людей
Почему это?
inb4:ты додик и т.п и т.д
а блять, надо сам класс передавать, а не переменную.
Я мимокрок, неделю сижу хуярю в WPF и мне очень нравится. XAML прям 1 в 1 HTML+CSS. По разметке все очень понятно, а в остальном по фронту я чет не понимаю какие проблемы могут быть и что там непонятно кроме самого C#, от него по сути только и нужно что создавать элементы\вешать хендлеры на них.
Проблема не в WPF. Если ты пишешь как на ангуляре, все ок.
Проблема в концепции MVVM. Она не прошла проверку временем, ее придумали когда еще не было смартфонов, не было бэкэнда, в современном программировании это литерали хуйня без задач. Если неопытный джун начинает писать по гайдам, получается лютый пиздец. У микрософт в принципе все плохо с современными технологиями, там сидят деды, которые застряли в 1995 году, и придумывают Blazor.
Не пизди поредж, как раз когда писали деды всё было ок, последние лет 15 там по квотам набрали всяких баб, чурбанов и педерастов вот они и наговнокодили.
mvvm это круто, а ты чух неосилятор.
Разве сейчас кто-то пишет десктопные приложения? Как бы 2024 год на дворе, не 1994.
Ну не всем же веб мастерами работать и писать тупопёздные апплеты для куриц.
ебанная макака абу со своей капчей
Нет, конечно, что-то используется всё время, что-то очень редко. Но учить лучше всё, мало ли чей код придётся поддерживать.
Мефедроном
Есть приложение WPF, в нём 2 окна: mainWindow и searchWindow. Основное окно отображает подробности о записях из БД (пусть будет фио, возраст, пол, зарплата, стаж, адрес), а поисковое показывает сокращённую информацию (например, только фио и возраст, а вся остальная информация содержится в локальной ObservableCollection и ждёт пока её отправят в основное окно) о тех же записях после поиска по БД.
Что я хочу: после поиска по БД отобразить информацию в датагриде основного окна.
Как я это пытался сделать:
использовал привязку к глобальной ObservablaCollection датагрида из основного окна, а в методе передачи данных сперва чистил эту коллекцию .Clear(), а затем пересоздавал примерно так
App.globalCollection= new ObservableCollection<MyType>(SearchWindowCollection);
В результате в основном окне был пустой датагрид, но сама App.globalCollection была с данными.
При замене кода пересоздания коллекции на заполнение с помощью foreach всё заработало как нужно. Разве привязка не должна ориентироваться на переменную, а не на объект где-то в памяти?
Пробовал делать NotifyChanged для свойства с коллекцией? Т.е. если в main window ты биндишься на Items, сделай NotifyChanged(nameof(Items)).
Жир.
Это был пук с точки зрения безработного скуфидона? Или ты провинциальный программист на заводе и за рынком совсем не следишь?
Это был пук в ебало малолетнего долбоёба у которого вместо мозга насрано.
Ну и ладно, чо.
Зачем? Может на Си сразу заменять, ещё удобнее будет
vim-like эдиторы ставишь и кайфуешь
После этих слов в треде начался сущий кошмар
В большинестве вообще никак не называются, просто есть параметр которым управляешь логикой инстанцирования.
>Пробовал делать NotifyChanged
Нет. Но на всякий случай загуглил - устарело не менее 7 лет назад. Но идея интересная, надо глянуть. А вообще, я и так с не особо свежим шарпом работаю, а тут выходит ещё большее погружение.
Пиздабол. Приведи хоть один пример такого
Что? Ты везде регистрируется как transient, scoped или singleton. Где-то ещё есть per web request, что просто является частным видом scoped.
Это так в NInject, Castle Windsor, Autofac и нынешнем встроенном DI ASP.NET Core.
Я абсолютно уверен, что у жаб оно так же называется.
>Но на всякий случай загуглил - устарело не менее 7 лет назад
А что сейчас модно и молодежно?
>Как я это пытался сделать:
использовал привязку к глобальной ObservablaCollection датагрида из основного окна, а в методе передачи данных сперва чистил эту коллекцию .Clear(), а затем пересоздавал примерно так
>App.globalCollection= new ObservableCollection<MyType>(SearchWindowCollection);
ObservableCollection уведомляет только, если ты меняешь итемы. Но если ты меняешь сам экземпляр коллекции, то никаких уведомлений для твоей вьюшки естественно не произойдет. Поэтому свойство, содержащее коллекцию тоже должно вызывать PropertyChanged (гугли INotifyPropertyChanged).
Во-вторых, проблема ObservableCollection в том, что привязка может одномоментно зафиксировать изменение только одного итема, поэтому там нельзя как в List добавить\удалить несколько итемов за один раз. Даже если ты обманешь систему и создашь свою кастомную коллекцию, наследующую ObservableCollection, и реализуешь методы AddRange или RemoveRange, то они просто так не сработают. В связи с чем возникают вопросы относительно метода Clear, потому что в данном случае он будет работать как RemoveRange и при помощи цикла удалять по одному итему с вызовом события по каждому такому удалению.
Но это так, просто пища для размышлений на тему того, что ты решил обойти отсутствие AddRange и RemoveRange. Поэтому у тебя два пути:
1. Ты оставляешь как есть, и правишь только один ридонли экземпляр коллекции: очищаешь итемы и циклом заполняешь.
2. Либо переделываешь свойство коллекции в INotifyPropertyChanged. Это вариант более предпочтителен хотя бы потому, что у тебя может быть несколько баз данных. В этом случае не нужен Clear, если тебе нужно один список заменить на другой.
Ну и еще. Ты не спрашивал, но читая про mainWindow и searchWindow, второе окно мне напомнило фильтрацию списка. Это так называемый список-прокладка между твоим датагридом и оригинальным списком данных, в котором содержатся только отфильтрованные элементы по правилу, которое ты сам создаешь. Этих правил может быть множество.
Грубо говоря, ты мог бы сделать только одно окно mainWindow, но со строкой поиска и каким нибудь комбобоксом или чекбоксами, при помощи которых ты бы отображал только фио и возраст, а все остальное скрывал.
Тутор: https://youtu.be/wpBRHNDFXYI
Есть еще такое же, но с группировкой и сортировкой таблицы. Ты мог бы, к примеру, отсортировать по именам, а потом это все сгруппировать в блоки. Причем эти блоки компонуются в экспандер, который можно свернуть.
>>3203148
>Но на всякий случай загуглил - устарело не менее 7 лет назад.
Возможно он так сократил INotifyPropertyChanged, потому что я не слышал, чтобы это устарело, к тому же коллекция ObservableCollection сама реализует INotifyPropertyChanged и INotifyCollectionChanged.
>Как я это пытался сделать:
использовал привязку к глобальной ObservablaCollection датагрида из основного окна, а в методе передачи данных сперва чистил эту коллекцию .Clear(), а затем пересоздавал примерно так
>App.globalCollection= new ObservableCollection<MyType>(SearchWindowCollection);
ObservableCollection уведомляет только, если ты меняешь итемы. Но если ты меняешь сам экземпляр коллекции, то никаких уведомлений для твоей вьюшки естественно не произойдет. Поэтому свойство, содержащее коллекцию тоже должно вызывать PropertyChanged (гугли INotifyPropertyChanged).
Во-вторых, проблема ObservableCollection в том, что привязка может одномоментно зафиксировать изменение только одного итема, поэтому там нельзя как в List добавить\удалить несколько итемов за один раз. Даже если ты обманешь систему и создашь свою кастомную коллекцию, наследующую ObservableCollection, и реализуешь методы AddRange или RemoveRange, то они просто так не сработают. В связи с чем возникают вопросы относительно метода Clear, потому что в данном случае он будет работать как RemoveRange и при помощи цикла удалять по одному итему с вызовом события по каждому такому удалению.
Но это так, просто пища для размышлений на тему того, что ты решил обойти отсутствие AddRange и RemoveRange. Поэтому у тебя два пути:
1. Ты оставляешь как есть, и правишь только один ридонли экземпляр коллекции: очищаешь итемы и циклом заполняешь.
2. Либо переделываешь свойство коллекции в INotifyPropertyChanged. Это вариант более предпочтителен хотя бы потому, что у тебя может быть несколько баз данных. В этом случае не нужен Clear, если тебе нужно один список заменить на другой.
Ну и еще. Ты не спрашивал, но читая про mainWindow и searchWindow, второе окно мне напомнило фильтрацию списка. Это так называемый список-прокладка между твоим датагридом и оригинальным списком данных, в котором содержатся только отфильтрованные элементы по правилу, которое ты сам создаешь. Этих правил может быть множество.
Грубо говоря, ты мог бы сделать только одно окно mainWindow, но со строкой поиска и каким нибудь комбобоксом или чекбоксами, при помощи которых ты бы отображал только фио и возраст, а все остальное скрывал.
Тутор: https://youtu.be/wpBRHNDFXYI
Есть еще такое же, но с группировкой и сортировкой таблицы. Ты мог бы, к примеру, отсортировать по именам, а потом это все сгруппировать в блоки. Причем эти блоки компонуются в экспандер, который можно свернуть.
>>3203148
>Но на всякий случай загуглил - устарело не менее 7 лет назад.
Возможно он так сократил INotifyPropertyChanged, потому что я не слышал, чтобы это устарело, к тому же коллекция ObservableCollection сама реализует INotifyPropertyChanged и INotifyCollectionChanged.
Ах да, не помню точно, но вроде как у меня возникала проблема, когда циклом добавлял элементы в ObservableCollection, и если они добавляются слишком быстро, то возникают траблы с обновлением привязки. Точно не помню как я это решил, надо посмотреть.
Не согласен.
Способ 1. Я могу подписаться на PropertyChanged, а потом устроить что-то вроде if с проверкой имени изменяемого свойства. Проблема в том, что это событие будет возникать гораздо чаще, чем будет изменяться интересующее меня свойство. Плюс проверка стрингов как-то не очень эффективна на мой взгляд, особенно когда свойств будет несколько десятков.
Способ 2. Я могу создать подписку при помощи
BindingOperations.SetBinding, ну или обычным биндингом в XAML. Но вопрос в том, как эта привязка работает, и будет ли она более эффективной, чем вышеописанный способ 1? Потому что для привязки указывается путь к привязываемому свойству в виде той же строки, и это выглядит так, что она подписывается на все тот же Source.PropertyChanged и все так же при помощи Path определяет необходимое свойство.
Ну вот, ради такой простой задачи приходится вешать целый мидлварь. Вопрос - нахуя и зачем? Почему в языке в котором есть рефлексия нет фичи которая при сборке бы проходилась по всем контроллерам и добавляла бы к их роуту префикс?
Очевидно потому что никто дальше хотелки не ушёл, а текущее решение позволяет менять префикс глобально для всех путей, динамически, несколько раз и не ломая логику всех обработчиков которые не знают про префикс. И даже ты пришел просто повонять, но не сделать хоть что то.
Пиздеть не мешки ворочать.
Хуёвое но быстро работающее решение это патчить дерево по которому подбирается эндпоинт один раз при запуске.
Я не воняю, у меня просто боль что есть много вещей которые а) делаются миллионом разным путей и приходится ещё определять который из способов актуален для моей платформы и не похерит мне всё после внедрения и б) делаются длинной и зачастую не самой интуитивной мишурой из кода.
Ну так переключись на другой язык, где тебе все понятно и удобно и от которого ты будешь кайфовать.
Ну если бы на расте была работа я бы тут не ныл
>Я не воняю, у меня просто боль что есть много вещей которые а) делаются миллионом разным путей и приходится ещё определять который из способов актуален для моей платформы и не похерит мне всё после внедрения и
Увы, это так везде.
>б) делаются длинной и зачастую не самой интуитивной мишурой из кода.
Не бывает так, чтобы все вещи всегда делались легко и просто. Обычно делают так, чтобы наиболее часто используемые вещи делались просто, а всё остальное как получится.
Мне вот за 10 лет разработки веба на шарпе ни разу не приходилось делать так, чтобы у всех контроллеров в проекте были одинаковые префиксы.
Его задача с префиксами решается за один вызов метода. Скорее всего он просто не разобрался с подходом работы мидлвэеров и влепил юзпасбэйс куда нибудь в самый конец
Обосрался
error NETSDK1032: The RuntimeIdentifier platform 'win-x64' and the PlatformTarget 'x86' must be compatible
В гугле ничего путного не находит.
А как это сделать под VS? Я не из командной строки собираю.
Блейзор ковыряю, хочу сделать отдельной либой дтохи, но в одной из дтох используется интерфейс блазора.
Я думал что достаточно адд пэкейдж этого неймспейса сделать, он загрузился, но сук именно нужного интерфейса почему-то там нет, шо за хуйня?
Про IBrowserFile речь в AspNetCore.Components.Forms
Скорее всего я что-то горожу фундаментально неправильное, буду благодарен если поправите
Тебе нужно указать что либо юзает асп кор
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/target-aspnetcore
Ой, вместо Forms там Web оказывается, не то подтягивл. Спасибо спасибо
Есть сервис, который читает сообщения из рэббита, сообщения (json-ы) из очереди имеют три разных типа. Тип в данном случае - это enum, который записывается в одном из полей сообщения, и в зависимости от типа идёт сохранение в соответствующий репозиторий.
сейчас тип проверяется с помощью switch и на каждом case идёт сохранение в соответствующий репозиторий.
Есть идея заменить switch на словарь, то есть, в классе обработчика сообщений будет поле:
IDictionary<MessageDataType, Func<Message, Task>> _handler = new IDictionary()
{
MessageDataType.Software, async (Message msg)
{
await _softwareRepository.SaveAsync(msg);
}
};
в методе получение сообщения будет вызов:
await _handler[msg.DataType].Invoke(msg);
Насколько сильно это может ускорить обработку, если сообщений может быть несколько тысяч?
Что то мне говорит что внутренняя логика сохранения в несколько порядков дольше работает чем выбор куда сохранять.
Ты бы в начале трейсы собрал а потом уже что то делал. Сейчас ты тычешь в небо.
И несколько тысяч месседжей это копейки. Тестил не так давно асп кор на рпс, весь стандартный для веб сервиса пайплайн аспа + достаточно средней тяжести логики выдавал 5-6к рпс, а дальше упирался в гигабитную сеть -_-
>Насколько сильно это может ускорить обработку
Нинасколько, switch быстрее, тем более по enum-у.
И? Это уже сериализация и перегонка байтов по сети + работа редиски и не забывай что при получении с рэбита делается тоже куча вещей. А ты пытаешься сэкономить время на одном вызове (и как выше сказали хочешь сделать даже хуже чем есть).
Сделай замеры хотя бы прикрутив тот же otel, а потом приходи к нам. Никто не любит таких мамкиных оптимизаторов которые думают что вот точно сделают лучше и ускорят весь пайплайн но даже не знают где теряется время
>заменить switch на словарь
Никогда так не делай. Ты охуеешь потом разбираться в коде. Свич у тебя вот он весь перед глазами, а словарь ебаный заполняется хуй пойми где.
Вопрос удобства сопровождения кода. Со словарем ты тупо можешь загонять в него логику из конфига или БД, а со свичом тебе при каждом изменении придется лезть в код, где этот switch может быть запрятан хер знает где, в то время как словарь обычно сразу в начале класса болтается в private readonly, или где-нибудь в инициализации.
Мне приходят байты, о одной ОЧень долгой функции, есть возможность взять их больше.
Как мне их запастись "впрок" чтобы чуть ли не каждый цикл к ней не обращаться? Как это будет выглядеть на Языке? Спасибо.
>Как мне их запастись "впрок"
Складывай их за щеку, а потом проверяй.
Какой вопрос - такой ответ.
Я видел подобное в библиотеке Whisper.net
Там идет распознавание речи с аудио или видео, и ты при помощи асинхронного цикла, каждую итерацию получаешь строку субтитров с временным диапазоном (пикрил 1). Можешь эту либу поковырять и посмотреть как устроено.
Так же ты можешь запустить асинхронный метод, который выдает результат при помощи вызова события. Так работают, к примеру анимации в WPF - там есть событие когда анимация полностью завершена и событие для каждого шага анимации.
Или такое используется в именованных каналах (NamedPipe). Причем подписка на событие идет прям в момент запуска метода. Я видел и такое. Мне надо было передать информацию из одного приложения в другое, и я пользовался NamedPipe. Как только одно приложение отправляет данные, то второе приложение при помощи события эти данные получает.
Да ты не спеши с благодарностью. Там по каждой теме я несколько дней ковырялся.
По поводу метода с событием. Чтобы ты понимал в какую сторону копать, возьмем например именованные каналы: на скрине асинхронный метод BeginRead принимает делегат типа AsyncCallback - сюда ты пихаешь ссылку на метод, который будет вызываться изнутри асинхронным методом по каким-то там твоим условиям. Обычно указанный метод вызывается по завершению работы асинхронного метода, потому что делегат возвращает только успешность завершения метода
> public delegate void AsyncCallback(IAsyncResult ar);
Если тебе нужно, чтобы метод вызывался всякий раз, когда набирается определенное количество байтов, то вероятно нужен какой-то свой делегат, чтобы ты мог передавать через него данные.
Но лучше пойти по пути Whisper.net, я просто тогда о таком варианте не знал.
Создаю двумерный массив
int [,] govno = new int [2,2];
Я правильно понимаю что кол-во элементов в этом массиве будет 9? Пушто считается с нуля типо. Если да, то как нахуй отобразить эту парашу нормальным образом? У меня получается только 4.
> Я правильно понимаю что кол-во элементов в этом массиве будет 9?
Нет. Когда ты пишешь new int[n, m], ты сразу указываешь сколько там будет элементов, а не ебешься с индексами. То есть в итоге в массиве элементов будет 4.
Блядь, а какой осёл вообще придумал с нуля считать ну нахуя? Я путаюсь постоянно блядь, заебало это программирование нихуя не понятно везде анал карнавал
Ну и иди нахуй, не для тебя долбаеба делали.
>>3209155
Падажжи чего блядь!?
new int [2,2] если представить в виде таблицы получается
Х Х Х
Х Х Х
Х Х Х
Иначе никак, ибо если обратится к элементу массива int[0,0], то это будет первая строка первый столбец. [1,1] вторая строка второй столбец.
Следовательно,[2,2] это третья строка и третий столбец. Ну вот где я не прав, ну давайте, обоссыте блядь и тут меня.
А теперь создай двумерный массив в котором 0 элементов. Посмотрим что ты придумаешь
> new int [2,2] если представить в виде таблицы получается
> Х Х Х
> Х Х Х
> Х Х Х
Я же тебе сказал, [2, 2] здесь это количество строк и столбцов. Я хз, как ты увидел в
> Х Х Х
> Х Х Х
> Х Х Х
2 столбца и 2 строки
>int [,] govno = new int [2,2];
>Я правильно понимаю что кол-во элементов в этом массиве будет 9?
В VB.net указывается максимальный индекс, а в C# указывается количество элементов. В VB.net это тянется с VBA, где коллекция начиналась с единицы, а не нуля, поэтому максимальный индекс и количество элементов совпадали. Потом VB стал таким же как и шарп — индекс начинался с нуля, но объявление оставили как есть т.е. по максимальному индексу.
Когда я переходил на шарп, то меня этот момент тоже ставил в ступор, типа ты просто указываешь количество элементов и всё. Как будто хочется здесь подвоха.
>>3209155
>Блядь, а какой осёл вообще придумал с нуля считать ну нахуя?
С единицы начинать еще хуже, поверь мне как бейсикобляди. Что-то неизбежно начинается с нуля, что-то с единицы. Любые циклы превращались в ебань, постоянно надо было что-то приплюсовывать или вычитать. Всегда были какие-то лишние проверки и прочая залупа.
Система шарпа требует меньше телодвижений в этом плане.
Ну как я понял, он сам не понял как лучше сделать.
Поэтому я и привел в пример вишпер, где нет какой-то долгой функции, которая возвращает абсолютно весь переведенный текст. К тому же, где-то на середине может произойти сбой и тогда навернется веся проделанная работа.
Поэтому там при помощи цикла ты обращаешься к функции и берешь готовые куски, потом в теле цикла эти куски объединяешь, ну или что-то делаешь еще.
Ну и в целом, в большинстве случаев обен идет пакетами данных. Никто не пересылает огроменный кусок байтов.
List<int> numbers = [10, 20, 30, 40, 50];
Как из него вытащить N рандомных элементов?
Стаковерфловер, ты?
Точно такой же код загуглил, но он не всегда возвращает N сообщений, иногда меньше.
>Стаковерфловер, ты?
>Точно такой же код загуглил, но он не всегда возвращает N сообщений, иногда меньше.
Попизди мне еще тут.
>Я не понял, что произошло, но .ToArray() в конце сделало это рабочим.
Меньше смотри видосиков от индусов и читай мануалы, чтобы понимать как LINQ работает. Иначе хуй ты сможешь нормально с ним работать.
Что ты хочешь от людей которые заводят треды без перекатов.
Это простая штука и вообще универсальная для любого языка
У вас кста в пэхапэ все работает как словарь = хэштаблица
А лист це двусвязный список или же динамический массив, при котором не нужно ручками менять размер массива или выделять память самому и хранится он уже на куче, а не на стеке
Может косноязычно описал, но суть передал
Алсо реквестирую примеры симпл код шаблон дтох в контроллерах, а то попадается только где в контроллере сразу используется модель
Ищи "C# для маленьких и тупых" от ExtremeCode:
https://www.youtube.com/watch?v=86KLS8das2k&list=PLuGqgO5WmeGPTZqDHZDIum3h7HnfBfzmZ
Его же товарищ SimpleCode разъясняет на более серьезных щах:
https://www.youtube.com/watch?v=KyFWqbRfWIA&list=PLQOaTSbfxUtD6kMmAYc8Fooqya3pjLs1N
Кликай по ссылкам и перейдешь на плейлист
Это когда у булеана был размер в один байт? У него четыре байта.
>Это когда у булеана был размер в один байт? У него четыре байта.
Байтоебство без причины - признак дурачины. В шарпе, это может быть и 1 байт и 2 и 4 и 8, все будет зависеть от архитектуры на которой CLR ворочается и до какого значения оно будет выравниваться.
А если более глобально, то если ты не вылезаешь за пределы x64 архитектуры, то тебе должно быть вообще похуй сколько там байт за каким типом в шарпе сидит (ну может только за исключением decimal, да и то больше по другим причинам)
Например рекорды неизменяемы а десериализатор должен заниматься всякими рекурсинвыми проходами по объектам, так что либо оверхед по копированиям одного и того же либо какой-то изврат с временными переменными, вот собственно и хочеццо посмотреть как это правильно делается.
А какая разница между рекордом и любым классом который инстанцируется через конструктор с параметрами?
Так десериализация работает после инстанцирования и инициализации. Или там какая-то сложная параллельная техника когда ты сначала десериализуешь куда-то а потом уже инициализируешь рекорд. Но тут получается все равно оверхед будет, миниимум лишнее копирование.
>>3211648
Чел, в таких случаях, если у тебя так зудит, ты берешь и делаешь бенчмарк, где выясняешь что с какой скоростью работает и сколько аллоцирует памяти. Если не знаешь как - изучи, это несложно и быстро.
По факту, большинство сценариев использования рекордов подразумевают, что ты работаешь либо по заветам дяди Боба, либо функциональщиков, а там вопросы оптимизации и рядом не стоят.
Допустим мой метод возвращает IAsyncEnumerable, сам он сначала получает коллекцию (из кэша) а потом у сервиса запрашивает IAsyncEnumerable, я думал прокатит для первого yield return а потом вернуть IAsyncEnumerable, но нет, в лоб дает вернуть только одно из двух.
>Так десериализация работает после инстанцирования и инициализации
кто сказал? Есть десериализация и через конструктор, просто она требовательна к именам параметров.
Есть и другой путь - ты можешь инстанцировать рекод задав default для каждого параметра. А ужо потом выставить значения свойств как это делает тот же Dapper - то есть с помощью рефлексии пишет в бэкингфилд. Можешь стыбзить у него алгоритм детекта имени бэкингфилда и пиши себе.
Но тут чекнул объявления в своей мухосрани: сишарп вакансий в принципе почти нихера нет. Ну может какой-нибудь юнити девелопер за 60к. Звучит как какая-то хуйня, когда рядом объявления 1с программиста за овер100к.
Можете неграмотному объяснить, что я не обосрался с выбором языка и меня не ждёт зарплата в 60к максимум (ясен хуй я ленивая жопа и ничего не выучу, но даже если выучу, то меня точно не возьмут в тинькоф жрать круасаны, потому что я без опыта). Короче что в принципе делает шарпист в 2024 году?
Я же явно не отберу твой кусок хлеба. Скажи нормально, чем сейчас занимаются шарписты.
>что я не обосрался с выбором языка
Нельзя не обосраться с первого раза. Люди десятилетиями обсираются — это и есть опыт. А в твоей ситуации даже неправильный выбор, но доведенный до конца, будет лучше, чем вечно шароебиться по форумам и тредам с платиновыми вопросами.
>в юнити используется
Синтаксис языка это 5% от всего остального, что тебе придется знать. В юнити свои библиотеки. Помимо прочего, нужно знать и сам юнити. Так что считай это новый сишарп.
Тоже самое и с анрил энжин — там C++ это не обычный C++, там даже примитивные типы заменены на свои собственные, не говоря уже о стандартных библиотеках.
>>3212056
Ты отравлен мыслями о деньгах, и думаешь, что другие такие же. Анон молчит не потому, что боится потерять кусок хлеба, а потому, что такие, как ты, появляются здесь регулярно, но после расспросов о вакансиях не возвращаются никогда, потому что их мало интересует язык — им интересен треп на бесполезные темы.
Если ты хочешь, чтобы тебя покормили темами о зарплатах и вакансиях, то обратись к инфоцыганам типа Скаутина или Дударя — это их хлеб.
>и меня не ждёт зарплата в 60к максимум
Ждет. На первое время даже меньше чем 60К.
Вот если сумеешь продержаться хотя бы год, тогда у тебя будет шанс въехать в более высокие зарплаты. Но для этого нужно будет въебывать так, как ты себе даже представить не сможешь.
>А в чём претензия к Скакутину? Собирался учиться по его книге и курсу.
Чел, если ты сам не можешь объективно по имеющейся открытой информации (по его собственному каналу хотя бы) оценить почему Ромка говноед и качество выдаваемого им контента, то может быть разработка это не твое?
>>3212270
>в моей мухосрани сейчас видел только одну вакансию - юнити разраб. Какие ещё варианты для шарписта?
Очевидный - рассматривать вакансии в других городах.
Если конкретные направления:
1. упомянутый тобой юнити и около геймдев - не советую, зарплаты низкие, потогонка, опыт специфический, не пригождающийся за пределами геймдева почти никогда
2. десктоп разработка. Тут есть два варианта
2.1. Корпоративный софт (часто внутренний) и разработка всяких специфического софта (вроде САПР-ов или еще каких-нибудь инженерных и около того программ) - требуется хороший опыт десктоп разработки, понимание ОС на которой это будет крутиться, часто предметной области и даже вышки. Зарплаты не очень большие, но есть места где платят очень хорошо, плюс можно попасть на реально интересный проект. Но новички там обычно не нужны.
2.2. Всякие заводы и бюджетные конторы с самописным софтом для теть срак из отдела кадров и бухгалтерии. Крайне не советую. Вкатиться легко, но хер потом из этого вылезешь. Низкие зарплаты, паршивые условия и опыт который не пригодится потом нигде (даже в предыдущей категории). И никакой удаленки.
3. Веб разработка. Хорошие зарплаты, много удаленки, много вакансий. Большая конкуренция на вкате. Надо хорошо знать не только язык, но и мейнстримовые фреймворки (ASP.NET, EF и т.д.), SQL, очереди, докеры, паттерны и всякие солиды-хуелиды и дохуя чего еще. Плюс надо учитывать, что от новичков часто требуют фулстек экспириенса, так что придется изучать что-нибудь вроде React-а или Angular-а.
>А в чём претензия к Скакутину? Собирался учиться по его книге и курсу.
Он инфоцыган — соответственно, пользуется слабостями вкатунишек. Устраивал показательные срачи с другими инфоцыганами. Есть большая вероятность, что ты будешь отвлекаться на что-то еще, кроме кодинга, либо автор будет смещать фокус проблемы на какую-то ненужную шелуху.
Как в том туторе про валидацию данных текстбокса в WPF, где один дебил по кличке Дударь делал валидацию If-ами внутри обработчика события Click кнопки, а другой дебил по кличке Сакутин назвал первого плохим программистом и пытался заменить if-ы паттерном "строитель", хотя самого главного они не сказали: в WPF для валидации данных есть ValidationRule и с этого надо начинать, и тогда не нужны никакие флоу интерфейсы и прочий кал. В итоге развели суету, покидались говном, впечатлили вкатунов знаниями паттернов, а код как был в своей основе говном, так таковым и остался.
Но в целом, от просмотра Сакутина, приступы тошноты должны появиться естественным образом, даже если ты не знаешь всего того, что я написал выше. Должен ощущаться некий вайб человека, у которого украли душу.
Ну а если к личности Сакутина вопросов нет, то можешь смотреть.
Запрашиваю лист сущностей, которые содержат в моделе айдишник и экземпляр другой сущности
Хочу обратиться к экземпляру другой сущности через запрошенные, но не могу... это не так работает? Чому-то казалось что оно автоматом запрашиваться будет, если запрашиваю первые
>Чел, если ты сам не можешь объективно по имеющейся открытой информации (по его собственному каналу хотя бы) оценить почему Ромка говноед и качество выдаваемого им контента, то может быть разработка это не твое?
Чел, если ты, не обладая никакими знаниями в какой-то области, можешь спокойно оценивать кто там говноед и какого качества контент он выдаёт, то у меня скорее вопросы к тебе. Я не разбираюсь и понятия не имею. Вот в плане игр я понимаю, что Сакутин делает хуйню, чтоб собирать бабки на рекламе.
>Если конкретные направления:
Вот за это спасибо.
>>3212319
>Он инфоцыган — соответственно, пользуется слабостями вкатунишек. Устраивал показательные срачи с другими инфоцыганами. Есть большая вероятность, что ты будешь отвлекаться на что-то еще, кроме кодинга, либо автор будет смещать фокус проблемы на какую-то ненужную шелуху.
Т.е. не читал, но осуждаю? У него на 9 часов бесплатный курс, где больше половины курса вообще другой хрен обучает. Прокликал по диагонали - вроде никаких показательных срачей там нет. Единственное, что я понял с просмотра некоторых видосов Сакутина, что все остальные говно он топит за нейминг из документации к языку и поливает остальных говном.
никак. перекатывай.
И ни в коем случае не делай foreach yield return для кешированной коллекции, и то же самое потом для IAsyncEnumerable.
Вместо помощи обсуждаете инфоцыгана который не прогал ни разу
>Т.е. не читал, но осуждаю?
Я тебе буквально привел пример из его туториала про валидаторы.
>Прокликал по диагонали - вроде никаких показательных срачей там нет.
А его канал не ограничивается этим говнокурсом.
>У него на 9 часов бесплатный курс
Помню как его форсили. Типа "курс слили, скорее набегайте, а то удалят". Когда меня считают идиотом и скотиной еще на этапе заголовка, то ничего стоящего внутри точно не будет. А когда этот же курс потом переименовывают в "весь C# за 9 часов", то что можно сказать об этом? Что-то уровня С++ за 21 день.
Ты покажи код и какое исключение выдает.
Код кидай через https://pastebin.com/
Но из тобою описанного, все должно работать, кроме нескольких случаев:
1. По каким-то причинам на момент присваивания ссылки на экземпляр сущности, у тебя там оказался null.
2. У тебя мягкая ссылка (WeakReference) — тогда экземпляр может быть уничтожен GC.
Откинем второй случай, иначе бы ты об этом упомянул.
А если первый, то прежде чем обращаешься к свойству экземпляра, ты должен проверить существует ли экземпляр.
Есть два варианта условного свойства. Первый:
> public string Text { get; set; } = string.Empty;
В этом случае свойство не может быть null. Тебя даже студия заебет тем, что свойству ничего не присвоено. Именно поэтому я присвоил string.Empty, что равносильно
> Text = "";
Такая форма гарантирует наличие экземпляра в свойстве. Подразумевается, что ты всегда можешь обратиться к свойству, например:
> Console.WriteLine(Text.Length)
и не получить исключения. При этом ты не можешь такому свойству присвоить null.
Второй вариант:
> public string? Text { get; set; }
Тоже самое, только после string стоит вопрос. Это значит, что твоя переменная nullable. Она может быть пустой, а если она может быть пустой, то ты ОБЯЗАН проверить свойство на существование экземпляра. Например:
> if(Text != null) { Console.WriteLine(Text.Length); }
Есть сокращенная форма проверки, но об этом ты узнаешь потом.
Так вот, рассматривая твою проблему, у тебя может быть nullable свойство, в котором как раз и хранится null на момент, когда ты к этому свойству обратился. Может быть ты этому свойству что-то присваивал, но ведь факт присваивания чего-то не гарантирует, что присваиваемое не равно null, правда? Ты же не проверял?
Рассмотрим первый вариант свойства, который не может быть null.
Есть такой класс KeyGesture, который хранит данные о сочетании клавиш. У него есть свойство Key, который хранит код клавиатурной клавиши. А так же свойство Modifiers, которое хранит коды клавиш модификаторов(Control, Shift, Alt).
Так вот, у этого класса не существует стандартного конструктора, в котором нет параметров:
> var gesture = new KeyGesture(); //это работать не будет
Зато есть вот такой конструктор, запрашивающий код клавиши
> var gesture = new KeyGesture(Key.R);
Либо запрашивающий код клавиши и код клавишей-модификторов
> var gesture = new KeyGesture(Key.R, ModifierKeys.Shift);
Ты обязательно должен указать хотя бы код клавиши, чтобы создать экземпляр KeyGesture. Зато при обращении к свойству gesture.Key тебе не надо проверять его на null. Ты всегда можешь быть уверен, что там есть значение.
>Я тебе буквально привел пример из его туториала про валидаторы.
Ну то что он там где-то на канале обсирает чужой код - я в курсе, я всё равно это нихера не понимаю.
>А его канал не ограничивается этим говнокурсом.
Ну мне конкретно интересна залупа на 9 часов. Слушать его охуенные истории о том, что все хуесосы нахуй надо.
>Что-то уровня С++ за 21 день.
Ну я не считаю, что там ебать откровения. Там по оглавлению понятно, что это плюс-минус основы. Меня конкретно подкупает, что он упирает на то, что только он такой умный, что учит сразу писать понятный код с нормальными наименованиями, а не "переменная а, переменная б".
Короче, давай я попробую переформулировать вопрос: как энтри левел, чтоб получить какие-то грамотные основы, книжка и курс Сакутина - норм, или есть гораздо более хорошие варианты?
>учит сразу писать понятный код с нормальными наименованиями, а не "переменная а, переменная б".
Этому везде учат. Почти в каждом гайде/книге по шарпу есть абзац, что нехуй экономить буквы и писать надо так, чтобы было понятно что переменная содержит.
>конкретно подкупает, что он упирает на то, что только он такой умный
На это и расчет.
>Меня конкретно подкупает, что он упирает на то, что только он такой умный, что учит сразу писать понятный код с нормальными наименованиями
А ты у других проверял, чему они учат? Правильный нейминг само собой разумеющееся. В любом учебнике по любому языку программирования тебе первым же делом об этом напишут.
Он делает договорнячок с другим инфоцыганом — тот пишет хуйню, а потом Сакутин его же "типа" правит. Но т.к. сам нулевой кодер, то мы и наблюдаем советы уровня "не называйте переменные нечитабельными именами" как какое-то невероятное откровение.
> есть гораздо более хорошие варианты
Симпл код, хотя я бы книгу навернул. Не знаю что там щас актуально.
Дай угадаю EF? Используй Include()
@
ТАМ УМНЫЙ ЧЕЛОВЕК, СРАЗУ УЧИТ ПИСАТЬ ПОНЯТНЫЙ КОД!!!
@
ДЕВЯТЬ ЧАСОВ ЮЕСПЛАТНОГО КАЛТЕНТА
@
ОООО КУРСЫ ЕБАТЬ ВИДЕО
Блядь, как же заебали эти курсовички. Есть у меня кореш, он все время спрашивает про курсы, а я ему говорю – бери книгу и ебашь. Джва года этот чел скатывается и у него жопа горит. Другой чел никаких курсов не смотрел, вкатился те же два года назад, сейчас уже пару тысяч долларов получает. Думайте
Книга будет лучше какого-то чухана, что записал видео на Ютуб. А это именно чухан, чушок и чушпан, преследующий свои цели. Разбираться в этом говне – нахуя?
Вы случайно тут не продвижением этого дерьма занимаетесь? Мм? Код понятный писать учат, охуеть! Сука, пока год не поебешься, не будет нормальный читаемый код, никакой васян тебе не поможет, тут просто брать и писать, смотреть как у других и тренировать свою нейронку в голове
Единственный, наверное, норм вариант – курсы от контура, в которых они бесплатно готовили под себя. Там ещё и тренажёр для проверки. Только это все устарело, наверное
>Думайте
Я думаю, что ты дебил. То что работает для одного, не обязательно работает для другого. Один хорошо воспринимает информацию из книг, другой хорошо из видео. Если бы курсы были бы такой хуйнёй, то никто бы по ним не выучился, а таких дохуя. Может кто-то стал хорошим программистом, кто-то хреновым, но чему-то научился. Если твой кореш долбоёб, то это не курсы виноваты.
>>3212694
>Симпл код
А я начинал как раз с него и он, сука, через переменную а и б всё писал.
Не могу понять, могу ли я из ссылки брать параметр и использовать его в онИнициалайзед().
В мануале вроде как параметры присваиваются уже ПОсЛе, но это же ссылка....
@page "/Page1/{id:int?}/
[Parameter]
public int Id { get; set; }
protected override void OnInitialized()
{
var uri = new Uri(Navigation.Uri);
var queryParams = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query);
if (queryParams.TryGetValue("id", out var idValue))
{
Id = Int32.Parse(idValue);
}
Console.WriteLine($"OnInitialized called Id:{Id}");
}
У меня есть библиотека с классом, где расставлены атрибуты System.Text.Json.Serialization.JsonIgnore, но ньютнософтовский сериализатор эти атрибуты в упор не видит — ему нужен свой собственный атрибут.
Не буду же я во все библиотеки пихать ньютонсофтовскую библиотеку или игнорить свойства через резолверы?Глупость какая-то. Почему нельзя установить какое-то соответствие атрибутов?
Там вроде есть контракт резолвер который можно наследовать и пропатчить пару методов
Ну вот контракт резолвер я использую в качестве фильтра свойств. Мой резолвер проверяет имена свойств, и если имя совпадает со списком игонорируемых, то его сериализатор его тоже игнорирует.
Но это временное решение. Если сериализуется класс со сложной структурой и в котором есть совпадающие имена свойств, то такой подход может стать проблемой. Да и в целом, зачем расставлять тогда атрибуты [JsonIgnore]? Если по итогу ты все это вилкой чистишь?
Тебе в резолвер из base() прилетает лист мемберов вот и смотри что в нём и какие атрибуты, если что то не нравится то удаляй.
За сравнение названий полей по имени без привязки к типу пиздят ломами по хребту в приличном обществе
И вообще иди читай сорсы дефолтКонтрактРезолвера, там не рокет саенс
>За сравнение названий полей по имени без привязки к типу пиздят ломами по хребту в приличном обществе
Да жопой чувствовал, что этот совет со SO как всегда надежен как швейцарские часы.
>Но это временное решение.
Любое решение кроме выпиливания ньютонсофта в пользу System.Text.Json будет временным
>>3203792
ObservableCollection и фреймворки, реализующие mvvm. Про устарелость я не из бложиков инфу взял, а от майкрософта (сейчас попробовал ещё раз поискать и что-то не удалось).
>>3203823
> привязка может одномоментно зафиксировать изменение только одного итема
Благодарю, всё встало на свои места.
>Ну и еще.
В БД миллионы записей, пользователь ищет некоторую выборку и работает с ней, поэтому в mainWindow данные накапливаются из результатов поиска из searchWindow. Да и привычней заказчику работать с кучей окошек, чем делать одно мега-окно, в котором он (заказчик) точно накосячит.
>от майкрософта (сейчас попробовал ещё раз поискать и что-то не удалось).
вот вот. и "оф инва" элегантно превращается в высер одного человека который знает человека, который знает человека, который когда то купил лицензию на винду, и то с ноутом вместе
Что у нас с заменами? MVU(I)? А правда замена?
Ну конечно я люблю писать GUI кодом (но не в шарпе конечно - он для этого слабоват в выразительной мощи, это вам не котлин) и как быть с идеями типа Blend? никак? ну ок ок, я и не пользовался, но не скажу что не нужно никому. Внезапно в том же вебе верстальщики это отдельный класс работников и какой то хтмл юзают, а не чисто кодом пишут - видать они не понимают "устаревшести"
Если бы ты заглянул в ObservableCollection, то увидел, что коллекция реализует INotifyPropertyChanged и INotifyCollectionChanged т.е. то, что по-твоему устарело.
>а и привычней заказчику работать с кучей окошек
А как это отменяет фильтры? Просто у тебя окно может иметь определенные параметры фильтрации, или какой-то свой фильтр. Тогда ты можешь спавнить один класс окна сколько угодно раз. А так тебе придется под каждый тип поиска рисовать отдельное окошко.
>когда подключал готовую базу
Да хуй знает. Если под "подключал готовую базу" ты имеешь в виду Base First подход, то возможно где-то несоответствие твоих моделей и структуры в БД судя по тому, что на мапинг рукается. Алсо, проверь еще, чтобы пакеты npgwsql и ef соттветствовали друг-другу (чтобы не было так, что например один для .net8, а другой для .net9 и т.п.)
Давай схему бд и модели
Всё началось примерно 10 лет назад, когда "О, АРХИТЕКТОР" решил переписать наше приложение на микросервисы. Нам обещали DDD, чистую архитектуру, аспектно ориентированное программирование, полное покрытие интеграционными тестами, и всю прочую хуету, которую публиковали в то время на хабре.
Постольку, поскольку у нас был всего один домен (расчёт цены автострахования + админка), то микросервис у нас получился ровно один, и вся груда кода жила в одном дотнет солюшене.
Получили мы в итоге, естественно, хуй. Этот пидорас просто заменил DI контейнер на MediatR (сегодня не об этом), размазал код по хитровыебанной системе зависимостей проектов (Core.Domain, Common.Core, Shared.Common, Application.Interaces, BusinessLogiс.Domain, Core, Domain, где надо было архитектора лично спрашивать, в какую папку чего ложить, не дай бог промахнёшься). Естественно, как алмаз в корону архитектурного величия он въебал автомаппер. Сениур-дотнет-девелоперы подхватили модную тенденцию и автомаппером было захуярено всё. Буквально за два месяца проект превратился в ад, а через год от наших услуг отказались. Один и тот же класс учавствовал в двух, а иногда и трёх маппингах. Все маппинги были сложены один класс, разумеется, общий для всей кодовой базы. Сколько тысяч сторок кода я не помню, но дохуя.
Я с ужасом вспоминаю отладку на этом проекте. Я перестал вообще пытаться разбираться в бизнес-логике проекта, потому что она попросту стала непостижима, учитывая, что и раньше она была довольно сложной. Для построения дерева вызовов от БД до JSON объекта, который передавался пользователям, буквально уходили часы. Плюс, у нас падали ошибки в рантайме в совершенно неочевидных местах. Мне не нравилось искать ошибки в автомаппинге, там же не поставишь брейкпоинт. Я испытывал физическую боль, когда в очередной раз попадал в метод AfterMap. Но мне в голову не приходило, что это не нормально. Я думал, что это стандартная практика, и я просто тупой, а все вокруг коронованые сениур девелоперы и знают как правильно. Потом я понял, что что-то идёт не так, я уволился и долго проработал на проектах, где в ответ на просьбу включить автомапер, каждый раз изворачивались и не делали этого.
Через 5 лет я устроился работать в команду, где в первый же день я охуел. Местные просто ёбнулись, возвели проблему в квадрат. Там творилась такая дичь, что её нельзя не приложить:
Автомаппером буквально стали маппить базовые классы на наследников. Буквально, иерархия классов, глубиной до четырёх наследований, где всё наследуется от класса "автомаппируемое ентити", и наследники маппятся друг на друга. От модели в БД может наследуется какая-то ещё похожая модель по принципу похожих свойств, перетирает её свойства и методы, затем происходить маппинг ещё на какую-то хуету, по дороге смаппившись на команду mediatr (сегодня не об этом), которая, естественно, мапит свой результат ещё на какую-нибудь поебень.
Мне буквально втирали, что Автомаппер - это волшебная библиотека, которая нужна ЧТОБЫ ОПТИМИЗИРОВАТЬ ЗАПРОСЫ В БД, иначе происходит "Select *". Мне объясняли, что автомаппер НЕОБХОДИМ ДЛЯ DDD. а Чистая архитектура без него, очевидно, невозможна.
Буквально в каждом маппинге был "AfterMap". Экспрешены были сложные, куча конвертирований. При обновлении версии автомаппера у нас поплыли исключения. Сами маппинги невозможно было удержать в голове, потому что одной бляди нравилось взять на навесить маппинг с помощью атрибутов. И тут буквально надо про каждое свойство составлять карту. Строки маппили в числа, децималы в даблы и инты. Даты в текст. Маппили абсолютно непохожие объекты, плоские на глубокие, и наоборот.
Эти мудаки даже каким-то образом в AfterMap умудрились встроить доменные события (они думали, что это доменные события, на самом деле нет).
И ни разу даже не задумались, что они переписали простой синхронизатор в монстра на 100000 строк кода, а работать стало хуёво.
Я каждый раз спрашивал, почему тогда просто не использовать c#, и мне чуть по ебалу не били, как будто я задел священную корову. Мне буквально один челик сказал, что вот это - плохой код ПОТОМУ ЧТО ВЫЗЫВАТЬ КОНСТРУКТОР ЯВНО ЭТО ДУРНОЙ ТОН И ТАМ ЗАПАХИ.
public static FineDbo ToFineDbo(this FineInfoDto src) => new
{
Amount = src.FineDetails.Amount,
Uin = src.Uin,
ArticleCode = src.FineDetails.ArticleCode,
DepartmentName = src.FineDetails.DepartmentName,
BillDate = src.FineDetails.BillDate,
Description = src.FineDetails.Description,
DiscountDate = src.FineDetails.DiscountDate,
DiscountedSum = src.FineDetails.DiscountedSum,
DocumentNumber = src.DocumentNumber.ToLower(),
DocumentType = src.DocumentType,
DueDate = src.FineDetails.DueDate,
Sum = src.FineDetails.Sum,
HasDetails = src.FineDetails.HasDetails,
HasPhoto = src.FineDetails.HasPhoto,
IsPartiallyPaid = src.FineDetails.IsPartiallyPaid,
KoapDescription = src.FineDetails.KoapDescription,
OffenseDate = src.FineDetails.OffenseDate,
Location = src.FineDetails.Location,
OriginalAmount = src.FineDetails.OriginalAmount,
PaymentLink = src.PaymentLink,
TotalAmount = src.FineDetails.TotalAmount,
Id = src.Uin.ToLower(),
IsClosed = src.IsClosed,
ValidUntilDate = src.FineDetails.ValidUntilDate,
RawProviderResponse = src.RawProviderResponse
}
Стоит упомянуть, что он был грекокиприот, который после 8 лет разработки андроида решил заняться беком на c#.
а этот код - хороший код, просто потому что
CreateMap<FineInfoDto, FineDbo>()
.ForMember(dst => dst.Amount, opt => opt.MapFrom(src => src.FineDetails.Amount))
.ForMember(dst => dst.Uin, opt => opt.MapFrom(src => src.Uin))
.ForMember(dst => dst.ArticleCode, opt => opt.MapFrom(src => src.FineDetails.ArticleCode))
.ForMember(dst => dst.DepartmentName, opt => opt.MapFrom(src => src.FineDetails.DepartmentName))
.ForMember(dst => dst.BillDate, opt => opt.MapFrom(src => src.FineDetails.BillDate))
.ForMember(dst => dst.Description, opt => opt.MapFrom(src => src.FineDetails.Description))
.ForMember(dst => dst.DiscountDate, opt => opt.MapFrom(src => src.FineDetails.DiscountDate))
.ForMember(dst => dst.DiscountedSum, opt => opt.MapFrom(src => src.FineDetails.DiscountedSum))
.ForMember(dst => dst.DocumentNumber, opt => opt.MapFrom(src => src.DocumentNumber.ToLower()))
.ForMember(dst => dst.DocumentType, opt => opt.MapFrom(src => src.DocumentType))
.ForMember(dst => dst.DueDate, opt => opt.MapFrom(src => src.FineDetails.DueDate))
.ForMember(dst => dst.Sum, opt => opt.MapFrom(src => src.FineDetails.Sum))
.ForMember(dst => dst.HasDetails, opt => opt.MapFrom(src => src.FineDetails.HasDetails))
.ForMember(dst => dst.HasPhoto, opt => opt.MapFrom(src => src.FineDetails.HasPhoto))
.ForMember(dst => dst.IsPartiallyPaid, opt => opt.MapFrom(src => src.FineDetails.IsPartiallyPaid))
.ForMember(dst => dst.KoapDescription, opt => opt.MapFrom(src => src.FineDetails.KoapDescription))
.ForMember(dst => dst.OffenseDate, opt => opt.MapFrom(src => src.FineDetails.OffenseDate))
.ForMember(dst => dst.Location, opt => opt.MapFrom(src => src.FineDetails.Location))
.ForMember(dst => dst.OriginalAmount, opt => opt.MapFrom(src => src.FineDetails.OriginalAmount))
.ForMember(dst => dst.PaymentLink, opt => opt.MapFrom(src => src.PaymentLink))
.ForMember(dst => dst.TotalAmount, opt => opt.MapFrom(src => src.FineDetails.TotalAmount))
.ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Uin.ToLower()))
.ForMember(dst => dst.IsClosed, opt => opt.MapFrom(src => src.IsClosed))
.ForMember(dst => dst.ValidUntilDate, opt => opt.MapFrom(src => src.FineDetails.ValidUntilDate))
.ForMember(dst => dst.RawProviderResponse, opt => opt.MapFrom(src => src.RawProviderResponse));
У меня возникла закономерная мысль. Мы из года в год бьёмся с долбоёбами, которые в попытках написать крутой сеньёрский код, обмазывают всё вокруг слоями говна, и продолжают доказывать состоятельность автомаппера, затем увольняются, и на следующем проекте продолжают свою злонамеренную деятельность. Это какие-то гремлины, которым надо ссать на лицо, которые зачем-то в попытке упростить, усолжняют.
Джимми Богарт, пидорас, открыл дверь в ад, и её не могут закрыть. Всегда найдётся долбоёб, который за каким-то хуем приплетает автомаппер.
Хочешь DDD? Очевидно же, надо начать с автомапера
Хочешь CQRS? Очевидно же, надо начать с автомапера
Хочешь слои? Автомаппер
Хочешь Clean Architecture? Ответ очевиден! Захуярь всё автомапером
Вопрос к необучаемым. За каким хуем вы повторяете одни и те же ошибки?
Вопрос к мелким программистам. За каким хуем вы повторяете наши ошибки? Мы уже так давно не пишем
Всё началось примерно 10 лет назад, когда "О, АРХИТЕКТОР" решил переписать наше приложение на микросервисы. Нам обещали DDD, чистую архитектуру, аспектно ориентированное программирование, полное покрытие интеграционными тестами, и всю прочую хуету, которую публиковали в то время на хабре.
Постольку, поскольку у нас был всего один домен (расчёт цены автострахования + админка), то микросервис у нас получился ровно один, и вся груда кода жила в одном дотнет солюшене.
Получили мы в итоге, естественно, хуй. Этот пидорас просто заменил DI контейнер на MediatR (сегодня не об этом), размазал код по хитровыебанной системе зависимостей проектов (Core.Domain, Common.Core, Shared.Common, Application.Interaces, BusinessLogiс.Domain, Core, Domain, где надо было архитектора лично спрашивать, в какую папку чего ложить, не дай бог промахнёшься). Естественно, как алмаз в корону архитектурного величия он въебал автомаппер. Сениур-дотнет-девелоперы подхватили модную тенденцию и автомаппером было захуярено всё. Буквально за два месяца проект превратился в ад, а через год от наших услуг отказались. Один и тот же класс учавствовал в двух, а иногда и трёх маппингах. Все маппинги были сложены один класс, разумеется, общий для всей кодовой базы. Сколько тысяч сторок кода я не помню, но дохуя.
Я с ужасом вспоминаю отладку на этом проекте. Я перестал вообще пытаться разбираться в бизнес-логике проекта, потому что она попросту стала непостижима, учитывая, что и раньше она была довольно сложной. Для построения дерева вызовов от БД до JSON объекта, который передавался пользователям, буквально уходили часы. Плюс, у нас падали ошибки в рантайме в совершенно неочевидных местах. Мне не нравилось искать ошибки в автомаппинге, там же не поставишь брейкпоинт. Я испытывал физическую боль, когда в очередной раз попадал в метод AfterMap. Но мне в голову не приходило, что это не нормально. Я думал, что это стандартная практика, и я просто тупой, а все вокруг коронованые сениур девелоперы и знают как правильно. Потом я понял, что что-то идёт не так, я уволился и долго проработал на проектах, где в ответ на просьбу включить автомапер, каждый раз изворачивались и не делали этого.
Через 5 лет я устроился работать в команду, где в первый же день я охуел. Местные просто ёбнулись, возвели проблему в квадрат. Там творилась такая дичь, что её нельзя не приложить:
Автомаппером буквально стали маппить базовые классы на наследников. Буквально, иерархия классов, глубиной до четырёх наследований, где всё наследуется от класса "автомаппируемое ентити", и наследники маппятся друг на друга. От модели в БД может наследуется какая-то ещё похожая модель по принципу похожих свойств, перетирает её свойства и методы, затем происходить маппинг ещё на какую-то хуету, по дороге смаппившись на команду mediatr (сегодня не об этом), которая, естественно, мапит свой результат ещё на какую-нибудь поебень.
Мне буквально втирали, что Автомаппер - это волшебная библиотека, которая нужна ЧТОБЫ ОПТИМИЗИРОВАТЬ ЗАПРОСЫ В БД, иначе происходит "Select *". Мне объясняли, что автомаппер НЕОБХОДИМ ДЛЯ DDD. а Чистая архитектура без него, очевидно, невозможна.
Буквально в каждом маппинге был "AfterMap". Экспрешены были сложные, куча конвертирований. При обновлении версии автомаппера у нас поплыли исключения. Сами маппинги невозможно было удержать в голове, потому что одной бляди нравилось взять на навесить маппинг с помощью атрибутов. И тут буквально надо про каждое свойство составлять карту. Строки маппили в числа, децималы в даблы и инты. Даты в текст. Маппили абсолютно непохожие объекты, плоские на глубокие, и наоборот.
Эти мудаки даже каким-то образом в AfterMap умудрились встроить доменные события (они думали, что это доменные события, на самом деле нет).
И ни разу даже не задумались, что они переписали простой синхронизатор в монстра на 100000 строк кода, а работать стало хуёво.
Я каждый раз спрашивал, почему тогда просто не использовать c#, и мне чуть по ебалу не били, как будто я задел священную корову. Мне буквально один челик сказал, что вот это - плохой код ПОТОМУ ЧТО ВЫЗЫВАТЬ КОНСТРУКТОР ЯВНО ЭТО ДУРНОЙ ТОН И ТАМ ЗАПАХИ.
public static FineDbo ToFineDbo(this FineInfoDto src) => new
{
Amount = src.FineDetails.Amount,
Uin = src.Uin,
ArticleCode = src.FineDetails.ArticleCode,
DepartmentName = src.FineDetails.DepartmentName,
BillDate = src.FineDetails.BillDate,
Description = src.FineDetails.Description,
DiscountDate = src.FineDetails.DiscountDate,
DiscountedSum = src.FineDetails.DiscountedSum,
DocumentNumber = src.DocumentNumber.ToLower(),
DocumentType = src.DocumentType,
DueDate = src.FineDetails.DueDate,
Sum = src.FineDetails.Sum,
HasDetails = src.FineDetails.HasDetails,
HasPhoto = src.FineDetails.HasPhoto,
IsPartiallyPaid = src.FineDetails.IsPartiallyPaid,
KoapDescription = src.FineDetails.KoapDescription,
OffenseDate = src.FineDetails.OffenseDate,
Location = src.FineDetails.Location,
OriginalAmount = src.FineDetails.OriginalAmount,
PaymentLink = src.PaymentLink,
TotalAmount = src.FineDetails.TotalAmount,
Id = src.Uin.ToLower(),
IsClosed = src.IsClosed,
ValidUntilDate = src.FineDetails.ValidUntilDate,
RawProviderResponse = src.RawProviderResponse
}
Стоит упомянуть, что он был грекокиприот, который после 8 лет разработки андроида решил заняться беком на c#.
а этот код - хороший код, просто потому что
CreateMap<FineInfoDto, FineDbo>()
.ForMember(dst => dst.Amount, opt => opt.MapFrom(src => src.FineDetails.Amount))
.ForMember(dst => dst.Uin, opt => opt.MapFrom(src => src.Uin))
.ForMember(dst => dst.ArticleCode, opt => opt.MapFrom(src => src.FineDetails.ArticleCode))
.ForMember(dst => dst.DepartmentName, opt => opt.MapFrom(src => src.FineDetails.DepartmentName))
.ForMember(dst => dst.BillDate, opt => opt.MapFrom(src => src.FineDetails.BillDate))
.ForMember(dst => dst.Description, opt => opt.MapFrom(src => src.FineDetails.Description))
.ForMember(dst => dst.DiscountDate, opt => opt.MapFrom(src => src.FineDetails.DiscountDate))
.ForMember(dst => dst.DiscountedSum, opt => opt.MapFrom(src => src.FineDetails.DiscountedSum))
.ForMember(dst => dst.DocumentNumber, opt => opt.MapFrom(src => src.DocumentNumber.ToLower()))
.ForMember(dst => dst.DocumentType, opt => opt.MapFrom(src => src.DocumentType))
.ForMember(dst => dst.DueDate, opt => opt.MapFrom(src => src.FineDetails.DueDate))
.ForMember(dst => dst.Sum, opt => opt.MapFrom(src => src.FineDetails.Sum))
.ForMember(dst => dst.HasDetails, opt => opt.MapFrom(src => src.FineDetails.HasDetails))
.ForMember(dst => dst.HasPhoto, opt => opt.MapFrom(src => src.FineDetails.HasPhoto))
.ForMember(dst => dst.IsPartiallyPaid, opt => opt.MapFrom(src => src.FineDetails.IsPartiallyPaid))
.ForMember(dst => dst.KoapDescription, opt => opt.MapFrom(src => src.FineDetails.KoapDescription))
.ForMember(dst => dst.OffenseDate, opt => opt.MapFrom(src => src.FineDetails.OffenseDate))
.ForMember(dst => dst.Location, opt => opt.MapFrom(src => src.FineDetails.Location))
.ForMember(dst => dst.OriginalAmount, opt => opt.MapFrom(src => src.FineDetails.OriginalAmount))
.ForMember(dst => dst.PaymentLink, opt => opt.MapFrom(src => src.PaymentLink))
.ForMember(dst => dst.TotalAmount, opt => opt.MapFrom(src => src.FineDetails.TotalAmount))
.ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Uin.ToLower()))
.ForMember(dst => dst.IsClosed, opt => opt.MapFrom(src => src.IsClosed))
.ForMember(dst => dst.ValidUntilDate, opt => opt.MapFrom(src => src.FineDetails.ValidUntilDate))
.ForMember(dst => dst.RawProviderResponse, opt => opt.MapFrom(src => src.RawProviderResponse));
У меня возникла закономерная мысль. Мы из года в год бьёмся с долбоёбами, которые в попытках написать крутой сеньёрский код, обмазывают всё вокруг слоями говна, и продолжают доказывать состоятельность автомаппера, затем увольняются, и на следующем проекте продолжают свою злонамеренную деятельность. Это какие-то гремлины, которым надо ссать на лицо, которые зачем-то в попытке упростить, усолжняют.
Джимми Богарт, пидорас, открыл дверь в ад, и её не могут закрыть. Всегда найдётся долбоёб, который за каким-то хуем приплетает автомаппер.
Хочешь DDD? Очевидно же, надо начать с автомапера
Хочешь CQRS? Очевидно же, надо начать с автомапера
Хочешь слои? Автомаппер
Хочешь Clean Architecture? Ответ очевиден! Захуярь всё автомапером
Вопрос к необучаемым. За каким хуем вы повторяете одни и те же ошибки?
Вопрос к мелким программистам. За каким хуем вы повторяете наши ошибки? Мы уже так давно не пишем
Давно заброшена, лучше используй VSCODE, Rider. На винде еще Visual Studio есть, выбор богат.
MonoDevelop нужна была только давно, когда ещё не было .net corе и люди ебались с MONO. Ну может, в Юнити как-то используется, но думаю, уже вряд-ли
Либо тебе нужно включать подсущности руками: Include(...)
Либо тебе нужно сделать экспрешшен, который будет включать подсущности и генерировать джоины: .Select(x -> x.SubEntity.Price)
Либо тебе надо включать LazyLoading. Но это такая ёбань, от которой 10 лет назад плевались все
Лол, у нас его запретили к хуям, и мне это нравится. Очень не люблю ебучие автомаппер и медиатр. Я, блядь, код с типами пишу, чтобы мог понять, что в нем происходит, просто прочитав код. С товарищами выше такой фокус не пройдет, сиди, расставляй брейкпоинты
Мне кажется, что иногда человек пишет бекенд, пишет, пишет, потом ещё пишет, потом у него начинает течь колпак. Ну, знаете, как у людей, которые всю жизнь в миссионерской позе ебутся – это надоедает. Кто-то начинает обмазываться говном (автомаппером) и говорить, что так запаха нет. А кто-то вносит разнообразие в свою жизнь иначе – интересуется смежными областями или уходит в менеджмент. Не обмазывайтесь говном, аноны
В общем, что у вас в секции code style написано в редми проекта?
Ничего не написано у нас, пусто.
Очень вольный стиль используем. Разработчики пишут как хотят, при условии, что у всех опыт довольно богатый. Код слабо форматируется. Но более-менее попадаем в гайдлайны микрософта.
Я работал на разных проектах с разными стилями, и как правило, всё, что не могу прочитать, форматирую временно, потом откатываю назад.
Но это надо много опыта иметь, чтобы не беситься смотря на то, как другие форматируют
К слову, у нас довольно простые гайдлайны:
Комментарии стараемся не писать
Явный однозначный код всегда предпочтительней, чем рефлексия, динамические прокси и прочая хуета
Строжайще запрещен автомаппер.
>Не бывает споров о максимальном количестве символов
Нет, не бывает споров
Я однажды понял, что код - он уродлив в любом случае. Хоть ты 10 раз обложишь его гайдлайнами.
Когда этот код выстрелит? Можно ли его удалять? Быть может, это подпорка для реального пользователя?
Этот код не раз вызовет сомнения, за него зацепится глаз, его попытаются починить, но потом вернут.
Я однажды потратил неделю, разыскивая, почему у пользователя одно калькулируемое поле было 31.96. Притом, оказалось, что мне предоставили гит-репозиторий от другого сервиса, где такой проблемы нет, заверили, что это именно тот сервис задеплоен. В итоге я искал проблему там, где её нет
Также напомню, что код не должен содержать в себе отсылок на окружения. То есть:
- #if DEBUG - это не очень хорошо, можно же передать это значение "снаружи"
- if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development") - тоже не очень хорошо, но, всё же, при добавлении нового окружения придётся выискивать по коду все подобные места
> Пик
Кошмарьте обезьяну кто это написала и вторую обезьяну, которая поставила апрув на мердж реквест.
В си шарпе приватное свойство/метод доступен на уровне экземпляра другому экземпляру класса. Это настолько противоречивая концепция для жабиста, настолько ведущая на первый взгляд к неконтролируемому изменению состояния объекта, что я в сердцах крикнул и пошел гуглить зачем, а главное нахуя.
И всё оказалось логично. Приватные методы/поля всё также недоступны всем остальным "пользователям" этого класса, но доступны тебе как его разработчика.
То есть инкапсуляция всё ещё работает, разделение на публичный и приватный API сохраняется и всё в целом работает. Везде где приватные поля могут быть изменены ты же и контролируешь как разработчик, потому что они все в одном месте.
В общем, я правильно понимаю, что это не баг, а фича или есть ситуации когда доступ к приватным полям/методам на уровне экземпляра внутри класса приводило вас к пиздецу?
> Кошмарьте обезьяну кто это написала и вторую обезьяну, которая поставила апрув на мердж реквест.
Да я бы с радостью, но эти говноеды в сторону отскочили
Очень разные проекты бывают. Дотнет огромный.
В основном, там вопросы стандартные -
C#
алгоритмы, сложность
мультипоточка в dotnet
паттерны, солид
СУБД, ACID, уровни изоляции транзакций
Может быть DDD или архитектура
Если ебут на собеседовании - скорее всего коллектив слабоват. Опытные разработчики обычно по косвенным признакам поймут, что ты долбоёб и ты даже не заметишь этого.
namespace SomeNames
{
public class SomeType
{
private float _privateField = 11;
public void UpdatePrivateField(SomeType obj)
{
this._privateField = obj._privateField;
}
}
}
Вот нахуя ты неудобные вопросы задаёшь? Эта хуйня сконпелировалась. Давай, ты удалишь своё сообщение и мы сделаем вид, что ничего не было?
https://stackoverflow.com/questions/5737602/why-and-how-does-c-sharp-allow-accessing-private-variables-outside-the-class-its
Да я вроде уже принял и смирился, просто в плюсах и жабе, которые я знаю не так вот и сначала мозг сломался.
Позабавило, что в комментариях на стековерфлоу пишут, что в жабе также, что просто враньё. И что в плюсах тоже самое, мол смотрите концепцию frindly классов, что есть виляние жопой, потому что в плюсах есть конкретный модификатор private и конкретный модификатор friend и они разделены. В C# же модификатора private из плюсов/жабы в том же смысле отсутствует.
Ну, ладно, это даже не проблема, просто непривычный подход к модификаторам доступа для тех кто начинал не с С#.
И чего, как тебе дотнет? Уже кайфанул от структур? В АОТ собирать пробовал? Как тебе LINQ?
Да я в геймдеве сижу и тут только пару скриптиков написал пока что. Ощущается как жаба. Ничего негативного сказать не могу, ничего положительного тоже
Греки - долбоёбы, очень тупые разработчики.
Пакистанцы - долбоёбы, очень тупые разработчики.
Расскажу об одном примере, который растянулся примерно на пол года.
У нас был сервис. Этот сервис перекладывал объекты из АПИ в БД. Там была проблема, он тормозил и работал с ошибками.
К нам буквально раз в месяц заваливался владелец компании, австралиец в золотых кроссовках и орал на нас благим английским матом. Ему было лет 50, он торчал, но выглядел как перекачанный сморщенный подросток.
Что делает сениур девелопер в таком случае? Правильно. Переписывает весь код нахуй с нуля в DDD, потому что DDD это правильно.
Вот такой у меня был руководитель. Я попробовал починить баги, но он просто запретил это делать, сказал, что обещал австралийцу переписать всё.
Ведь если переписать сервис в DDD, то ошибки автоматически пропадут, просто потому что в правильной чистой архитектуре нет места ошибкам.
А как переписать в DDD? Говно вопрос, просто надо использовать CQRS.
А CQRS подразумевает под собой конечно же MediatR. Ну команды же, квери. BEST PRACTICES
И вот, мой начальник, грек-ебанат начинает перехуяривать весь код. Вернее, он уже всё перехуярил, но только теперь решил показать плоды своей злонамеренной деятельности. То есть, этот пидорюга всё знал заранее и не чинил ошибки потому что видите-ли он давно всё переписывать начал.
Мне он код показывает, но не даёт его ревьюить. Вижу Много перехуяренного кода. Этот дибид даёт мне сделать какую-то подзадачу по перехуяриванию. Я читаю общую канву кода, мне становится плохо.
Первое, что он делает, он пишет автоматический регистратор объектов в DI, основанный на рефлексии.
Правильно же, только сраный джуниор пишет все эти AddTransient 50 раз. А у серьёзных парней всё происходит автоматически.
Я пробовал возразить, мол, неплохо бы видеть явную регистрацию сервисов, потому что писать автоматический регистратор дольше, чем написать 100 строчек. Но мне объяснили, что я тупой, а программирование в DDD и чистой архитектуре не для тупых.
Затем, был выведен чистейший и единственно правильный юнит-оф-ворк-репозиториев-аггрегированных-рутов. Это было что-то типо двойной обёртки над DBContext, но обёртка была настолько обобщённая, что не понимала, с какими объектами БД она работает.
Поэтому было решено всем объектам захардкодить ID типо Long, а DBontext сделать публичным свойством.
В итоге у нас был царь-юнит-оф-форк-репозиторий, который предоставлял возможность выполнить на себе кастомный SQL код, и у нас были агрегаты, которыми было всё, что можно было извлечь из этого UOW.
В том числе и сообщения очереди, которая была ядром этого сервиса. Ну очередь в БД. Ну вы поняли.
Эта самая очередь выгружала сообщения раз в минуту, потому что нехуй заёбывать БД. Использовать AMAZON SQS было запрещено. Потому что крутые синиуры используют только кафку, но кафки у нас не было.
А я на это дело смотрю, и ничего не могу поделать. Могу только починить очевидный баг в логике, и никак не могу повлиять на архитектурное решение.
Разумеется, им нужны были доменные события. Их вхуярили в DBContext. Где-то в момент сохранения, через медиатор.
Затем, все сервисы были переписаны через MediatR. Потому что инжектить 2-4 сервиса НЕЛЬЗЯ. Уууу, конструктор слишком большой!
Моя роль была смотреть на этот театральный перформанс и чинить особо ёбнутые баги, потому что этот грек, который был главным разрабом, плохо понимал дотнет, быстро писал код и не проверял его, и не сверял с оригиналом.
Ну то есть, мне буквально приходилось просить их, дать мне возможность избавить приложение от, к примеру, многопоточной синхронизации через семафоры, потому что иначе они просто скатывались в дедлок.
В итоге код выглядел как огромная количество команд и кверей, в каждой по 20 строчек не более. Вызовы команд чередовались с вызовами автомаппера (где жила вся логика), квери возвращали ienumerable, могли записывать в бд.
Где начинался и где заканчивался код - загадка.
Просто какие-то случайные команды звали случайные квери. Структура была потеряна, код напоминал желе из говна. Опять же пошло в бой глубокое наследование, AfterMap и прочее блядство.
И, разумеется, были бихавеуры. Штук 8. У нас был общий бихавиор под обработку ошибок, общий бихавиор под логирование, общий бихавиор под маппинг, общий бихавиур под валидацию, и так далее.
Всё было обобщённое. Всё имело базовый класс. Базовая команда, базовый ответ команды. Все команды имели валидаторы. Квери часто возвращали IEnumerable, лениво блядь, без материализации.
Тут этот дибил выкатил своё решение, и посадил меня его ДОДЕЛЫВАТЬ блядь, потому что он пошёл переписывать следующий сервис.
Этот пидор просто навалил все "BEST PRACTICES", про которые мельком прочитал в единственной книге, которую прочитал (какая-то общая книга от микрософта, что-то про микросервисы). Ну кроме аспектно ориентированного програмирования, его не было.
С меня требовалось развернуть его код в контейнере и произвести пуско-наладочные работы.
И тут начался пиздец. Он превратил сервис, который буквально отвечал за 7 операций в то же самое, но с "BEST PRACTICES". Починены ли изначальные проблемы никто не знал.
Во первых этот ебанат зареферинсил библиотеки из .net framework 4.5.2. Он просто не знал, чем дотнет кор отличается от фреймворка.
DBContext взрывался с ObjectDisposedException. Челик просто возвращал ленивый IEnumerable и не парился.
Память утекала линейно (y=2x), за 2 часа мы падали с OutOfMemoryException. Оказалось, что ребята просто не знали что у объектов есть время жизни и их иногда надо диспозить. Память утекала во многих местах. Но самое дебильное, она утекала в ЛОГИРОВАНИИ.
Я нахуй никогда не видел, чтобы человек был настолько ебанатом, чтобы у него память утекла в ЛОГИРОВАНИИ БЛЯДЬ.
Далее. Приложение иногда просто останавливалось намертво. Дедлок нахуй. Вы когда нибудь доводили свой код до дедлока?
Стек-трейсы ошибок буквально состояли из какой-то каши, многократно помноженной на 7-8 бихавиоров. Ну. то есть, буквально, не влазили на два экрана.
Код, если очень долго вглядываться, по своей сути повторял структуру предыдущего сервиса, но привносил хуеву тучу проблем и вообще перестал читаться.
Это было ёбаное бесконечное навигирование от команды к её хендлеру через конфиг автомаппера. Понять что-то можно было только почитав исходник оригинала.
Я разворачивал этот сервис два месяца.
Потом, я его развернул. Запустил, и уволился нахуй. Я прекрасно понимал, что проблемы не только не решены, а, наоборот, приумножены. Это был первый раз, когда я уволился просто вникуда. Я понял, что нельзя так.
Мораль простая. Я теперь работаю только с русскими. Дотнет даёт безграничные возможности, чтобы возвести сложность кода в квадрат. Код опытного разработчика отличается своей наивной простотой. Сервис, который мы переписывали, таким и был. Его писали отцы с хорошим бекграундом в БД. Но тормозил и возвращал ошибки только потому что там отправляли неправильный запрос, который банально неэффективно расходовал ресурсы и починку можно было свести к 100 строчкам. MediatR - это не замена DI. За слова BEST PRACTICES надо бить в ебало.
Греки - долбоёбы, очень тупые разработчики.
Пакистанцы - долбоёбы, очень тупые разработчики.
Расскажу об одном примере, который растянулся примерно на пол года.
У нас был сервис. Этот сервис перекладывал объекты из АПИ в БД. Там была проблема, он тормозил и работал с ошибками.
К нам буквально раз в месяц заваливался владелец компании, австралиец в золотых кроссовках и орал на нас благим английским матом. Ему было лет 50, он торчал, но выглядел как перекачанный сморщенный подросток.
Что делает сениур девелопер в таком случае? Правильно. Переписывает весь код нахуй с нуля в DDD, потому что DDD это правильно.
Вот такой у меня был руководитель. Я попробовал починить баги, но он просто запретил это делать, сказал, что обещал австралийцу переписать всё.
Ведь если переписать сервис в DDD, то ошибки автоматически пропадут, просто потому что в правильной чистой архитектуре нет места ошибкам.
А как переписать в DDD? Говно вопрос, просто надо использовать CQRS.
А CQRS подразумевает под собой конечно же MediatR. Ну команды же, квери. BEST PRACTICES
И вот, мой начальник, грек-ебанат начинает перехуяривать весь код. Вернее, он уже всё перехуярил, но только теперь решил показать плоды своей злонамеренной деятельности. То есть, этот пидорюга всё знал заранее и не чинил ошибки потому что видите-ли он давно всё переписывать начал.
Мне он код показывает, но не даёт его ревьюить. Вижу Много перехуяренного кода. Этот дибид даёт мне сделать какую-то подзадачу по перехуяриванию. Я читаю общую канву кода, мне становится плохо.
Первое, что он делает, он пишет автоматический регистратор объектов в DI, основанный на рефлексии.
Правильно же, только сраный джуниор пишет все эти AddTransient 50 раз. А у серьёзных парней всё происходит автоматически.
Я пробовал возразить, мол, неплохо бы видеть явную регистрацию сервисов, потому что писать автоматический регистратор дольше, чем написать 100 строчек. Но мне объяснили, что я тупой, а программирование в DDD и чистой архитектуре не для тупых.
Затем, был выведен чистейший и единственно правильный юнит-оф-ворк-репозиториев-аггрегированных-рутов. Это было что-то типо двойной обёртки над DBContext, но обёртка была настолько обобщённая, что не понимала, с какими объектами БД она работает.
Поэтому было решено всем объектам захардкодить ID типо Long, а DBontext сделать публичным свойством.
В итоге у нас был царь-юнит-оф-форк-репозиторий, который предоставлял возможность выполнить на себе кастомный SQL код, и у нас были агрегаты, которыми было всё, что можно было извлечь из этого UOW.
В том числе и сообщения очереди, которая была ядром этого сервиса. Ну очередь в БД. Ну вы поняли.
Эта самая очередь выгружала сообщения раз в минуту, потому что нехуй заёбывать БД. Использовать AMAZON SQS было запрещено. Потому что крутые синиуры используют только кафку, но кафки у нас не было.
А я на это дело смотрю, и ничего не могу поделать. Могу только починить очевидный баг в логике, и никак не могу повлиять на архитектурное решение.
Разумеется, им нужны были доменные события. Их вхуярили в DBContext. Где-то в момент сохранения, через медиатор.
Затем, все сервисы были переписаны через MediatR. Потому что инжектить 2-4 сервиса НЕЛЬЗЯ. Уууу, конструктор слишком большой!
Моя роль была смотреть на этот театральный перформанс и чинить особо ёбнутые баги, потому что этот грек, который был главным разрабом, плохо понимал дотнет, быстро писал код и не проверял его, и не сверял с оригиналом.
Ну то есть, мне буквально приходилось просить их, дать мне возможность избавить приложение от, к примеру, многопоточной синхронизации через семафоры, потому что иначе они просто скатывались в дедлок.
В итоге код выглядел как огромная количество команд и кверей, в каждой по 20 строчек не более. Вызовы команд чередовались с вызовами автомаппера (где жила вся логика), квери возвращали ienumerable, могли записывать в бд.
Где начинался и где заканчивался код - загадка.
Просто какие-то случайные команды звали случайные квери. Структура была потеряна, код напоминал желе из говна. Опять же пошло в бой глубокое наследование, AfterMap и прочее блядство.
И, разумеется, были бихавеуры. Штук 8. У нас был общий бихавиор под обработку ошибок, общий бихавиор под логирование, общий бихавиор под маппинг, общий бихавиур под валидацию, и так далее.
Всё было обобщённое. Всё имело базовый класс. Базовая команда, базовый ответ команды. Все команды имели валидаторы. Квери часто возвращали IEnumerable, лениво блядь, без материализации.
Тут этот дибил выкатил своё решение, и посадил меня его ДОДЕЛЫВАТЬ блядь, потому что он пошёл переписывать следующий сервис.
Этот пидор просто навалил все "BEST PRACTICES", про которые мельком прочитал в единственной книге, которую прочитал (какая-то общая книга от микрософта, что-то про микросервисы). Ну кроме аспектно ориентированного програмирования, его не было.
С меня требовалось развернуть его код в контейнере и произвести пуско-наладочные работы.
И тут начался пиздец. Он превратил сервис, который буквально отвечал за 7 операций в то же самое, но с "BEST PRACTICES". Починены ли изначальные проблемы никто не знал.
Во первых этот ебанат зареферинсил библиотеки из .net framework 4.5.2. Он просто не знал, чем дотнет кор отличается от фреймворка.
DBContext взрывался с ObjectDisposedException. Челик просто возвращал ленивый IEnumerable и не парился.
Память утекала линейно (y=2x), за 2 часа мы падали с OutOfMemoryException. Оказалось, что ребята просто не знали что у объектов есть время жизни и их иногда надо диспозить. Память утекала во многих местах. Но самое дебильное, она утекала в ЛОГИРОВАНИИ.
Я нахуй никогда не видел, чтобы человек был настолько ебанатом, чтобы у него память утекла в ЛОГИРОВАНИИ БЛЯДЬ.
Далее. Приложение иногда просто останавливалось намертво. Дедлок нахуй. Вы когда нибудь доводили свой код до дедлока?
Стек-трейсы ошибок буквально состояли из какой-то каши, многократно помноженной на 7-8 бихавиоров. Ну. то есть, буквально, не влазили на два экрана.
Код, если очень долго вглядываться, по своей сути повторял структуру предыдущего сервиса, но привносил хуеву тучу проблем и вообще перестал читаться.
Это было ёбаное бесконечное навигирование от команды к её хендлеру через конфиг автомаппера. Понять что-то можно было только почитав исходник оригинала.
Я разворачивал этот сервис два месяца.
Потом, я его развернул. Запустил, и уволился нахуй. Я прекрасно понимал, что проблемы не только не решены, а, наоборот, приумножены. Это был первый раз, когда я уволился просто вникуда. Я понял, что нельзя так.
Мораль простая. Я теперь работаю только с русскими. Дотнет даёт безграничные возможности, чтобы возвести сложность кода в квадрат. Код опытного разработчика отличается своей наивной простотой. Сервис, который мы переписывали, таким и был. Его писали отцы с хорошим бекграундом в БД. Но тормозил и возвращал ошибки только потому что там отправляли неправильный запрос, который банально неэффективно расходовал ресурсы и починку можно было свести к 100 строчкам. MediatR - это не замена DI. За слова BEST PRACTICES надо бить в ебало.
Бля, жму тебе руку
Основной причиной было то, что Visual Studio на то время была 32-битным процессом, и при установке JetBrains Resharper, крашилась от недостатка памяти раз в несколько часов. Забегая вперёд, оказалось, что с Visual Studio всё в порядке, она просто не была готова к утечкам памяти в r#.
Я настолько привык в нём работать, что даже однажды оплатил подписку на Rider сам. Я прикинул, что два стакана кофе в год (на тот момент 150 евро вне зависимости от региона) я потяну и подписался.
Тут хотелось бы уточнить, что как специалист, я разделяю места, в которых уместна политика и места, в которых политика вредит. И рабочий процесс - это именно место где о политике говорить НЕЛЬЗЯ. Но JetBrains после начала войны ударились в политоту. Трёх моих знакомых разработчиков уволили оттуда за политическую позицию. Перед другими поставили ультиматум о переезде в европейский офис и так же уволили. Так же они публиковали у себя манифесты о поддержке войны со стороны Украины и удаляли из поддержки аккаунты российских пользователей? открыто хамили в комментариях. Ещё мне рассказывали, что ребят, которые собеседовались в JB, буквально спрашивали, поддерживают ли они украинские войска. То есть, в то время когда мы как разработчики-специалисты всеми силами игнорировали политические вопросы на работе, осознавая, что за соседним столом сидит гражданин государства, с которым мы воюем, компания JetBrains активно гадила. Потом дошло до того, что они принципиально отключили загрузку своих продуктов из России. Это стало последней каплей, но сегодня не об этом.
Сегодня у меня хорошая новость! Я окончательно пересел на VS, c продуманным планом отхода на VS CODE в случае чего.
И вот, что я заметил:
Во первых, производительность и качество Rider за 6-8 лет стала значительно ниже, чем на старте. Это была основная фишка Rider перед VS, теперь наоборот.
Сегодня VS гораздо быстрее. И более того, она расходует НА ПОРЯДОК меньше памяти. Райдеру нужно не менее 5 гигабайт оперативки просто чтобы раздуплиться. Студия работает от сотен мегабайт.
Ещё раз. Мой проект открывается в VS, и, после продолжительной разработки, расходует 1200 мегабайт.
Мой проект открывается в Rider cжирает 5 гигабайт памяти НА СТАРТЕ, а потом утекает до 6-8 гигабайт. Rider очень долго открывается, он греет ноутбук. При работе в Rider, ноутбук постоянно шумит вентиляторами.
Далее, фичи. Райдер всё еще удобнее для меня при работе с гитом. Так же запуск тестов удобнее. Но VS догнала все фичи, которые былы в r# и rider! Теперь это только дело привычки. Я уверен, что сейчас никто не назовёт киллер-фичу райдера.
Ещё одной неприятной особенностью райдера был ЭЙАЙ, который они встроили в райдер и отключили, пока не заплатишь им ещё больше денег.
Подводя итог, райдер растерял все свои преимущества, а его разработчики токсичные снобы. Сегодня бесплатная Visual Studio Community как минимум НЕ ХУЖЕ.
Основной причиной было то, что Visual Studio на то время была 32-битным процессом, и при установке JetBrains Resharper, крашилась от недостатка памяти раз в несколько часов. Забегая вперёд, оказалось, что с Visual Studio всё в порядке, она просто не была готова к утечкам памяти в r#.
Я настолько привык в нём работать, что даже однажды оплатил подписку на Rider сам. Я прикинул, что два стакана кофе в год (на тот момент 150 евро вне зависимости от региона) я потяну и подписался.
Тут хотелось бы уточнить, что как специалист, я разделяю места, в которых уместна политика и места, в которых политика вредит. И рабочий процесс - это именно место где о политике говорить НЕЛЬЗЯ. Но JetBrains после начала войны ударились в политоту. Трёх моих знакомых разработчиков уволили оттуда за политическую позицию. Перед другими поставили ультиматум о переезде в европейский офис и так же уволили. Так же они публиковали у себя манифесты о поддержке войны со стороны Украины и удаляли из поддержки аккаунты российских пользователей? открыто хамили в комментариях. Ещё мне рассказывали, что ребят, которые собеседовались в JB, буквально спрашивали, поддерживают ли они украинские войска. То есть, в то время когда мы как разработчики-специалисты всеми силами игнорировали политические вопросы на работе, осознавая, что за соседним столом сидит гражданин государства, с которым мы воюем, компания JetBrains активно гадила. Потом дошло до того, что они принципиально отключили загрузку своих продуктов из России. Это стало последней каплей, но сегодня не об этом.
Сегодня у меня хорошая новость! Я окончательно пересел на VS, c продуманным планом отхода на VS CODE в случае чего.
И вот, что я заметил:
Во первых, производительность и качество Rider за 6-8 лет стала значительно ниже, чем на старте. Это была основная фишка Rider перед VS, теперь наоборот.
Сегодня VS гораздо быстрее. И более того, она расходует НА ПОРЯДОК меньше памяти. Райдеру нужно не менее 5 гигабайт оперативки просто чтобы раздуплиться. Студия работает от сотен мегабайт.
Ещё раз. Мой проект открывается в VS, и, после продолжительной разработки, расходует 1200 мегабайт.
Мой проект открывается в Rider cжирает 5 гигабайт памяти НА СТАРТЕ, а потом утекает до 6-8 гигабайт. Rider очень долго открывается, он греет ноутбук. При работе в Rider, ноутбук постоянно шумит вентиляторами.
Далее, фичи. Райдер всё еще удобнее для меня при работе с гитом. Так же запуск тестов удобнее. Но VS догнала все фичи, которые былы в r# и rider! Теперь это только дело привычки. Я уверен, что сейчас никто не назовёт киллер-фичу райдера.
Ещё одной неприятной особенностью райдера был ЭЙАЙ, который они встроили в райдер и отключили, пока не заплатишь им ещё больше денег.
Подводя итог, райдер растерял все свои преимущества, а его разработчики токсичные снобы. Сегодня бесплатная Visual Studio Community как минимум НЕ ХУЖЕ.
Мне лень переучиваться под VS. На работе используем PyCharm, Android Studio, Intellij Idea и Rider. Всё продукция JetBrains. Попытка сесть за любую другую иде приведет к тому, что я начну путаться в горячих клавишах, забывать где какие настройки, придется дублировать плагины к которым привык (и то если они ещё есть на другой иде). В общем такое себе.
Насчёт политоты: пофиг. Их право задавать вопросы какие хотят во время собеседования, моё право в ответ на эти вопросы встать и сказать гудбай и уйти работать в другую компанию.
Крайне не рекомендую к использованию по следующим причинам:
- Volo.ABP имеет огромное количество неявных зависимостей, в том числе Autofac и динамические прокси Castle.
- Многие классы работают только благодаря перехватам вызовов и плохо спроектированному AOP. Вы будете ненавидеть слово Interceptor.
- Volo.ABP.AspnetCore ломает предсказуемую логику ASPNet.Core. Некоторые стандартные вещи, в том числе сериализация времени будет работать неожиданным образом.
- Внутри ABP.Volo устроен очень сложным способом. Один только репозиторий MongoDb имеет дерево зависимостей из примерно 150 классов.
- Многие методы расширения мимикрируют под стандарнтый dotnet. То есть, вы используете метод, из System.Collections.Generic. А на самом деле, э
то Volo сложили свои методы расширения в пространство имён дотнета. Первый раз такое вижу.
- Много ломающих изменений от версии к версии. Код перестаёт работать при обновлении
- Очень глубокая иерархия наследования, где дочерние классы ПЕРЕТИРАЮТ поведение родительских. Парни буквально не поняли концепцию наследования и отношения "А является Б"
В сухом остатке - никогда не связывайтесь с Abp.Volo.
Хм, а альтернативы есть, кроме как пилить свой велосипед?
Это копия, сохраненная 28 сентября в 07:34.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.