• Как повысить свои навыки в построении архитектуры сложных приложений?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    1. Хорошо помогает начать изучение с простых паттернов проектирования. Прежде всего это простые и понятные паттерны типа "стратегия", "команда", "итератор", "шаблонный метод", "посредник", "цепочка обязанностей". Изучив и поняв эти паттерны вы посмотрите на ООП по новому: не как просто структурированный код плюс данные в одном объекте, а именно как задумывалось его создателем - объект самостоятельная единица взаимодействующая с другими такими же посредством сообщений. Причём она является first class также как в функциональном программировании функция. К тому же на указанных паттернах строятся и остальные. Например, фабричный метод - это частный случай шаблонного метода. Так постепенно придет понимание куда и зачем применять различные паттерны.
    2. Когда решаете какую-либо задачу, думайте о нескольких вариантах архитектуры для её решения. Далее старайтесь выбирать
    вариант не на основе личных предпочтений или предыдущего опыта (не важно, положительного или отрицательного), а на основе анализа, какой из вариантов здесь реально потребуется с точки зрения дальнейшего развития проекта. Предыдущий опыт также надо учитывать, но все проекты разные, требования разные, и каждая ситуация может отличаться. Надо смотреть как могут изменяться или расшириться системные и функциональные требования (разумеется, для этого надо быть в контексте этих требований - т е знать их самих, манеру работы с проектом заказчика и т д) Во многих случаях, когда вы не сможете выбрать из-за недостатка информации, это логически подведёт вас задавать заказчику дополнительные вопросы. И через этот итеративный процесс приходит понимание, где и как применять паттерны.
    3. Обратите внимание на паттерны ERP систем (для примера книга "Шаблоны корпоративных приложений" Мартин Фаулер) Особенное внимание надо уделить такому шаблону как инверсия зависимостей. Данный шаблон лично мне помог совершенно по другому взглянуть на ООП (во второй раз, уже после того как я стал применять другие паттерны ООП) Вот здесь https://blog.byndyu.ru/2009/12/blog-post.html очень понятно на мой взгляд описано (язык C# но всё тоже самое будет для любого ОО языка) Кроме того в этом блоге много всего по проектированию и рефакторингу.
    4. Обратите внимание на книгу "Growing Object-Oriented Software, Guided by Tests" Стив Фриман Перевод на русский не гуглится, возможно его и нету. Но книга полезна тем, что в отличие от многих других книг по TDD в ней разбирается не только методика тестирования и написания тестов, но и принцип тест -> код -> рефакторинг. И разбирается на достаточно длинном примере. Из неё вы можете подчерпнуть привычку рефакторить, а не переписывать заново. Причём даже если у вас на проекте цикл другой - например тесты пишутся после функционала, всё равно образ мысли изменится и масштабный рефакторинг не будет вызывать непреодолимого желания выбросить и переписать с нуля.
    5. По рефакторингу могу порекомендовать книгу "Работа с унаследованным кодом" Майкл Физерс. Кроме того об этом много статей в уже упомянутом блоге Александра Бындю. Грубо говоря я бы назвал ту подборку статей "как не переписывать и начать жить"
    6. Ещё один блог где собрано большое количество полезных материалов по ООП, рефакторингу, проектированию, это блог Сергея Теплякова Вот ссылка на его подборку книг по теме: sergeyteplyakov.blogspot.com/2013/08/blog-post.html
    7. Изучайте материалы постепенно. Не стоит сразу пытаться воткнуть только что полученные знания в первый попавшийся проект. Обсуждайте возможные решения с коллегами. Со временем они также станут поддерживать эту практику. Если есть возможность, попрактикуйте парное программирование. Причём не обязательно с более опытным коллегой. Иногда вопросы задаваемые наивным человеком заставляют задуматься гораздо крепче, чем ответы получаемые от мудрецов.
    Ответ написан
    1 комментарий
  • Как подключится к ноутбуку(Wi-Fi) с компьютера (Ethernet) в одной сети (роутер) по RDP?

    @rPman
    Скорее всего на машине к которой подключаешься включен фаервол, с настройками по умолчанию блокирующий все подключения извне.

    В настройках фаервола необходимо отключить его для работы в локальной сети, выбрать тип сети - частная (по умолчанию она - общедоступная)
    Ответ написан
    5 комментариев
  • Куда пойти в IT немножко зная R?

    @dmshar
    О чем вы говорите? "Создание модели линейной регрессии и последующего прогноза" - ?? Да это студенты на 2-м курсе нынче изучают, а может и на первом. Любой технической специальности. Программирование на R? Тот, кто умеет программировать на любом - подчеркну, любом - языке программирования, осваивает R (именно - программирование, как таковое) за неделю.
    У меня есть к ТС вопрос. Вот представьте, если бы некий специалист в области информационных технологий и DataScience где то в своей работе описал регрессионную модель "продуктивности растительных сообществ" и после этого, считал, что с легкостью может найти работу в области экологии и биологии. Вы бы посмеялись?
    (По секрету скажу, что за свою жизнь я принимал участие в разработке как минимум четырех различных медицинских систем, некоторых - реально - очень больших и сложных. И что, я могу всерьез наедятся заняться медицинской практикой?)
    Почему-же вы считаете, что переход в обратном направлении более легок?
    Вот как-то примерно так.
    Если вы планируете переезд, то надо четко себе уяснить, что это на просторах пост-СССР разница зарплат программиста и эколога ли биолога существенна. Но вот на просторах цивилизованного мира - особой разницы (в среднем) нет. Поэтому на вашем месте я бы не шарахаться по разным специальностям стал, а подтягивать иностранный, скилзы по основной специальности, искал бы для начала стажировки или post -docs места. Шансов на успех явно будет больше.
    Ответ написан
    2 комментария
  • Кодирование IP-пакетов в звук?

    gbg
    @gbg Куратор тега Компьютерные сети
    Любые ответы на любые вопросы
    Поздравляю, вы изобрели модем.
    В некоторых старинных мобилках он присутстовал и позволял делать именно то что вы хотите.
    Важно понимать разницу между GSM модемом, GPRS, 3G и 4G. Данные в голосовом канале передает только первый из списка.

    Его можно
    -купить как отдельное устройство
    -купить в составе старинного сотового телефона
    -сколхозить даже из современного телефона, провода для гарнитуры и модема | софта, эмулирующего модем
    Ответ написан
    9 комментариев
  • Почему служебные символы работают не везде?

    karabanov
    @karabanov Куратор тега Linux
    Системный администратор
    bash так не умеет, после раскрытия аргументов возникает неоднозначность ввиду большого количества аргументов (собственно в сообщении об ошибке так и написано "ambiguous redirect").
    Можешь воспользоваться утилитой tee, она так умеет, например:

    cat 1.txt | tee {2,3,4,5}.txt 1>/dev/null

    tee направляет вывод в файл и на стандартный вывод, можно не добавлять 1>/dev/null, тогда содержимое файла будет так же выведено на экран, но врятли это требуется в данной ситуации.
    Ответ написан
    4 комментария
  • Почему программа на Си молчит?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что atoi(const char * string)
    Ответ написан
    Комментировать
  • Assignment operator VS Destructor + Placement new, где аргумент placement new - prvalue?

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

    Читатель современного кода не должен задаваться вопросами: что тут делает ядовитый газ, зачем швабры и почему вентилятор такой большой [?].
    Читателю все должно быть понятно практически сразу, у него должно возникать как можно меньше вопросов.

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

    *reinterpret_cast<T*>( &buffer[ sizeof( T ) * head ] ) = T{ std::forward<Args>( args )... };

    Да, тут присутствует Value Initialization и оператор перемещения. Однако, оптимизация этого кода сведет все к довольно короткому и как можно более быстрому коду. Поэтому не стоит беспокоиться об этом на текущем этапе. Лучше беспокоиться о понятности кода для читателя.
    Столь же понятным будет и такой код:
    auto T vicar{ std::forward<Args>( args )... };
    std::swap( *reinterpret_cast<T*>( &buffer[ sizeof( T ) * head ] ), vicar );

    Он не будет вызывать много вопросов, разве только вопрос относительно использования std::swap, но только от людей со слабой привычкой пользоваться STL.

    Однако, такой код может привести к ошибке трансляции в том случае, если T является неперемещаемым. В твоем ЦБ должны присутствовать проверки на перемещаемость, копируемость и возможность размена состояний.
    Если T можно копировать, но не перемещать, использовать стоит оператор копирования.
    И только если ни копировать, ни перемещать T нельзя, следует пользоваться деструктором и размещающим конструктором.

    Я бы рекомендовал все три действия оформить в виде перегрузок шаблона функции со SFINAE, чтобы для любого T включалась только одна конкретная перегрузка шаблона.
    Ответ написан
    6 комментариев
  • В чем разница между delete и nullptr?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    g = nullptr не удалаят память, оно просто записывает в переменную g значение со смыслом - "указатель вникуда". Память при этом остается нетронутой и к ней можно обращаться, что вы и делаете, запомнив указатель в другой переменной.

    delete[] же освобождает память, а значит, все последующие обращения к ней, что при помощи g, что при помощи gg - будут вызывать UB
    Ответ написан
    Комментировать
  • Недостатки видеоуроков?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Нужен огромный и продолжительный труд, чтобы написать приличную книжку.
    Чтобы в ней было не 10 страниц, а много хорошего материала, с примерами, с задачами, с изложением. Оформить, вычитать, отредактировать, договориться с издателем, выпустить, получить какую-то отдачу.
    Хорошую книгу ты читаешь долго. Месяц, два, год. Перечитываешь.

    Текст ты читаешь в удобном для себя темпе, легко пересматривая и перечитывая абзацы.
    Остановившись на странице книги, ты можешь просто просмотреть глазом предыдущую страницу и продолжить чтение. С видео так не получается - из головы вылетает все, и надо просматривать как минимум пару минут перед этим, если отлучился на час-два.

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

    Также видео делать сложнее, чем писать текст. Гораздо дольше. Гораздо дороже.
    Редактирование видео вещь в разы более муторная, поэтому чаще просто переснимают короткие блоки, а это опять таки непросто.
    То есть сделать видео с таким же качеством материала и с такой же плотностью материала - в десятки раз дороже по всем ресурсам - деньги, время, оборудование.
    И при этом никто не будет смотреть месяц видео (160 часов, например). Никто не будет делать поиск внутри видео, закладки на нужные отрывки и использовать видео как справочник.

    Перенести материал из книги перенести в видео - это непомерный труд с одной стороны и совершенно невостребованный с другой стороны.
    А поэтому никто не делал, не делает и не будет делать видео с таким же наполнением материалом, как это можно сделать в тексте.

    Видео - это разок посмотреть на чей-то практический материал, разок посмотреть как это делает кто-то другой.

    А поэтому все видеокурсы, которые существуют - это беглый обзор чего-либо, какой бы длинный курс это ни был, это все равно гораздо более поверхностный материал, чем текст.
    Текст требует от тебя большего вовлечения, чем видеокурс, а обучение - в первую очередь это усилия со стороны ученика.

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

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

    P.S. Все вышесказанное касается разработки и администрирования. В "визуальных" профессиях, возможно видео может давать гораздо больше. Например хореография, фехтование, музыка, возможно дизайн. Но там тоже множество книг, которые дают фундаментальную информацию лучше, чем видео.

    P.S. Одним из самых важных минусов видео я считаю то, что ты не можешь получать информацию в комфортном для себя темпе, с возможностью быстро перечитать слово/фразу и обдумать ее. Сам читаю множество лекций, и эта проблема, когда скажешь 2-3 предложения быстрее, чем обычно и половина учеников отваливается с бессмысленным взгядом. Так на живом курсе ты можешь обратить на это внимание и перефразировать, а записанное видео уже не изменишь.
    Ответ написан
    1 комментарий
  • Что конкретно происходит при вводе команды apt install?

    @pfg21
    ex-турист
    пакет ищется в скачанных листингах репозитория (обновляются по apt update).
    кеш лежит в /var/lib/apt/lists.
    из всех подходящих записей выбирается запись с самым большим значением Version
    из этой записи берется ссылка на пакет и скачивается.
    после чего пакет передается dpkg для установки.
    Ответ написан
    4 комментария
  • Чему учит Марк Лутц?

    saboteur_kiev
    @saboteur_kiev Куратор тега Python
    software engineer
    Но полистав pdf-файл этой книжки я не смог найти ни одного куска кода, который был бы для меня не понятен. Разве что незнакомые модули.


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

    Потом попробуй почитать стандартные вопросы на интервью для джуна.
    Ответ написан
    5 комментариев
  • Чему учит Марк Лутц?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Ответ написан
    Комментировать
  • Обязательно ли читать книгу по языку/технологии что бы быть тру и продвинутым кодером?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Вы не найдёте ни одного авторитетного программиста с мировой известностью, который бы утверждал, что курсы и видео-уроки лучше книг. Обычно это утверждают либо профаны, оправдывающие своё нежелание читать, либо авторы курсов, делающие деньги на лентяях и глупцах. И я лично за 18 лет в отрасли встретил множество программистов, но ни одного хорошего, выучившегося по курсам и видео-урокам.

    Видеокурс может запилить любой дурак. Чтобы написать книгу, нужно иметь авторитет достаточный для издательства. Кроме того, текст пройдёт редактуру нескольких профессионалов. Поэтому знания в книгах качественные и систематизированные. Для начинающего это очень важные качества.

    К тому же, после достижения профессионального уровня достаточного чтобы называться специалистом, вы обнаружите, что необходимые на этом уровне знания можно почерпнуть только из документации. То есть всё равно придётся читать. Много и часто.

    Наконец, постоянная практика чтения неизбежно приводит к увеличению скорости чтения. И наступает момент когда прочитать учебник будет в 10 и более раз быстрее, чем просмотреть видеокурсы по той же теме и в том же объёме.

    Кроме того, чтение развивает абстрактное мышление - основной инструмент разработчика.
    Ответ написан
    16 комментариев
  • Как научиться писать большие проекты в одиночку и не сойти с ума?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Декомпозиция
    Ответ написан
    Комментировать
  • Как правильно выделить память (с проверкой выделения) для массива класса?

    @Mercury13
    Программист на «си с крестами» и не только
    Но обычный new выкидывает std::bad_alloc.
    Так что не совсем понятно, что вы хотите сделать, когда делаете new с флагом «не кидать», а потом при неудавшемся new кидаете аварию.
    Ответ написан
    Комментировать
  • Как из c++ выполнить python?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала нужно решить, нет ли возможности оставить две программы отдельно, связав их через стандартный ввод/вывод, файлы или сокеты? Пусть одна запускает другую просто как дочерний процесс, это проще всего.

    Если это категорически должна быть одна программа, то нужно решить, кто будет "главным".

    Если главным будет Питон, который должен вызывать код на C/C++ (оформленный в виде DLL), то может пригодиться модель ctypes. Альтернативно, можно написать модуль интерпретатора.

    Если главным будет C++, который должен выполнять код на питоне, то тут уже нужно читать про embedding python.
    Ответ написан
    Комментировать
  • Как будет выглядеть данный псевдокод в коде на языке Си?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вижу несколько проблем. Во-первых, проставьте фигурные скобки ко всем циклам. И отступы поставьте аккуратно (открывающая скобка - +отступ, закрывающяя - -отступ). У вас сейчас инструкции, которые вы думаете в цикле - они вне его.

    Во-вторых, вот это что такое вообще? return flag=1;
    Ответ написан
    3 комментария
  • Какое связывание у namespace, определённёго в области видимости файла .cpp?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Файлы с расширением .cpp обычно являются точками сборки модулей трансляции [?].
    Характеристики связывания имеют свой эффект только между модулями трансляции. Компоновщик занимается связыванием кода и работает с результатами обработки именно модулей трансляции - объектными файлами.
    Поэтому, если в одном .cpp подключить другой .cpp (исключенный из сборки иными способами), то все элементы с внутренним связыванием любого из этих .cpp будут доступны в них обоих.
    Это будет справедливо и для файлов с расширением .h. Файлы .cpp обычно включают .h и все вместе своим кодом формируют модуль трансляции, в котором доступны все элементы с внутренним связыванием. Даже в коде файлов .h.
    Это важно учитывать чтобы не совершать некоторых ошибок.

    По существу вопроса. Все нестатические (без спецификатора static) элементы именованных пространств имен по умолчанию имеют внешнее связывание [?]. Глобальное пространство является тоже именованным (и доступно через :: без имени слева) и ровно так же наделяет все свои нестатические элементы характеристикой внешнего связывания.

    В противоположность этому, абсолютно все элементы анонимных пространств имен (даже элементы вложенных именованных пространств) имеют характеристику внутреннего связывания [?].
    Довольно распространенной ошибкой является определение анонимных пространств и статических элементов пространств в заголовках, после чего сразу множество модулей трансляции пополняются кодом с внутренним связыванием. Это приводит к разбуханию бинарного кода и усложнению сборки.

    Отдельно хотелось бы обозначить inline.
    Спецификатор inline[?] дает пометку слабого внешнего связывания для любой сущности. Что константа или глобальная переменная, что функция или метод (даже статический), помечаются как сущности с внешним связыванием, которое не нарушает ODR в случае если все определения цели связывания во всех модулях трансляции являются полностью одинаковыми. Если хоть одно определение цели связывания отличается - будет нарушение ODR.
    Компоновщик подберет самое первое определение и встроит его в бинарный код. После этого компоновщик будет только проверять другие встреченные определения на предмет соответствия первому, а линковку кода будет производить только относительно первого встреченного определения.
    Поэтому, если в любом именованном пространстве, в нескольких .cpp определить inline функции с одним именем и одной сигнатурой, но разными телами, то проблем со сборкой будет не избежать.

    Все это можно более детально изучить в статье на хабре.
    Ответ написан
    Комментировать
  • Куда пропало место на диске С в Windows 7?

    Compolomus
    @Compolomus
    Комполом-быдлокодер
    Ну зайдите в свойства диска С, освободить место, дополнительно, там удалите из винды обновления которые больше не нужны, после перезагрузки будет очистка
    Ответ написан
    4 комментария
  • Почему идентификатор не определён?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Переменная w определяется позже, чем используется.
    Ответ написан
    Комментировать