Тех собес на middle-senior C# Разработчик в ****

Доступно с премиум-подпиской

Оформите премиум-подписку, чтобы получить доступ к:

  • Фильтрации по компаниям
  • Названиям компаний в интервью
  • Видеозаписям собеседований в категории C# Разработчик

Посмотреть видео в категории

(2024-09-26)

Задачка с ревью

Оценить по сложности каждый метод и предложить как улучшить.

C# LINQ-выражения
create table table1 (Id int, ParentId int null)
var table = new [] { new { Id = 1, ParentId = null }, new { Id = 2, ParentId = 1 }, new { Id = 3, ParentId = 2 }, new { Id = 4, ParentId = 2 } );
var answer = table.where(x=> x.ParentId != null && !table.Any(y => y.ParentId == x.Id));
table.ToDictionary(c => c.ParentId)
C# IEnumerable и yield return
class Program
{
    static void Main()
    {
        IEnumerable<int> ienum = null;
        try
        {
            ienum = OddSequence(50, 110);
            Console.WriteLine("Retrieved enumerator...");
        }
        catch(Exception ex)
        {
            Console.WriteLine("Catch 1");
            Console.WriteLine(ex);
        }

        try
        {
            foreach (var i in ienum)
            {
                Console.Write($"{i} ");
            }
        }
        catch(Exception ex)
        {
            Console.WriteLine("Catch 2");
            Console.WriteLine(ex);
        }
        Console.ReadLine();
    }

    public static IEnumerable<int> OddSequence(int start, int end)
    {
        if (start < 0 || start > 99)
            throw new ArgumentOutOfRangeException("start must be between 0 and 99.");
        if (end > 100)
            throw new ArgumentOutOfRangeException("end must be less than or equal to 100.");
        if (start > end)
            throw new ArgumentException("start must be less than end.");

        for (int i = start; i <= end; i++)
        {
            if (i % 2 == 1)
                yield return i;
        }
    }
}
C# MyStringBuilder

Написан аналог класса StringBuilder, поддерживающий операции:

  • Дописать строку в конец текущей строки
  • Дописать строку в начало текущей строки
  • Вернуть текущую строку
  • Вернуть i-й символ текущей строки (без проверки, что аргумент i лежит в нужных пределах)
  • Вернуть количество различных символов, встречающихся в текущей строке

Нужно оценить, насколько быстро реализованы эти операции, и предложить возможные пути оптимизации без использования класса StringBuilder.

public class MyStringBuilder
{
    private readonly List<char> chars;

    public MyStringBuilder()
    {
        chars = new List<char>();
    }

    public void AddToEnd(string s)
    {
        chars.AddRange(s);
    }

    public void AddToStart(string s)
    {
        chars.InsertRange(0, s);
    }

    public override string ToString()
    {
        var result = "";
        foreach (var nextChar in chars)
        {
            result += nextChar;
        }
        return result;
    }

    public char this [int index] => chars[index];

    public int GetDifferentCharactersCount()
    {
        var differentCharacters = new List<char>();
        foreach (var c in chars)
        {
            if (differentCharacters.IndexOf(c) == -1)
            {
                differentCharacters.Add(c);
            }
        }
        return differentCharacters.Count();
    }
}

Задачка на System Design

Делаем распределённую систему генерации отчётов. Юзер нажимает кнопку, по которой должен получить отчёт в виде файла, данные для генерации файла берутся из разных микросервисов.

Вопросы во время проектирования:

  • Что будет если какой-то сервис отъебнёт?
  • Как юзер узнает на какой стадии отчёт?
  • Как избавиться от дубликатов, если юзер будет спамить кнопку?
  • Как понять, что юзер забил хуй и ему отчёт не нужен?

К задаче прилагалась схема системы, включающая Frontend, API Gateway, ReportService, RMQ, DataService1, DataService2, FileGeneratorService, а также хранилища статусов и отчетов, и Standalone Monitoring с PostgreSQL.

Вложения

43_1112_photo.jpg

43_1113_photo.jpg

43_1115_photo.jpg

43_1116_photo.jpg