Задать вопрос
  • Недостатки видеоуроков?

    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 определяется позже, чем используется.
    Ответ написан
    Комментировать
  • В разных IDE код выдаёт разный ответ, как так?

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

    Что стандарт говорит нам о перегрузке операторов?
    A declaration whose declarator-id is an operator-function-id shall declare a function or function template or an explicit instantiation or specialization of a function template. A function so declared is an operator function.

    cout << a.get() << b.get();
    Данный код маскирует два вызова одной функции - std::ostream& operator << ( std::ostream&, int ).

    Тут очень важно уточнить форму перегрузки оператора, т.к. результат поведения этого кода сильно зависит от применяемой формы перегрузки.
    Относительно стандартной формы перегрузки operator << () стандарт говорит что это перегрузка в форме внешней функции.

    Значит приведенный код можно записать как:
    operator<<( operator<<( cout, a.get() ), b.get() );


    И именно с этого момента начинается самое интересное.

    Что стандарт говорит нам о вызове функций? А говорит он совсем разные вещи.
    C++14 [expr.call#5.2.2.8] заявляет, что:
    The evaluations of the postfix expression and of the arguments are all unsequenced relative to one another. All side effects of argument evaluations are sequenced before the function is entered (see 1.9).

    C++17 [expr.call#8.2.2.5] утверждает, что:
    If an operator function is invoked using operator notation, argument evaluation is sequenced as specified for the built-in operator; see 16.3.1.2.

    В результате, если транслировать данный код как код 14-го (или старших) стандарта, поведение у этого кода будет одно. Если же код транслировать как код 17-го (и моложе) стандарта, его поведение будет будет уже другим.

    А что же там с вероятным неопределенным поведением? Ведь неупорядоченная модификация состояния является UB. И, вроде как, cout << a.get() << b.get(); можно упростить до cout << ++i << ++i;, что уже более явно должно показывать наличие UB.
    UB в этом коде нет. И вот почему.

    Для определения порядка вычисления участков выражения следует руководствоваться правилами упорядочивания выражений.
    Среди прочих правил там записаны важные для нас сейчас. Я приведу цитаты.
    2) The value computations (but not the side-effects) of the operands to any operator are sequenced before the value computation of the result of the operator (but not its side-effects).

    3) When calling a function (whether or not the function is inline, and whether or not explicit function call syntax is used), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function.

    5) The side effect of the built-in pre-increment and pre-decrement operators is sequenced before its value computation (implicit rule due to definition as compound assignment)


    16) Every overloaded operator obeys the sequencing rules of the built-in operator it overloads when called using operator notation. (since C++17)

    19) In a shift operator expression E1<<E2 and E1>>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2. (since C++17)


    До C++17 порядок вычисления операндов cout << a.get() << b.get(); не определен, но поведение этого кода определено. Поэтому при трансляции по стандарту C++14 этот код может выдать или 12, или 21. Но не 11.
    Начиная с C++17 порядок вычисления операндов строго определен и является интуитивным, а результат выполнения cout << a.get() << b.get(); всегда однозначен. При трансляции этого кода по стандарту C++17 (и дальше) в консоль будет выведено всегда и только 12.
    До C++11 поведение кода cout << a.get() << b.get(); не определено.

    Сегодня мы уже не задумываемся о жизни до стандарта C++11, поэтому я не скажу что в общем смысле в этом коде присутствует UB. Я скажу что UB тут нет. Но тем не менее, я бы рекомендовал избегать присутствия подобного кода в проектах даже если используется стандарт C++17 и дальше.
    Ответ написан
    Комментировать
  • Как отменить два последних комита без потери локальных изменений?

    Можно ещё просто объединить эти комиты через rebase:
    git rebase -i HEAD~2

    И пометить один из комитов на squash.
    В данном случае это ничем не лучше чем reset --soft, просто более гибкий инструмент.
    Ответ написан
    Комментировать
  • Как повысить свои навыки в построении архитектуры сложных приложений?

    bingo347
    @bingo347
    Crazy on performance...
    Если по теории, то мне в свое время вот эта книга помогла:
    https://www.litres.ru/robert-s-martin/chistaya-arh...

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

    Через несколько месяцев прочел еще раз, анализируя все затупы, что записал за это время в блокнот. После прочтения начал потихоньку рефакторить в существующих проектах места, которые уж очень жить мешали.

    Еще через пол года прочел третий раз, опять же с оглядкой на личный опыт. И тут я кажется уже совсем въехал. По крайней мере многие проблемы с организацией взаимодействия между компонентами стали разрешаться. И вообще появилось достаточно четкое понимание, как структурировать приложение и где разбивать его на компоненты.
    Ну и после 3 прочтения еще помог момент: мне дали с нуля проектировать новое, достаточно крупное приложение на Rust. Притом заказчик кричал "микросервисы - это круто, хочу, хочу, хочу", а тимлид мне сказал "давай монолит, но так чтоб потом легко было распилить, а то все сроки про**ем". Вот тут прямо вообще понимание пришло. Ну и плюс в Rust архитектурные компоненты очень хорошо ложатся на отдельные крейты (это такая единица компиляции в Rust), а компилятор в принципе не дает делать циклические зависимости между крейтами.

    Ну и недавно решил освежить память и перечитать еще раз. И на этот раз уже были мысли вроде "так если делать по другому, потом проблемы вылезут тут и тут".
    Ответ написан
    1 комментарий
  • Как исключить один список файлов из другого в Make?

    mrjbom
    @mrjbom Автор вопроса
    Ответ res2001 вероятно подходит, но обнаруженная мной функция filter-out как раз делает всё что требуется
    Ответ написан
    Комментировать
  • Как определиться с направлением программирования или ЯП?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Отсутствует главный тезис о том, что знание ЯП не сделает вас программистом.
    Как вы верно заметили, понимание принципов работы серверов и сети тоже сильно помогут, в том числе и в случае со Swift, но этого также будет не достаточно, чтобы называться программистом (даже со знаниями ЯП).

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

    А при наличии опыта пересесть с одного ЯП на другой - это вопрос 1-2 недели максимум (ну кроме разве что С++ или какого-нибудь ассемблера).
    Ответ написан
    4 комментария
  • Как разделить xml файл спомощью bat/cmd?

    wisgest
    @wisgest
    Не ИТ-специалист
    Если файл будет иметь именно такой вид, то это просто (при этом будут потеряны пустые строки, если они есть):
    @echo off
    setlocal enableextensions enabledelayedexpansion
    
    :0
    if "%~1" == "" (
    	set /p in="Входной файл: "
    	call :0 !in!
    	exit /b
    )
    
    if not exist "%~1" (
    	echo "%~f1" не найден.
    	endlocal
    	exit /b 1
    )
    
    set /a i = 0
    for /f "usebackq skip=1 delims=" %%L in ("%~1") do  (
    	if "%%L" == "<post>"  (
    		set /a i += 1
    		(echo ^<?xml version="1.0" encoding="UTF-8"?^>)>!i!.xml
    	)
    	(echo(%%L)>>!i!.xml
    )
    endlocal

    — XML-формат не учитывается, идёт разделение по строкам <post>, которые должны начинаться с начала строки и не иметь пробелов в конце строки.
    Ответ написан
    8 комментариев
  • Как заставить Windows 10 при её выключении не выключать монитор до самого конца процесса выключения?

    Adler_lug
    @Adler_lug
    Отключите быструю загрузку и компьютер будет выключаться заметно быстрее и вместе с монитором.
    Ответ написан
    Комментировать