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

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

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

    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, тогда и начните фокусироваться в строго очерченном направлении, а до тех пор пробуйте и эксперементируйте!
    Ответ написан
  • Что делать если 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% труда. Оно вам нужно?

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

    Я к тому, что знайте когда остановиться. Хорошее всегда будет врагом лучшего.
    Ответ написан
  • Числа Фибоначчи в 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" перевсти как "Каркас" ну я если честно очень в недоумении....

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

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

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

    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. Если же модульного теста нет, значит поленились и это вполне возможно тема для рефакторинга. На простой код, просто написать тест! То есть простой код - читать просто и тестировать просто!
    Ответ написан
  • Стоит ли учить ассемблер для глубокого понимания архитектуры компьютера?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Удивляюсь, что не задали вопроса: А стоит ли вообще программировать?
    Про ассемблер: Конечно стоит!
    У Джоэла Спольски есть статья про то как протекаются абстракции. Все дело в том, что пока якобы на высоком уровне программирования все идет хорошо и Вы думаете, что все ОК и не паритесь. Но как только сталкиваетесь с нетривиальной проблемой, то тут же начинаете плясать с бубном. "привязка к железу" развивает мышление в более строгим. Ведь ни один из программистов не задается вопросом "А стоит ли учить математику?". Вернее задаются, но это маргиналы. Так и с ассемблером. Он развивает программиста таким образом, что после его понимания это уже будет более качественный программист по отношению к прежнему уровню.
    Ответ написан
  • Что является хорошим тоном в 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'! Другими словами это способ сказать читающему код: "мы ничего не возвращаем, мы только создаем". Это и есть "как это получить?" в таких функциях только производство чего-то нового. Нарисовать окно, зашифровать диск, послать другу .... А в в функциях возвращающих результат можно уже написать в терминах математики, то есть как что выглядит, но ни как что получается ;)
    Ответ написан