Рубрика «опрос» - 10

5 недопустимых ошибок при сборе отзывов о продукте - 1

В начале работы над проектом или на этапе радикальных изменений в продукте трудно удержаться от искушения опросить всех своих пользователей, чтобы определиться с положением дел. Обычно это ошибка. Вообще-то есть целый ряд общих ошибок, которые происходят снова и снова. Мы в Alconost перевели для вас пять подсказок по сбору отзывов о продукте.
Читать полностью »

Здравствуйте!

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

Я много читаю с самого детства. Закончив институт и начав строить карьеру, я понял, что непрерывное развитие — залог успеха. И книги — самый доступный инструмент развития.

С этого момента моя домашняя библиотека стала пополняться профессиональной литературой. Однако, тут я столкнулся с некоторыми проблемами.

Во-первых, я не мог купить все книги, которые хотел. У меня просто не хватало денег.
Во-вторых, купленные книги часто оказывались абсолютно бесполезными, несмотря на отличные отзывы.
Наконец, некоторые книги теряли актуальность и мне хотелось бы куда-нибудь их деть, но не выкидывать…

image

Читать полностью »

Предлагаю не совсем стандартный опрос по платформе .Net. Спойлерами раскрыты ответы на вопросы, но все-таки прошу сначала самим ответить на опросник, после чего идти и смотреть ответы :)

Когда вызывается статический метод, то JIT...

JIT компилирует вызов прокси-метода, который делает безусловный переход на компилятор необходимого и тот заменяет адрес перехода в прокси на новое тело метода. Это делается по нескольким причинам.

Изначально, когда методы компилируются, все точки вызова других методов указывают не на скомпилированное тело, а на кусочек ассемблерного кода фиксированной длинны и содержащий одни и те же инструкции для любого метода. По сути меняется только адрес, на который происходит jmp. До того как метод скомпилирован, адрес указывает на компилятор этого метода (потому при первом вызове происходит компиляция). Далее, когда компиляция закончена, аргумент команды jmp меняется с адреса компилятора на адрес целевого, уже скомпилированного метода. Плюсы очевидны: т.к. прокси — содержит одно и те же инструкции, то группу методов можно рассматривать как таблицу с двумя полями: Код и Адрес Перехода с одной стороны и не менять адреса у инструкции вызова метода — с другой.

Что происходит при кастинге к классу

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

Приведение к типу — синтаксический сахар языка, который не имеет почти ничего общего на уровне строения объекта в памяти. Поскольку объект состоит из полей + SyncBlockIndex + MethodsTablePtr, где MethodsTablePtr отвечает за указатель на описание типа объекта, то при помещении указателя на объект в переменную другого типа с объектом не происходит ничего (тип объекта же не меняется). Вызывается доп проверка при приведении вверх, т.к. на этапе компиляции заранее не известно, что вверху, какие типы. Необходимо проверить. Проверка осуществляется через уход в таблицу методов и проход по цепочке указателей ParentClassMethodsTable, пока не встретится либо Object (тогда кастинг не возможен) либо пока не встретим указатель, равный тому, который мы ищем. Как осуществляется вызов виртуального метода, хорошо описано тут: Wiki

Что происходит при приведении типа к интерфейсу

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

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

В чем разница между Implicit и Explicit интерфейсами?

И те и другие выделены в словарь интерфейсов, однако Explicit методы не находятся в таблице виртуальных методов класса, только в словаре интерфейсов

И действительно, поскольку методы implicit интерфейсов являются частью иерархии наследования класса и могут быть вызваны отдельно от приведения к типу интерфейса, они должны присутствовать в таблице виртуальных методов класса. Однако, есть еще и Explicit реализации, когда методы отделены от класса. Такие методы не присутствуют в таблице виртуальных методов класса. Однако для обоих случаев мы имеем право кастить к интерфейсу и работать через него. А это значит что в карте интерфейсов обоих типов они присутствовать будут, причем вместе со всеми базовыми типами — интерфейсами.

Потоки в .Net

являются платформенными потоками MS Windows, потому цена переключения между потоками равна общей цене по Windows

Тут, в общем, без комментариев. GC не может встревать в общий процесс обслуживания многопоточного кода. Приложения .Net работают как обычные приложения Windows

Generic типы

JIT создает никак не связанные между собой классы под каждый параметр типа

Поскольку JIT не может ничего знать о логике приложения, он не может строить доводов что

 IEnumerable<object> a = new List<int>() 

должно как-то работать. потому имплементация под каждый конкретный набор generic аргументов компилируется в отдельный код.

Как происходит вызов экземплярных методов - this

this — первый параметр метода, который для целей синтаксического сахара не показывается

