Backend Software Developer (C#) · Moscow, Kolomenskaya metro
Contact: +7 (923) 047-13-55 (Telegram preferred) · dkarataev1990@gmail.com · Telegram @Krawler · GitHub · Website
Citizenship: Russia · Experience in software development: 8+ years
Format: remote work · full-time / part-time / project-based · Remote locations: Canada, Minsk, Norway, USA · business travel not considered
Possible employment arrangements: employment contract, self-employment, contract work
Backend developer in C# / .NET (8+ years): microservices, REST API, SOA, GraphQL, engineering and document-management systems. Full SDLC experience, refactoring and moving monoliths toward service architecture, introducing DI, unit tests, Agile practices (DoR/DoD/AC), documentation, and team knowledge bases.
Alongside my main job I build infrastructure for AI agents: a series of open-source MCP servers (Model Context Protocol) that give AI assistants access to the compiler, debugger, build system, and multimodal inputs. Author of agent-first-learn — a practical guide to productive work with AI.
Beyond coding: process setup, requirements work, technical expertise, non-trivial debugging (memory dumps, thread analysis, Reflection).
AI-assisted engineering: 1.5+ years of daily practice (Cursor IDE, MCP servers of my own design).
September 2023 — present · remote
Energy sector · engineering data management systems; by task shape — comparable to Harvester and a corporate EDW web portal (collect, process, and publish data, EPC digital-twin context). The team lead sets priorities and direction; below is my contribution and two cases (Harvester, EDW web portal).
Responsibilities
My contribution — Harvester system (case, STAR)
Situation: a legacy system (in the UI and on IIS the product is named Harvester): modules written in different styles; evolutionary growth; requirements often conflicted and changed mid-flight. We needed stability and performance on large volumes (**1M** objects, relations, and documents with attributes). Switching tasks/modules raised cognitive load; documentation and code comments were missing or stale.
Goal: speed up new features and changes, reduce mental load when picking up others’ work, improve transparency for users, and stability of the prepare → validate → publish path into the corporate web portal.
Actions:
Result:
My contribution — EDW web portal (case, STAR)
Situation: after several Western vendors left the market, support ended for products in the AVEVA line (including NET Portal, AVEVA ISM). To keep working with engineering data we needed a replacement and less dependence on unavailable support and updates.
Goal: per agreed plan — MVP of a corporate web portal: view documents, tags, and relations, search and file handling (incl. preview) so users could continue without the original vendor.
Actions:
Result: users keep running projects, uploading and updating engineering information despite end of support for prior products and external software constraints; integration → portal DB → UI covers EPC-style viewing and update scenarios.
Team outcomes (beyond the cases above; under the team lead)
Reduced vendor lock-in risk and higher modularity; more testing and CI/CD; better performance and resource use on some paths after profiling and targeted fixes.
February 2022 — September 2023 (1 year 8 months)
August 2020 — February 2022 (1 year 7 months)
September 2017 — March 2020 (2 years 7 months)
Domain: electronic document management (EDM) on IBM Document Manager; the solution covered the full cycle: from scanning primary documents (accounting and related) — custom software around TWAIN and production scanners — through SAP integration and control of posting documents in the accounting system.
Responsibilities
Architecture (context)
Stack: .NET Framework 2.0–4.8, MongoDB, Quartz.NET. MongoDB and Quartz powered a document processing pipeline: jobs in collections, background services moved them between collections along the business process.
Case: assigning a document package “curator” (STAR)
Situation: each document package had a responsible curator for processing deadlines; we needed to compute that person from the org chart: for a line employee — their direct manager; if missing — walk up the hierarchy.
Goal: correct curator from the reporting tree without duplicating logic for each new client UI.
Actions:
Result: the team saved time reimplementing rules; curator logic stayed in one place.
Case: custom package viewer and unit tests (STAR)
Situation: the platform UX increasingly limited scenarios; we needed document packages to hold not only files (including PDF) but nested packages — the high-level ECM API made that awkward or impossible.
Goal: move off high-level API and build a custom desktop package viewer on low-level storage API (same layer as above), with acceptable UX for the new composition rules.
Actions:
Result: manageable UI architecture and testability instead of “manual only”; foundation to grow the client without COM/API details in the view layer.
Case: hang, memory dump, and Reflection (STAR)
Situation: scanning used TWAIN.NET (wrapper over TWAIN) from a background thread. The app hung “nowhere”: silent logs, no exceptions, hard to reproduce locally; highest-priority incident; investigation lasted several days.
Goal: find the deadlock and remove it without months of guessing.
Actions: suggested a memory dump of the hung process and thread stack analysis. The dump showed: through a dependency chain the app subscribed to Windows user settings change notifications; per WinAPI docs those must run on the UI thread, but the chain led handling off-thread — on the event everything froze. Found the subscription via .NET Reflection and unsubscribed in a few lines.
Result: hang fixed. Repro was subtle: enable desktop wallpaper slideshow — on image change the OS sends the notification and the bug triggered reliably.
Outcomes (beyond cases)
Refactoring monoliths toward microservices where it made sense; ECM (Java) ↔︎ .NET integration, background pipelines on MongoDB / Quartz and accounting (SAP); desktop package viewer with MVVM, Rx.NET, unit tests via Microsoft Fakes and abstraction over COM storage API; memory-dump debugging, multithreading, WinAPI/UI thread, and Reflection to find hidden subscriptions in third-party code.
Omsk State University named after F. M. Dostoevsky, Omsk.
Applied mathematics and computer science · incomplete higher education
Applied mathematics and physics · incomplete higher education
Computers, complexes, systems and networks · incomplete higher education
Languages and platforms: C# (8+ years), .NET Framework 2.0–4.8, .NET Core, .NET 9, ASP.NET Core, ASP.NET MVC, Blazor WebAssembly, Entity Framework / EF Core, ADO.NET, LINQ, SQL
Architecture and practices: microservices, SOA, REST API, GraphQL (HotChocolate), WCF, SOLID, design patterns, DDD (elements), feature-based architecture, dependency injection, unit / integration testing, Agile (DoR / DoD / AC), BPMN
Data and integrations: SQL Server, MongoDB, Dapper, RepoDb, Linq2db, RabbitMQ, CSV / XML / XSD pipelines, SAP integrations
AI and agent tooling: MCP server development (Model Context Protocol), Roslyn API, Debug Adapter Protocol (DAP), Whisper integration, prompt engineering, structured context management, AI safety guardrails
Debugging and systems: memory dump analysis, thread debugging, .NET Reflection, COM interop, TWAIN, background processing (Quartz.NET), reactive programming (Rx.NET / System.Reactive), MVVM
Tools: Git, GitHub, GitLab, Docker (basics), CI/CD, PowerShell, Cursor IDE, VS Code, Visual Studio
Languages: Russian — native; English — B2 (upper intermediate)
Public GitHub repositories — Model Context Protocol servers for Cursor and compatible environments: they give the AI assistant access to tools (build, debug, C# semantics, etc.), not just file text.
Card schema (Purpose / Motivation / Vision and agent hints): open-projects/README.md.
RoslynMcp — MCP over Roslyn: diagnostics, quick fixes, go-to-definition, find usages, rename, solution structure. Why: so the assistant relies on C# semantics and suggests edits consistent with the compiler.
roslyn_get_diagnostics and code actions, not only
dotnet build; tool positions are 1-based; do not treat text
grep as a substitute for semantics.dotnet-debug-mcp — .NET debugging via DAP (netcoredbg): breakpoints, launch under debugger, stack, variables, stepping, continue/stop. Why: reproducible debugging from chat without manually copying stack traces.
Financial/software/open/cascade-ide/docs/debug-human-agent-parity-v1.md.debug_stop), else PDB is locked; attach vs launch;
do not kill netcoredbg externally. Parameters and limits — repo
README.dotnet-build-test-mcp
— dotnet build / dotnet test with a queue and
structured error/test output. Why: so the AI sees the
essence of build and test failures without log walls.
dotnet build,
dotnet test, path to solution/folder.solution_path;
large raw_output only when explicitly needed; do not
duplicate compiler checks where Roslyn already applies.webcam-mcp — webcam and audio capture, analysis, and transcription (Whisper). Why: multimodal scenarios (voice/video) in the assistant pipeline.
workspace_path; Whisper model from env or parameter; check
README for split capture/analysis if the repo is split.Licenses and details are in each repository’s README.
Medical context (transparent for employers): Group I disability (cerebral palsy; mobility with elbow crutches). Does not affect the ability to perform developer duties — I state this upfront to avoid surprises at offer stage.
Beyond development I can help with: