Вы находитесь на странице: 1из 4

Free storage: 78.28 GB (23.12.2019).

https://books.google.com.ua/books?id=wDrBDwAAQBAJ&pg=PA177&lpg=PA177&dq=c%23+
%D0%B4%D0%B5%D1%84%D0%BE%D0%BB%D1%82%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD
%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80+%D0%B4%D0%BB%D1%8F+
%D1%81%D1%82%D1%80%D1%83%D0%BA
%D1%82%D1%83%D1%80%D1%8B&source=bl&ots=oeRloCeeBd&sig=ACfU3U1QT1Fpf7nIX3GoE8bEzxfIq
WDYZQ&hl=en&sa=X&ved=2ahUKEwiDzIjtzJXnAhUmiYsKHQQLD8YQ6AEwCXoECAoQAQ#v=onepage&q&f=
false

1. Общие вопросы:

- Ваш опыт, сколько лет в разработке. Расскажите о своих проектах, ваша роль,
объемы, кол-во.
Трудности с которыми сталкивались
- Самые интересные задачи, какой стек технологий использовали при этом.
5-10 мин

2. .NET:
- ссылочные и значимые типы;
value types: byte, sbyte, short, ushort, int, uint, long, ulong, float, double,
decimal, bool, char, enum
references types: object, string, class, interface, delegate

Структуры (struct)
- когда вызываются статические конструкторы классов?
Потому самый близкий к истине ответ: "Один раз при первом создании экземпляра
класса или при первом обращении к статическим членам класса".
Хотя в данном случае наверное переформулировка "… при первом упоминании" будет
более уместна.
Дело в том, что бывают статические конструкторы явные (когда конструктор задан
явно) и неявные (присваивание значений статическим свойствам). В том случае, когда
нет явно заданного статического конструктора, класс помечается флагом
beforefieldinit, что говорит CLR о том,
что инициализация статического поля произойдет до первого обращения к этому полю,
причем она может произойти задолго до этого обращения.
- сборщик мусора, фазы сборки мусора, поколения. Особенности сборки для Finalize
объектов;
- многопоточность, примитивы синхронизации;
- изменяемые значимые типы (using, Dispose), как свойство, как элемент списка (но
не масива), как readonly поле;
- асинхронность, Execution context, Logical context;
- boxing, unboxing. int x = 5; object o = x; long y = (long)o;
- Finalize, Disposing. Dispose pattern;
- class vs struct;
- Sealed class;
- private protected, protected internal (https://docs.microsoft.com/en-
us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers);
- using vs Disposable;
- what is a Deadlock;
- difference between lock and mutex;
- String vs StringBuilder. Интернирование строк. Сортировка строки на месте;
- зачем нужен finnaly? Всегда ли он произойдет?
- вы когда нибудь использовали Reflection? Для чего?
- исключения, best pratcises;
- Task vs Thread, ValueTask;
- новое в .NET Core (Span)
- multiplay lock
- ref & out parameters?
- constants and read-only
- overriding and method overloading
- "Throw" statement preserves original error stack whereas "throw ex"
- static constructor. Limitations? Without parameters and only for init static
fields
- implement 2 interfaces with same name
- return more than 1 value from function (out parameters, tuples)

An argument passed as ref must be initialized before passing to the method whereas
out parameter needs not to be initialized before passing to a method.
Thread represents an actual OS-level thread, with its own stack and kernel
resources.
Thread allows the highest degree of control; you can Abort() or Suspend() or
Resume() a thread,
you can observe its state, and you can set thread-level properties like the stack
size, apartment state, or culture.
ThreadPool is a wrapper around a pool of threads maintained by the CLR.
The Task class from the Task Parallel Library offers the best of both worlds. Like
the ThreadPool, a task does not create its own OS thread. Instead,
tasks are executed by a TaskScheduler; the default scheduler simply runs on the
ThreadPool. Unlike the ThreadPool, Task also allows you to find out when it
finishes,
and (via the generic Task) to return a result.
30-40 мин