Если представить себе вызов метода, то на уровне процессора он будет происходить по нотации fastcall: первые два параметра метода уйдут в регистры, а остальные — в стек. если ничего дополнительно не передавать, то получится что внутри метода мы понятия не будем иметь, для какого объекта нас вызвали. чтобы исправить ситуацию, мы первым параметром всегда передаем this, а в языке программирования (например, C#) его просто не показываем, введя локальную переменную this, которая присутствует всегда, вне зависимости от желания программиста. Это и есть на самом деле первый параметр метода.

Value и Reference типы. В чем разница?

Value типы лежат и в стеке и в куче, а Reference — только в куче. Отличаются тем, что value — передаются по значению, а Reference — по ссылке

Огромный процент разработчиков на собеседованиях говорят первый вариант ответа. Причем на самом деле он их не устраивает, поскольку если Value тип является полем класса, в рабочем стеке его значение находиться ну никак не может, поскольку при выходе из метода, который его создал фрейм, его содержащий перестал бы быть валидным с правильными данными. Поле класса (даже если это Value тип) всегда находится в куче. Разница между Value и Ref типами в том, что при копировании у Ref типов копируется ссылка, а у Value — полностью вся структура. Второе отличие: у незабокшенных Value типов отсутствует поле MethodsTable и SyncBlockIndex.

Где лежат статические переменные?

Лежат во внутренних массивах и обращение идет по ссылке на массив + индексу

Это просто сакральное знание. Просто сделано так и все.

Как вызываются виртуальные методы?

JIT создает для типа таблицу виртуальных методов, через которую идет вызов с заранее подсчитанным индексом
При наследовании и наличии виртуальных методов получается так: от класса к классу они могут только прибавляться в наличии, не пропадая в никуда. причем в каждом последующем классе гарантированно будут присутствовать все методы всех базовых. С одним отличием — при наследовании метод можно переопределить. Потому при построении таблицы методов для какого-то класса, методы базового класса должны находиться по тем же индексам, что и в таблице базового класса. Если метод не переопределен, то и адрес тела метода в таблице будет совпадать с адресом этого метода в таблице базового класса. Если метод переопределен, то значение будет другим. После всех методов базовых классов будут находиться методы ткущего класса. А сам вызов будет происходить так:

  • Загрузить адрес таблицы вирт методов.
  • Сместиться до начала списка методов
  • взять адрес метода по индексу (например) 1
  • Вызвать его.

Причем поскольку при наследовании на этом месте всегда будет находиться метод ToString(), то даже переопределяя его в наследниках, будет вызван именно метод ToString(), только не базового класса, а наследника.

Читать полностью »

Всем привет,

Недавно мне попалась на глаза статья о том, что в IT компаниях готовятся к небольшим кадровым проблемам из-за того, что заработная плата в РФ немного упала в долларовом эквиваленте. Несмотря на это, доход компаний, работающих на экспорт, не сильно менялся (опять-таки, если смотреть в долларах), а таких около 80% компаний. То есть, цена на одного разработчика в РФ стала меньше раза в два, чем была где-то год назад. Логично, что в этом случае вероятен рост спроса на разработку в РФ (а также в соседних странах), что может повлиять на кадровый рынок IT.
Очень похожая ситуация с валютой случилась год назад на Украине, где в итоге заработная плата в IT сфере выросла, по сравнению со среднерыночной по стране. Опять-таки, логично предположить, что заработная плата в IT отрасли в РФ сделает похожий финт (то есть вырастет на величину, пропорциональную роста доллара по отношению к рублю).

Следовательно, у меня вопрос к читателям: а как обстоят дела в Ваших компаниях? Собираются ли они индексировать зарплаты? Увеличилась ли текучка кадров? Стали ли набирать они новых сотрудников?

Читать полностью »

Привет [%username%]. Прошу не судить меня строго за опрос, который так не любит сообщество. Но намедни у меня был довольно интересный разговор с человеком, который успешно продает свои услуги онлайн (его деятельность напрямую связана с разработкой сайтов).
Читать полностью »

Developer Economics — это самое большое в мире исследование, посвященное мировым трендам в области экономики приложений и мобильной разработки. Основано оно на опросе разработчиков и компаний, который проводит британская компания VisionMobile раз в полгода. В прошлом, например, приняло участие более 10,000 человек из всех стран мира.

Восьмой опрос Developer Economics от VisionMobile

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

Как убедить посетителей вашего сайта купить продукт, используя конкурентов? Часть 2
В первой части этого материала мы рассказали об одном из способов борьбы с конкурентами с помощью их самих. Во второй части мы хотим рассказать об еще одном способе, как склонить сомневающихся посетителей вашего сайта к покупке, проследив, о чем думают клиенты ваших конкурентов. (О том, как убедить потенциального клиента совершить покупку незаметно для него самого — в статье "Новый подход к определению свободы и независимости выбора покупателя").

Способ№2. Опрос клиентов ваших конкурентов в «диких условиях»

Наверняка вы уже слышали о «шпионаже» за конкурентами с помощью социальных медиа, но еще не пробовали это?

Читать полностью »

Как убедить посетителей вашего сайта купить продукт, используя конкурентов? Часть 1

На этот раз хотим поделиться первой частью материала Томми Уолкера о том, как бороться с предубеждениями потенциальных клиентов и склонить сомневающихся посетителей вашего сайта к покупке, используя информацию о конкурентах (какие еще бывают предубеждения клиентов, и как с ними бороться, можно узнать из статьи «Повышение конверсии сайта: Как использовать когнитивные убеждения»).

Читать полностью »

Мифы о программистах: равнодушие к стриптизёршам, пельмени и управляемый хаос

Не секрет, что любая профессия обрастает неким количеством мифов, которые кажутся убедительными для тех, кто далёк от темы. В IT одной из самых мифологизированных стала профессия программиста. Мы собрали все известные нам мифы о программистах и проверили их на правдивость. Для этого провели опрос среди технических специалистов нашей компании (78% из которых программисты) о том, какого стиля жизни они придерживаются.
Читать полностью »

Хорошей субботы!

Тема различных конкурсов в интернете всплывает достаточно часто (раз, два, три и т.п.), не говоря уже о РОИ и различных скандалах.
Так как сейчас проводится очередной конкурс на всероссийском уровне — 2014.oprf.ru/ (Формирование состава Общественной палаты Российской Федерации), я решил узнать отношение крупнейшего айти сообщества к таким проектам.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js