Posts by Ivan Rossouw

@Ivan Rossouw

Ivan Rossouw

Senior Software Engineer building modular .NET SaaS across web, mobile, and clou...
Cape Town, South Africa ivanrossouw.iqtechsolutions.co.za Joined September 2026
2.3k Points • 61 Badges • 5 Connections • 5 Followers • 5 Following

Posts by Ivan Rossouw

Ivan Rossouw • • in Articles • 4 min read
Timing tests look wonderfully objective. Start a stopwatch, call the component, stop the watch, and compare the result with a budget. The number is precise. The experiment may not be. That distinction matters in continuous integration, where many t...
Ivan Rossouw • • in Articles • 4 min read
Software often uses broad time windows for good reasons. A dashboard may need recent history, work that is actionable now, and the next scheduled item. Fetching all of that in one bounded query can be efficient and easy to reason about. The trouble ...
Ivan Rossouw • • in Articles • 4 min read
Idempotency is usually introduced with a simple promise: run the operation again and it will not create a duplicate. That promise is useful, but it can become dangerous when we apply it to an entire workflow instead of the specific durable step it p...
Ivan Rossouw • • in Articles • 4 min read
Navigation bugs are often judged by their final state. Did the correct page appear? Did the authorization check pass? Did the URL settle on the expected address? Those questions matter, but they can miss the frame that users actually notice. In a r...
Ivan Rossouw • • in Articles • 4 min read
A release verifier has two jobs that are easy to blur together. It must understand the representation produced by the build chain, and it must enforce the policy that decides whether an artifact may leave that chain. Those jobs need different attitu...
Ivan Rossouw • • in Articles • 4 min read
An empty form field looks unimportant. In ordinary application logic, treating an empty value like a missing value is often reasonable. In signature verification, that assumption can reject a legitimate message—or, in a different protocol, verify a r...
Ivan Rossouw • • in Articles • 4 min read
Many concurrency bugs begin with code that looks entirely reasonable: 1. Read the current row. 2. Check that the operation is still allowed. 3. Create something durable elsewhere. 4. Save the original row as complete. Run once, the workflow is corr...
Ivan Rossouw • • in Articles • 4 min read
Flaky lifecycle tests often produce a tempting diagnosis: the cleanup code must be unreliable. Sometimes that is true. Sometimes the test is asking a framework harness to prove a narrower ownership contract, and the harness is free to finish work on ...
Ivan Rossouw • • in Articles • 4 min read
Moving a user from one application host to another often looks harmless. A button opens a browser, the user continues, and the original client waits for them to return. Architecturally, that is not merely navigation. It is a trust-boundary decision....
Ivan Rossouw • • in Articles • 4 min read
Soft deletion often begins innocently: add an IsDeleted flag, remember to exclude retained rows, and move on. That works until the application grows into several modules, several DbContext types, and configuration spread across assemblies. At that p...
Ivan Rossouw • • in Articles • 4 min read
Background work is usually introduced to make a system more reliable. We persist an intent, let the request finish, and deliver the external side effect later. That protects the user-facing path from temporary provider failures and gives us room for ...
Ivan Rossouw • • in Articles • 4 min read
Two projects expose similar helpers. One has no project references. It is missing from the solution most developers build every day. The obvious reaction is understandable: share the code, add the reference, and bring the lonely project back into the...
Ivan Rossouw • • in Articles • 4 min read
Some of the most misleading tests are not flaky, slow, or obviously incomplete. They are fast, deterministic, and green. They also pass for the wrong reason. That is especially dangerous in fault-tolerant code. A test may claim that a failed depend...
Ivan Rossouw • • in Articles • 4 min read
Modern applications are often assembled from modules. That is good for ownership, deployment boundaries, and keeping large codebases understandable. It also creates a subtle user-experience failure mode: a page can compile, carry a valid route, pass ...
Ivan Rossouw • • in Articles • 4 min read
Delegated access often starts with an innocent mismatch. A person knows an email address. The authorization system knows an account identifier. The obvious bridge is a search box: enter the address, find the account, then grant access. That bridge ...
Ivan Rossouw • • in Articles • 3 min read
Modular architecture creates an uncomfortable class of failure: the application can understand its complete model while design-time tooling sees only a legitimate subset. That difference is easy to misread as drift. It is also dangerous to dismiss. ...
post-cover-30687
Ivan Rossouw • • in Articles • 4 min read
Modern client components are long-lived, reactive, and full of asynchronous work. That combination creates a subtle class of defect: a response can be factually correct for the request that produced it, yet wrong for the screen that exists when it ar...
Ivan Rossouw • • in Articles • 4 min read
A concurrency column can exist in the database and still be wrong. The name may match. The migration may have run. Inserts may appear healthy. Yet optimistic concurrency can still be weaker than the application assumes because the runtime model, the...
Ivan Rossouw • • in Articles • 4 min read
A response can be correct for one caller and still leave the application in a worse state for everyone who follows. This is an easy trap in ASP.NET Core when a result filter, formatter, or middleware needs to change a few fields before a response le...
Ivan Rossouw • • in Articles • 4 min read
Authentication answers one important question: who made this request? It does not answer a second question that often hides inside an ordinary-looking query parameter: may this caller name the record represented by this identifier? That gap is easy ...
post-cover-29225
chevron_left