• Какая книга станет хорошим фундаментом для изучения C#?

    Griboks
    @Griboks Куратор тега C#
    Мне нравится эта книга (онлайн). Лучше не встречались, ещё и всегда актуальная версия.
    Ответ написан
    6 комментариев
  • Какая книга станет хорошим фундаментом для изучения C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Все хорошие.
    Третья - это скорее справочник, чем полноценная книга.
    Я бы выбрал троелсена.
    Ответ написан
    Комментировать
  • Какие инструменты нужны для разработки игр?

    @MarkusD
    все время мелю чепуху :)
    Сегодня существует ровно два базовых направления разработки конкретного коммерческого проекта.
    Способ первый: купить лицензию или подписку на уже готовый инструмент разработки и заняться непосредственно разработкой своей игры.
    Способ второй: иметь в своем штате команду разработчиков собственного инструмента, на базе которого можно заняться разработкой своей игры.

    Первый способ популяризирует публичные универсальные инструменты разработки.
    Второй способ эксплуатирует проприетарные инструменты.

    Первый способ отдает разработку и поддержку движка на аутсорс непосредственно разработчикам инструмента, часто за отдельную плату, часто сопровождаясь или длительным ожиданием, или отсутствием гарантий внедрения требуемых решений.
    Второй способ позволяет быть на короткой руке непосредственно с разработчиками инструмента, но требует от разработчиков экспертности знаний в требуемых для разработки областях. С одной стороны таких людей очень сложно найти, с другой стороны таким людям надо очень много платить.

    DirectX, Vulkan и OpenGL, равно как Metal и ряд проприетарных GAPI некоторых закрытых платформ, не являются графическими библиотеками. Это все - Graphics Application Programming Interface - GAPI.
    Это - низкоуровневые интерфейсы драйвера GPU, позволяющие эксплуатировать ресурсы видеокарты в своих целях. Не только для рисования чего-то, а для ИИ, ML, сложных статистических вычислений, предсказаний и прочих расчетов на больших объемах данных.
    Под капотом любого инструмента, будь-то проприетарный или публичный, в его графическом слое используется один или несколько GAPI. Без этого никак.
    OpenGL, как и DirectX 11, нисколько не устарели, поскольку предоставляют упрощенный интерфейс управления ресурсами GPU. Они используются тогда, когда разработчикам не нужны самые тонкие механизмы управления ресурсами GPU, которые предоставляют DirectX 12 или Vulkan. Потому что последние, помимо прочего, требуют от разработчиков более глубокой экспертизы и больше ресурсов на разработку всего того же, что на OpenGL и DirectX 11 реализуется меньшими силами и за меньшее время.

    И нет, одним только инструментом, на базе которого ведется разработка игрового проекта, не обойтись. Все ресурсы разрабатываются в других инструментах: графических редакторах, звуковых редакторах, редакторах анимаций, редакторах баз данных. Пайплайны производства ресурсов являются очень сложными, могут насчитывать десятки инструментов для производства одного только типа ресурсов и требуют от артистов экспертизы в использовании этих инструментов. И часть таких инструментов обязательно будет проприетарными, созданными или под конкретный проект, или внутри конкретной компании. И иногда такие инструменты удобнее создавать с применением других, более мелких или лучше заточенных под задачу, движков. Игровой движок не всегда используется для создания игр.
    Отдельно стоит в этом вопросе код игровой логики и шейдеров. Для этого тоже нужны специалисты и инструменты.

    Информации по каждой отдельной области разработки игр хоть отбавляй. Ее настолько много, что одному человеку за жизнь не усвоить. Поэтому от современного специалиста сегодня требуется спрофилироваться, т.е. определиться со своим профилем работы и стать экспертом.
    Я больше 15 лет занимаюсь разработкой игровых движков и медиаферймворков. Более 10 лет занимаюсь коммерческой разработкой кросслпатформенных инструментов. Я начинал свое обучение по книгам и документации для всех интересующих меня областей еще 20 лет назад. Я самостоятельно освоил множество API, включая графические, сетевые, звуковые и API целевых платформ, используя книги и документацию. Экспертные знания C++ и прочих языков я получил тоже через изучение документации, стандартов и книг.
    Я могу сказать что обучаться по книгам и документации можно и самостоятельно. Еще можно заплатить деньги и получить более точечные знания через их интерпретацию на распространенных сегодня онлайн-курсах. Такие знания не всегда бывают лучше полученных самостоятельно, но времени на освоение того же объема знаний на курсах уйдет меньше чем при самостоятельном изучении. Иными словами, занятия на онлайн-курсах не отменяют важности самостоятельного изучения основных источников информации.
    По открытым видеоурокам на ютубе и прочих видеохостингах обучаться нечему. Цель этих видео - чтобы зритель посмотрел рекламу и этим принес доход автору.
    Ответ написан
    2 комментария
  • На каком железе лучше всего начать изучении C++ с нуля?

    Никакой разницы.
    Ответ написан
    Комментировать
  • Как правильно описать метод на rust?

    vabka
    @vabka
    Токсичный шарпист
    У тебя проблема не в трейтах, а в том что ты пытаешься обращаться к полям структуры, которая передаётся как T.
    Решить эту проблему можно добавлением ещё одного трейта и ограничением женерика.
    Вот так должно работать:
    pub struct Animal {
        pub name: String,
        pub age: i32,
        pub strength: i32,
    }
    
    pub struct Person {
        pub name: String,
        pub age: i32,
        pub strength: i32,
    }
    // Выделяем новый трейт, который позволяет получить силу
    trait Strength {
        fn strength(&self) -> i32;
    }
    
    trait BaseTrait {
        fn init(&self);
        
        // В старом трейте принимаем target по ссылке и ограничиваем, что принимаем только такой target, который реализует trait Strength
        fn stronger_than<T>(&self, target: &T) -> bool
        where
            T: Strength;
    }
    
    impl Strength for Person {
        fn strength(&self) -> i32 {
            self.strength
        }
    }
    
    
    impl Strength for Animal {
        fn strength(&self) -> i32 {
            self.strength
        }
    }
    
    impl BaseTrait for Person {
        fn init(&self) {
            println!("Hello, im Person: {}", self.name);
        }
    
        fn stronger_than<T>(&self, enemy: &T) -> bool
        where
            T: Strength,
        {
            self.strength > enemy.strength() // вызываем метод, вместо обращения к полю
        }
    }
    
    impl BaseTrait for Animal {
        fn init(&self) {
            println!("Hello, im Animal: {}", self.name);
        }
    
        fn stronger_than<T>(&self, enemy: &T) -> bool
        where
            T: Strength,
        {
            self.strength > enemy.strength()
        }
    }
    
    fn main() {
        let person = Person {
            name: String::from("John"),
            age: 25,
            strength: 12,
        };
        let animal = Animal {
            name: String::from("Elephant"),
            age: 5,
            strength: 360,
        };
    
        person.init();
        animal.init();
        
        if person.stronger_than(&animal) {
            println!("Person is stronger than animal");
        }
        if animal.stronger_than(&person) {
            println!("Animal is stronger than person")
        }
    }

    Либо можно вынести функцию stronget_that в отдельный трейт и реализовать его для каждого T, по аналогии с ответом Василий Дёмин, но тогда реализаций придётся писать целую гору.
    Ответ написан
    Комментировать
  • Зачем нужно писать using?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Visual Studio на новых версиях не добавляет using System; из-за того что в .NET 6 и C# 10 появились implicit usings
    А конкретно (в консоли):
    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Threading;
    using System.Threading.Tasks;

    Если ты их выключишь через <ImplicitUsings>disable</ImplicitUsings>, то ошибка появится.
    открыл онлайн компилятор, действительно ошибка

    Зависит от того, что за онлайн-компилятор.
    Ответ написан
    Комментировать
  • Можно ли в .NET (C#) при компиляции вычистить из подключенной библиотеки лишние функции?

    yarosroman
    @yarosroman
    C# the best
    https://docs.microsoft.com/en-us/dotnet/core/deplo...
    Данная фича ещё с core 3.1 присутствует, в 6 уже как стабильная
    Ответ написан
    Комментировать
  • Можно ли в .NET (C#) при компиляции вычистить из подключенной библиотеки лишние функции?

    @d-stream
    Готовые решения - не подаю, но...
    Надо превратить эту библиотеку во множество nuget пакетов [вместо одного самолёта с зонтиком, гусеницами, бассейном и теннисными кортами]
    Ответ написан
    Комментировать
  • Зачем нужна инкапсуляция в ООП?

    delphinpro
    @delphinpro
    frontend developer
    Инкапсуляция - это грубо говоря объединение связанного функционала. В ООП в виде класса.
    Плюс скрытие деталей реализации функциональности.

    Если говорить о ваших классах Database и URL, то в первом объединяются функции работы с базой, а во втором с адресами. Это первое.
    Второе: Классы имеют публичный интерфейс. Работая с классом через этот интерфейс, вам не нужно знать что происходит внутри. Достаточно знать, что дать на вход, и что вы получите на выходе.
    Ответ написан
    2 комментария
  • Зачем нужна инкапсуляция в ООП?

    Starina_js
    @Starina_js
    full-stack web dev
    Да, есть такая проблема, путаница в понятиях, плюс разные языки программирования по своему трактуют и реализуют такой механизм.

    Полиморфизм, инкапсуляция, шаблоны проектирования (и т.п.) придумали для простой и банальной цели — удобство командной работы. Чтобы программисты быстрее закрывали задачи, чтобы быстрее понимали друг друга и чужой код, чтобы была стандартизация в командной работе, чтобы была определенная договоренность делать так, а не иначе. Конечно, не забываем учитывать бизнес задачи — экономия на реализацию и поддержку проекта, когда он разрастается.

    Когда на проекте работают сотни программистов, хочешь ты или нет, будет создаваться система контрактов или договоренностей между людьми. Одна из таких — безопасность от случайных воздействий или устойчивость. Возможность скрыть или защитить данные от внешних воздействий. Хотя это не только, еще про объединение данных и функций работы с данными.

    Пример: создали класс, в классе добавили свойство. Свойство используется в функциях этого класса и от него зависит поведение. Допустим какой-то коэффициент. Когда ты один работаешь на проекте, ты знаешь код и работаешь с этим свойством правильно, а вот когда работают сотни программистов, они понятия не имеют что это за свойство и не должны знать об этом. Кто-то может по ошибке перезаписать коэффициент и будет проблема...

    Пример: бизнес торопиться вывести новую функцию на рынок. Чем быстрее выведет, тем быстрее начнет зарабатывать. Бизнес просит программистов делать это побыстрее. Программисты пыхтят, у них высокая нагрузка им некогда разбираться с чужим кодом. Видят нужное им свойство, начинают с ним работать и изменяют под себя.
    Вроде все ок, и программа не упала и все тесты прошли, начали релизить проект. Прошла неделя и пользователь как-то нестандартно использовал новую функциональность и вместо 100 руб, списался 1 миллион. Беда косяк, а бывают и серьезней последствия. Случилось это потому, что кто-то изменил маленькое свойство в чужом коде.

    Поэтому программисты решили договориться — объединяйте и важное прячьте, делайте недоступными для воздействия, хотите поменять коэф — давайте правильный и безопасный метод.

    Кстати инкапсуляция это не только "про" или даже "в" ООП, оно вполне себе реализуется и в функциональном программировании.

    Как-то так)
    Ответ написан
    Комментировать
  • Зачем нужна инкапсуляция в ООП?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Зайдите в гараж. В одном углу сварочник и электроды , в другом верстак, там сверлилка и коробки со свёрлами, дальше коробка с метизами. Все упорядочено и не нужно далеко ходить. Это будет инкапсуляция. В другом все свалено вместе и метизы и свёрла и отвертки и ножовки. Прежде чем начать работу вы ищете инструменты и детали
    Ответ написан
    2 комментария
  • Как правильно написать классы БЭМ для кнопок?

    Get-Web
    @Get-Web Куратор тега CSS
    Front-End Developer
    Блок_модификатор_значение

    button_theme_ghost
    button_size_small

    <button class="button button_theme_ghost button_size_small">
    Ответ написан
    3 комментария
  • Как правильно описать конструктор класса для значений из Firebase?

    Jacen11
    @Jacen11
    боже, какая срань. Вы хоть немножко смотрели особенности котлина?

    class Houses(var costV: String, var  locationV: String, var roomsV: String, var squareV: String, var image: String, var infoV: String, var put: String, var date: String, var time: String)

    вот это тоже самое что сделали вы

    does not define a no-argument constructor
    написано же, черным по белому
    когда вы так сделали какие то новые проблемы появились?
    Ответ написан
    2 комментария
  • Путь до junior developer (java/kotlin). Сколько времени потребуется?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день.
    Расскажу про свой путь становления разработчиком и может быть это натолкнет вас на некоторые мысли и возможно, даже поможет принять решение.

    Лет 10 назад изучал html, css, php, SQL, как хобби.

    Аналогично. Правда, это было 13 лет назад. Я тогда забил на РНР. Первый сайт вообще поднял на Microsoft FrontPage, затем уже пошли различные CMS (Joomla, WP, Drupal). Окончил вуз по другой специальности. 3-4 года фрилансил как ВП разработчик, но в определенный момент надоело клепать сайты и захотелось чего-то большего. Тогда я владел рнр, js на определенном уровне, но писать на нем не было желания. Выбор пал на Java. Начал изучать самостоятельно с 2018 года (писал парсеры, приложения на JavaFX, пару приложений для андроид и т.д.). Но с учетом моей любви к вебу и к энтерпрайз, то в 2020 году прошел 6-мксячный курс по Java Core & Java Enterprise. Сам много чего изучал. Читал книги, брал курсы на udemy, изучал чужой код на гитхаб, брал мелкие, простые заказы, писал пет проекты и т.д.

    Насколько наличие сертификата об окончании платных/бесплатных курсов помогает в поиске работы или работодателя в первую очередь интересуют знания кандидата?

    Разумеется, что знания важнее. А уровень ваших знаний определеляется на собеседовании.

    Путь до junior developer (java/kotlin). Сколько времени потребуется?

    В первую очередь, зависит от вас. На курсах преподаватель может впихнуть в вас весь учебник, но не факт, что вы его запомните. Но минимальное время наверное, 6 мес. Как правило, курс Java Core занимает примерно 3 месяца и Android API занимает тоже 3-4 месяца. Этого времени достаточно для того, чтобы вы устроились в качестве trainee || junior.

    Вот, полезные ссылки, которые помогут вам в достижении ваших целей:
    https://www.hackerrank.com/
    https://refactoring.guru/
    https://www.baeldung.com/
    https://www.it-academy.by/
    tutorials.jenkov.com
    https://www.tutorialspoint.com/java/index.htm
    https://vladmihalcea.com
    https://github.com/enhorse/java-interview
    гугл

    Не забываем про учебники:
    Java head first (хотя его я не очень люблю)
    Г. Шилдт - Полное руководство по Java
    Р. Лафоре - Алгоритмы и структуры данных Java
    Б. Эккель - Философия Java
    Р-Г. Урма - Современный язык Java.
    Б. Гетц - Java Concurrency на практике
    и др.
    Ответ написан
    2 комментария
  • Путь до junior developer (java/kotlin). Сколько времени потребуется?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    В среднем обучение первому языку с нуля занимает от полугода до года. Но есть очень много тех, кто вообще не справился, даже потратив существенно больше времени.
    Ответ написан
    Комментировать
  • Идеальное логирование в .NET приложении. Как достичь? Что использовать?

    @Voland69
    Механизм таков:
    1. Везде где есть логи пишем в стандартный логгер из Microsoft.Extensions.Logging, там ILogger, где T - тип класса, из которого пишем логи.
    2. Поднимаем ELK стэк рядом или на соседней машине
    3. В конфигурации приложения подключаем реализацию логгера, умеющую отправлять логи в Logstash (например Serilog)
    4. Не забываем в конфигурации приложения сделать fallback - если в Logstash не получилось, кидаем в файл (потом если что можно руками скормить)
    5. Если нужно, фильтруем логи на уровне Logstash (как минимум нужно предусмотреть, чтобы логи шли в нужный индекс в ElastickSearch)
    6. Настраиваем дашборды в Kibana и мониторим работу приложения.

    P.S. может это конечно из пушки по воробьям, но как вариант можно использовать часть ELK стэка если все не нужно - тот же логстеш может не в эластик писать, а в файл насколько я помню - т.е. можно сделать наборы файлов по фильтрам.
    Ответ написан
    3 комментария
  • Идеальное логирование в .NET приложении. Как достичь? Что использовать?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Берем логгер который умеет структурное логгирование: Microsoft.Extensions.Logging или Serilog.
    Берем базу данных которая умеет хранить документы.
    Есть несколько опций:
    - Seq (бесплатен для разработки, но для бизнеса платный)
    - ApplicationInsights (нужет Azure, есть мизерный бесплатный лимит логов на день, дальше платно)
    - ElasticSearch + Kibana
    - Grafana + Loki

    Есть, конечно, и другие БД для хранения доков, но то что я указал, ближе всего к задаче
    Ответ написан
    Комментировать
  • Идеальное логирование в .NET приложении. Как достичь? Что использовать?

    Griboks
    @Griboks Куратор тега C#
    Насчет конкретных библиотек сказать не могу, т. к. пользуюсь самописной, но elastic stack позволяет анализировать и визуализировать логи на лету.

    Также несколько советов логирования:
    1) разделите вашу программу на логические многоуровневые вложенные подсистемы, т. е. при логировании, например, кнопки к сообщению добавляется аттрибут system=client.ui.form
    2) приоритезируйте логи, т. е. при ошибке добавляется аттрибут level=error, при вылете =critical, при отладке =trace...
    3) добавьте другие полезные аттрибуты для анализа, например дату и время, id пользователя
    4) используйте двустороннюю человеко-читаемую сериализацию, т.е. не тупо текст, а какой-нибудь csv или json (обязательно utf8)
    5) используйте базу данных или ротацию по времени и размеру
    6) централизуйте хранение и анализ логов
    7) используйте препроцессор для логирования отладки только в отладочной сборке, а лучше используйте нормальный отладчик с отслеживанием событий и условной остановкой

    P. S.
    Главное правило логирования: воспроизвести проблему на машине разработчика, а не задокументировать ее на машине пользователя.
    Ответ написан
    Комментировать
  • Как правильнее развернуть мелкий бизнес по созданию сайтов на готовых шаблонах?

    nki
    @nki
    bezkart.ru готовая система лояльности
    Начните и поймете реально это или нет. Многое будет зависеть от вашего умения продать свои услуги.
    Ответ написан
    Комментировать