3. DataBase:
- Базы данных. Нормализация, как относитесь. Какие механизмы обновления структуры
базы использовали.
https://www.infoworld.com/article/2924201/best-practices-to-improve-entity-
framework-performance.html
- best practises for entity framewrok, проблемы использования (lazy loading,
Mapping, AsNoTracking, bulk insert, Query Compilation, Query Execution,
Disable Change tracking, Pre-generated Views, auto-compiled queries linq ->
expression tree -> compile to SQL (добавлены в EF6, включены по умолчанию))
- индексы, для чего нужны, + и -
- типы индексов: покрывающие (covering), фильтрируемый (partial);
- составной индекс, порядок следования в WHERE;
- что такое транзакция? Свойства транзакции (ACID), Вложенные транзакции? Уровни
изоляции транзакций + и -
- как в EF реализованы транзакционность
- кластеризованный и некластеризованный индексы
- одновременный апдейт двух записей в бд
- table scan, index scan, index seek (key lookup)
- оптимизация БД: оптимизация запросов (избегать join, select конкретных столбцов,
пейджинг, индексы), оптимизация сервера
- execution query plan, index scan, index seek, full scan
- sharding БД
- primary key: int vs guid (NEWSEQUENTIALID vs NEWID)
- ХП, бизнес логика в ХП
- repostitory and UnitOfWork
20-30 мин

4. ООП, патерны:
- SOLID
- паттерны
- инкапсуляция, полиформизм, наследование
- в чем суть полиформизма
- что нравится не нравится в ООП
10-15 мин

5. Алгоритмы:
- сколько времени займет получение элемента из связного списка? Из бинарного дерева
поиска? Или из хэш-таблицы? А если в этих структурах будет миллион записей?
Из хэш-таблицы можно получить элемент за константное время, из связного списка — за
линейное, из бинарного дерева — за логарифмическое.
Количество элементов никак не влияет на асимптотику структуры данных в случае, если
все идет как надо: в хэш-таблице нет или очень мало коллизий,
а бинарное дерево сбалансировано. Иначе с ростом количества элементов
производительность будет уменьшаться.
5-10 мин

6. Архитектура:
- если бы вы взяли новый проект с нуля, как бы вы его разрабатывали. Best
practises, onion architecture;
- масштабировние бекенда;
- какие патерны, подходы использовали бы;
- тормозит сайт. Опишите по шагам, что будете делать;

7. Security:
- SQL injection;
- CSRF (Сross Site Request Forgery), как защищать и что защищать;
- XSS (Cross-Site Scripting), как защитить?
- нажал кнопку Enter, что происходит более детально
- безопасность API (Use encryption and signatures, Use tokens, Use quotas and
throttling, check input);
- HTTP header security
- отключить лишние HTTP запросы, настроить CORS,
https://www.thesslstore.com/blog/http-security-headers/
Content Security Policy (CSP)
HTTP Strict Transport Security (HSTS)
X-XSS-Protection
X-Frame-Options
X-Content-Type-Options X-Content-Type-Options: nosniff
- токен vs cookiess (secury, readonly);
- firewall;
- CDN;
10-20 мин

8. Performance:
- тюнинг БД и запросов;
- тюнинг алгоритмов и структур с данными;
- кеши;
- сжатие, CDN;

9. Опыт
1) Рефакторинг — как будете делать, какие бест практики выработали
2) Тестирование — какие подходы применяли, какой по вашему должен быть процент
покрытия тестами, фреймворки
3) Какие паттерны применяли.
4) Что такое хороший код, что плохой. Бест практики. Что видели самое страшное, что
самое лучшее.
5) Оптимизация по скорости. Что то тормозит — что будете делать. Кеши
6) Что такое high load. Производительность — какие методы повышения
производительности можете назвать

10. Стек.
1. .NET Core WEB API, Linux, контейнеры.
2. SignalR (websockets).
3. MS SQL Server 2017, Node JS.
4. RabbitMQ, Redis, Docker, Nginx.
5. В процессе дробления монолита на микросервисы
6. Scrum ban.

http://sergeyteplyakov.blogspot.com/2011/07/blog-post.html

потоки:
https://habr.com/ru/company/dodopizzaio/blog/435666/
- Поток требуется запустить с нестандартным приоритетом (все потоки пула
выполняются с обычным приоритетом). Хотя изменить приоритет можно, но делать это не
рекомендуется, кроме того, изменение приоритета не сохраняется между операциями с
пулом потоков.
- Чтобы приложение не закрылось до завершения потоком задания, требуется, чтобы
поток исполнялся в фоновом режиме. Эта тема подробно рассмотрена в разделе «Фоновые
и активные потоки» далее в этой главе. Потоки из пула всегда являются фоновыми, и
существует риск, что они не успеют выполнить задание из-за того, что CLR решит
завершить процесс.
- Задания, связанные с вычислениями, обычно выполняются крайне долго; для подобных
заданий я не стал бы отдавать решение о необходимости создания нового потока на
откуп логике пула потоков.
- Возможно возникнет необходимость преждевременно завершить исполняющийся поток
методом Abort класса Thread, который был подробно рассмотрен в главе 22.