Khan Bank systems
Enterprise banking delivery, and the team capability behind it
April 2019–November 2023
The engagement
Four years as a Senior Software Engineer at Chinggis Systems, on systems delivered into Khan Bank's environment. Teams of roughly eight to fourteen engineers, with the larger internet-banking work involving a group of about thirty.
The products were collaborative. I did not build the bank platform alone or own every backend. My contribution came through early technical learning, implementation, architecture and convention decisions, detailed code review, mentoring, and cross-team delivery.
Publicly named work
| Project | Public period | What it covered |
|---|---|---|
| Corporate Portal | Apr 2019–Mar 2021 | Corporate-banking web delivery, and the first Angular capability chapter |
| Internet Bank | May 2020–Mar 2021 | Customer-facing web and application work in a much larger team |
| Information Management | Nov 2019–Feb 2021 | Internal information workflows |
| Verification | Mar 2021–May 2021 | A focused verification-system delivery |
| Online Branch | May 2021–Aug 2021 | Remote and online branch workflow |
Additional queue, call-centre, operational, and internal systems existed alongside these.
Angular was a structural problem, not a syntax one
One of the first major projects needed Angular. The team did not yet know Angular, and the deadline did not pause while we learned it.
Components, services, routing, and state come from documentation. The team's real questions did not:
- where should feature boundaries sit in a long-lived banking application;
- how should shared state and API failure behave across screens;
- which conventions let several engineers work without producing several local architectures;
- how does a reviewer distinguish a preference from a rule the product depends on;
- how does a new engineer find a working example instead of rediscovering every decision?
I learned Angular against the corporate-banking product itself, then turned the result into examples, conventions, pair support, and review feedback. The test was whether teammates could deliver without waiting for me to implement their feature.
React repeated the pattern at a larger scale
When later internet-banking work moved toward React, I studied it with two colleagues before helping the wider team adopt it.
At roughly thirty people the framework choice was the easy part. The migration was the shared decisions: component boundaries, state, error behaviour, naming, API contracts, and review. A locally elegant pattern nobody else could apply was not a useful standard.
The working method was to teach with code already connected to the real product, then keep the convention visible in review until it became ordinary team behaviour.
Cloud changed the same question again
Later work moved into AWS and serverless patterns. Again the challenge was not collecting service names — it was deciding where asynchronous work, failure, observability, deployment, and cost belonged in a bank's operational model.
The same loop applied: understand enough of the unfamiliar system to make a real delivery decision, document the boundary, help the team use it, and let production expose what the model missed.
Review was the delivery mechanism
I was known for pull requests carrying twenty or more comments. Many caught real problems: duplicated logic, unclear state, missing failure behaviour, inconsistent conventions, or code that would be expensive to support across several banking products.
The outcome I cared about showed up months later, when younger engineers stopped receiving the same class of comment — they had internalised the model behind the feedback.
The delivery of a standard matters as much as the standard. Explain the governing reason first, separate blocking risk from preference, point to an example, and leave the engineer a path to own the correction.
Enterprise constraints changed what "better" meant
Banking software lives inside audit requirements, release windows, operations teams, security review, legacy contracts, and the cost of breaking a live customer workflow.
The cleanest rewrite is often the wrong decision there. An incremental design with explicit recovery and a migration path can be stronger than an isolated architecture that assumes the organisation will reorganise around it. Deployment, support, and team understanding belong inside the architecture frame, not after it.
Result
Customer-facing and internal banking systems reached production, and Angular, React, and later cloud approaches moved from unfamiliar territory into repeatable team capability.
The strongest outcome was not that I personally knew more frameworks. It was that unfamiliar technology stopped being a delivery blocker for the team.