Ответы пользователя по тегу Программирование
  • Есть ли практическая польза от книги sicp?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    SICP учит думать по-программерски. Учит находить решения в программерском мире. Есть огромная разница между программистом знающим как использовать фреймворк1, фреймворк2, ..., фреймворкN и другим программистом, который может даже и не знать как использовать эти фреймворки, но сможет отличить что вон тот код очень похож на работу за O(n) , а вон тот вроде как за O(1) и сможет сделать более правильный выбор. Грубо говоря есть некий базис, который одному позволяет создавать решения более стабильные, более эффективные, а другому из-за не хватки приходится городить костыли.

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

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Конкретно в этом случае я бы просто назвал: likes_in_vkpost().

    Поясню:
    1.
    Если функция используется в правой части и присваивает значение в переменную в левой части, то что это если не геттер-функция? Зачем еще раз заострять читателю кода "Нет чувак, я тут 100 пудов достаю лайки из поста". Ему надо просто сказать "Лайки из поста". Не верит, пойдет в функциию и почитает ее код или заглянет в код юнит-тестов.

    Если в коде гет-функии шлется http-запрос, потом получается http-ответ. Потом что-то считается. То это означает нарушение принципа "одно действие одна функция".
    * Послать запрос одна функция
    * Получить ответ другая
    * Проанализировать еще одна
    * А вот достать уже полученное из сети и хранящееся в объекте или каком-либо хранилище в памяти это и есть гет-функция. По этому ее делают read-only , чтобы она не разрушила объект и тогда она получается "свойством объекта" и по этой причине нет смысла использовать 'get' в имени функции

    2. Глагол в функции имеет смысл использовать только тогда, когда вы хотите ЯВНО сказать, что тут нужна крайне внимательно присмотреться.

    2.1. У вас есть сложный вычислительный процесс по подсчету лайков и этот код может "тупить", т.е. долго работать тогда и надо говорить compute_likes(). Читающий код задумается при глаголах: compute, analyze, etc

    2.2. Обновление значений в объекте тоже может нести опасность и по этой причине нужно добавлять 'set' . Если у чувака объект рушится, то он задаст вопрос: "А кто изменяет объект?" и тогда он будет искать глаголы : set, update, push, pop, etc

    3. Используйте грамматику английского языка

    Возьмем предложения "Эта строка пустая?", "Эти данные зашифрованы?". Как бы вы спросили это по-английски?
    'Is string Empty?" , 'Is data encrypted'?. Тогда в коде будем читать как:

    if ( str1.empty() )
    if ( data1.encrypted() )

    Если вы будете использовать схему:

    if ( str1.is_empty() )
    if ( data1.is_encrypted() )

    То вы нарушаете грамматику английского. Глагол 'to be' в вопросительных предложениях ставится ДО подлежащего! Возьмите к примеру документацию к C++ стандартной библиотеке и прочтите описание std::string.

    Оговорка: Это не касается случая, когда вы пишите в процедурном стиле. Пример:

    empty(driver_data_request)

    тут сложно понять что имел ввиду автор и поэтому 'is_empty' вполне имеет смысл!
    Ответ написан
  • Как вы программируете?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    У меня примерно так:

    1. Пытаюсь понять суть решаемой проблемы
    2. Пытаюсь вспомнить решал ли я подобную проблему?
    3. Если не удалось вспомнить, пытаюсь придумать решение.
    п.2. и п.3 - не более 15-20 мин на задачи кажующися очевидными. К примеру как отформатировать строку в python или как написать fixture в тесте на py.test
    4. Если не удалось вспомнить лезу в документацию
    5. Если в доке нету, то вбиваю вопрос в гугл
    п.4. и п.5 не более 15 мин.
    6. Если уж и там нет, то извещаю коллег в команде, что у меня затык и мне нужно время. Может мне кто-то придет на помощь или скажет отложить задачу и заняться другой не менее важной задачей
    7. Если же продолжать надо, то задаю вопрос друзьям в skype или еще куда
    8. Если и тогда нет помощи, то иду в Stackoverflow, toster, python.su, etc

    Везде нужно соблюдать баланс. Надо и подумать, надо и самому попытать. И обязательно надо учитывать что ты часть процесса разработки
    Ответ написан
    Комментировать
  • C# или C++ для знающего C#?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Вам всего 15 лет! Чего паритесь то? Детей кормить надо? Жену одевать, содержать надо? На квартиру зарабатывать надо?

    Нет же ! У вас времени дофига! Пробуйте как можно больше. Ищите себя. Если вас к чему-то тянет, то и не стоит себя отговаривать. Вот когда будет 25, тогда и начните фокусироваться в строго очерченном направлении, а до тех пор пробуйте и эксперементируйте!
    Ответ написан
    1 комментарий
  • Что делать если project manager идет на поводу в клиента?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    А что вы хотели? Не разработчики же деньги дают, а клиенты! Хочешь денег значит надо думать о клиенте и хорошо понимать поговорку "Любой каприз за ваши деньги". НО. При этом надо четко доносить до руководителя о сроках реализации с ВНЯТНЫМ пояснением почему! При этом убедиться, что он об этих рисках ооочень хорошо осведомлен и понимает их также как и команда разработчиков
    Ответ написан
    Комментировать
  • Что такое "call back interface"?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Для чего?

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

    У тебя две стратегии:
    1. Каждые 5 мин. подходить в регистратуру "А справка на фамилию Пупкина готова?"
    2. Оставить визитную карточку с телефоном на Пупкина и попросить позвонить, как будет готова справка.

    Какая стратегия более удобная? ;)

    Это принцип "Не звоните нам, мы сами вам позвоним".

    Так и в программировании есть некий код, который вызовут при наступлении некоторых условий(сеть доступна, файл появился, кнопку нажали, программа выключается и др.)

    Код, который вызывают это callback - "Обратный вызов". Некоторые условия - это событие.

    В примере выше callback-ом является Пупкин, а событием является "справка готова".
    Ответ написан
    Комментировать
  • Веб-приложение на С++, реально?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Да. Реально. Но зачем?
    Каждому языку свой спектр задач и C++ в веб-разработку вписывается, но не там, где вы ищите. Посмотрите цикл про highload от mail.ru на youtube и будет понятнее где нужно использовать C++ в мире веб
    Ответ написан
    Комментировать
  • Как понять рекурсию в Python?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Прежде чем изучать рекурсию поймите сначала рекурсию.

    Рекурсия это способ решения задачи путем ее упрощения до такого состояния, когда задачу уже можно взять и решить, а не упрощать.

    Вам уже привели пример со степенью:
    2 ^ 2
    Известно что если упростить до:
    2 ^ 0 , то мы должны получить результат 1
    Вот и упрощайтее задачу возведения в степень до того, чтобы текущий показатель степени стал равным 0.

    def pow(num, n2):
    1 if n2 == 0 else num * pow(num, n2-1)


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

    Также, рекомендую почитать SICP. Эта книга дает ясное понимание между двумя нюансами по поводу рекурсии, о которых не каждый программист знает. Пример задачи : Напишите рекурсивную функцию вычисляющую факториал итеративно. Еще раз обращу внимание на формулировку: функция рекурсивная, а вычислить итеративно! Все это не бред и вполне логично, подробнее в SICP
    Ответ написан
    Комментировать
  • Как изучить язык приближенно к 100%?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    А зачем? Зачем знать язык до идеального состояния? Перфекционизм мучает?

    20% труда выдают 80% результата.

    Остальные 20% результата потребуют 80% труда. Оно вам нужно?

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

    Я к тому, что знайте когда остановиться. Хорошее всегда будет врагом лучшего.
    Ответ написан
    1 комментарий
  • Числа Фибоначчи в JS(рекурсия). Как работает функция?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    сделайте улучшения ф-ции:
    1. Передавайте уровень рекурсии
    2. При выходе уменьшайте уровень
    3. При входе увеличивайте
    4. Также выводите число на данном уровне рекурсии

    Будет наглядно и понятно
    Ответ написан
  • Нужно ли учить программирование на английских ресурсах?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    У Вас порою выбора не будет.

    Примеры из жизни:
    1. К примеру веб-разработчику на Python желающиему изучить как применять Flask без умения читать по-английски не возможно это сделать. Потому что по-русски до 15 статей и то не дают точной и ясной информаци. А вот по-английски есть книга от Miguel Grinberg и в его "Flask. Web-development" настолько ясно и подробно, что больше ничего и не надо!
    2. Другой пример: научиться модульному тестированию. Вроде по-русски разве что ленивый не написал, а вот по факту есть только одна книга для новичков которая формирует ПРАВИЛЬНОЕ понимание это книга Art Of Unit Testing от Roy Osherove. И можно было сказать, что "есть же перевод", но в этом переводе вместо "спринт", "забег", да и само навание перевели как "искусство автономного тестирования". Ну или всем понятный "Framework" перевсти как "Каркас" ну я если честно очень в недоумении....

    Оно вам надо? Если есть время учиться именно по-английски это НАДО делать!
    Ответ написан
    3 комментария
  • Какой список литературы для структурированного изучения программирования?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Если бы имел машину времени, чтоб вбить "Я-в-прошлом" то что надо читать, то это было бы так:
    1. Таненбаум про его Операционные системы
    2. Таненбаум про аппаратное обеспечение
    3. Язык программирования Python по книге Лутза и при этом чтение "Structure And Interpretation Of Computer Program".
    4. Только после этого приступил бы к чтению Керниган, Ричи "Язык С"
    5. Попытался бы влиться в какой-нибудь OpenSource проект

    Далеее уже следуют попытки понять к чему душа лежит, толи вебу, толи linux kernel module, толи еще что.
    В течении этих пункто НЕПРЕРЫВНО улучшать английский. Большинство серьезной литературы о новых технологиях появлятся сначала на английском.
    Ответ написан
    10 комментариев
  • Когда ооп быстрее процедурного?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Все зависит от Вас самих, т.е. от Вашего способа мыслить. Ваших способностей.
    Возможно Вам вообще в Вашу голову будет легче ложиться "функциональщина" чем ООП и это не страшно и не плохо. Просто Ваша особенность.

    Но практика показывает, что для очень многих людей куда привычней и легче думается, если они пишут код ООП-нуто. И действительно. Мы, люди, уже думаем объектами. Для нас не крыло взяло параметры и сам взмахнулось, а просто "Птицы летают"! Мы видим кассиров, птиц, собак, начальников и др. сущности. Мы их делим по роду деятельности: бухгалтеры, программеры, стоматологи, и др. Мы их делим по соц. признаку: пенсионеры, студент и др. Мы уже мыслим типами, объектами, характеристиками и действиями, которые они могут совершать. Обычно, людям, не приходит в голову, что "Птицы ползают и заползают в норы", потому что в нашей голове есть интерфейс "птица" в котором зашито "летает, имеет крылья".
    Оглянитесь. Мы уже думаем объектами, поэтому для большинства программеров проще писать в ООП-стиле
    Ответ написан
    Комментировать
  • Не избыточны ли коментарии?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Есть книга "Совершенный код". Прочитайте ее разок. Попрограммируйте. Прочитайте через год еще раз. Многое встанет на свои места. После второго прочтения МакКонела прочитайте про "Чистый код" и затем читайте про рефакторинг. После этих трех книг Вы будете нас учить как писать код, а не мы Вас!

    Рекомендую поступать так:
    1. Если код нуждается в комментариях, то напишите по-английски, а затем создайте новый метод с использованием этого комментария и перенесите туда этот кусок кода. Возьмем к примеру Ваши "удаляет все записи" на код "clear : function(){" . Как бы вы написали по-английски? Наверное так "clear all records' , а почему бы текущего названия метода clear() не использовать комментарий clearAllRecords() ?
    2. Задавайтесь вопросом: "Если это не открытый метод и я хочу закомментировать его, то может быть мне стоит его переписать?". Открытые методы это интерфейс, которым будут пользоваться другие программеры. Он ОБЯЗАН быть задокументирован. А внутренний код либо покрывается модульным тестом, который поясняет для чего нужен кусок кода и какой должен давать результат и дает ли? Другими словами ваш модульный тест это САМЫЙ лучший вид документации
    3. Пишите всегда комментарий об алгоритмах, стандартах, положениях, хитрых трюках. К примеру "Этот алгоритм взят из книги Кнута том 2 стр. ЧЧЧЧ", тогда ваш коллега в случае сомнений пойдет и почитает как работает этот код в теории и поймет как должен работать и сравнит с тем что есть
    4. Если же модульного теста нет, значит поленились и это вполне возможно тема для рефакторинга. На простой код, просто написать тест! То есть простой код - читать просто и тестировать просто!
    Ответ написан
    4 комментария
  • Стоит ли учить ассемблер для глубокого понимания архитектуры компьютера?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Удивляюсь, что не задали вопроса: А стоит ли вообще программировать?
    Про ассемблер: Конечно стоит!
    У Джоэла Спольски есть статья про то как протекаются абстракции. Все дело в том, что пока якобы на высоком уровне программирования все идет хорошо и Вы думаете, что все ОК и не паритесь. Но как только сталкиваетесь с нетривиальной проблемой, то тут же начинаете плясать с бубном. "привязка к железу" развивает мышление в более строгим. Ведь ни один из программистов не задается вопросом "А стоит ли учить математику?". Вернее задаются, но это маргиналы. Так и с ассемблером. Он развивает программиста таким образом, что после его понимания это уже будет более качественный программист по отношению к прежнему уровню.
    Ответ написан
    1 комментарий
  • Что является хорошим тоном в c++?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Знать оба способа положено!

    Способ "Сначала объявление, а потом где-нибудь определение" позволяет:

    * Создавать так называемые "хидера" или файлы-заголовки, в которых пишутся как раз таки только и только объявления функций.
    * Писать код не задумываясь о том, где именно будет определно тело функции. Главное чтобы оно было в одной и той же единице трансляции или доступна ссылка из другой.

    Начинающим рекомендуют как раз-таки именно такой способ. А спустя время, когда у них развивается чувство кода, прекрассного, т.е. навыка писать достаточно структурированный и ясный код, то они сами того не замечая переходят на второй способ "Только тело без каких-либо предварительных объявлений" там где это возможно.
    Ответ написан
    Комментировать
  • Что делает программиста программистом?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    На мой взгляд программист это прежде всего организатор процессов. Умеющий понять суть любого процесса, не только вычислительного. Есть люди, которые сразу же бросятся выяснять все нюансы будущей программы и начнут программировать. А есть другие, которые досконально проанализируют ситуацию и процесс, который следует оптимизировать, возможно путем программы. Поймут, что да, надо писать программу и только тогда начнут писать. Но не редко они увидят для заказчика более выгодный вариант. На моей практике это выглядело так: "Вы знаете. Ваша операция происходит столько-то раз. Вот если Вы ее разложите на ежедневные операции на 5 мин. Назначите эту операцию действующему специалисту. То небольшая прибавка к зарплате будет выгоднее, быстрее для Вас". Практика показала, что таки-да, ошибок из-за человевечкой невнимательности было мало, были некритичны и да, софт писать не надо было! А если бы человек не сказал подобных слов, то организация заплатила бы за разработку достаточно большие деньги.

    Программист это прежде всего "Здравый смысл" и "Аналитический склад ума".
    Ответ написан
    Комментировать
  • Не могу понять, что такое VOID в С++?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Влад Конвой Все просто. Из курса Computer science. Рекомендую почитать SICP!!!

    В математике На вопрос "Как это выглядит?" отвечает "функция". А на вопрос "Как же это получить?" отвечает "процедура".
    В С-подобных языках именованные вычисления оформляются в виде функций. Но функции в С-подобных языках отвечают на оба вопроса и нет ни одного способа разграничить. Функция в С-подобных всегда должна что-то вернуть! Какой-то результат! Какой-то новый объект. Но что-то новая вернуть по-любому должна!

    Теперь, а как же быть если хочется хоть как-то разграничить на функции и процедуры? Вот для этого есть "костыль" в виде 'void'! Другими словами это способ сказать читающему код: "мы ничего не возвращаем, мы только создаем". Это и есть "как это получить?" в таких функциях только производство чего-то нового. Нарисовать окно, зашифровать диск, послать другу .... А в в функциях возвращающих результат можно уже написать в терминах математики, то есть как что выглядит, но ни как что получается ;)
    Ответ написан
    Комментировать
  • Нужно ли владеть С++ чтобы начать использовать технологию Cuda?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Ответ написан
    Комментировать
  • Прикладное программирование на Python реально?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Кажется Вы непонимаете что такое прикладное программирование. Вы уточните этот термин. Затем и вопрос отпадет ;)

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