To Code Is To Dream
Welcome to my page. I am a Masters graduate of Computing at Imperial College London and a Software Engineer at 10x Financial Technologies.
About Me
Computer science is the capacity to produce a simulation of almost anything and allow it to function on its own. I consider it a magical power, and if such a thing existed in medieval England, Mark Zuckerberg would have been burnt at the stake. It's a jumble of complexity, wonder, and discovery all rolled into one, and I've been lucky enough to be a part of several amazing projects since being introduced to it.
I can write programs in a collection of languages and have had experience in developing mobile, web and desktop applications in the past. My primary efforts recently over the last three years has been to explore computational architecture with a particular focus on microservices. I have tried to answer the age-old question of how to construct intricate web of applications (individual units of deployment) that act autonomously from each other and have vastly different roles in a scalable, fault-tolerant and reliable way. On paper this might be achievable but in practise it proves to be much tricker. CAP theorem states that consistency and availability of a distributed system are at odds with each other. This ultimately leaves a lot of interesting questions unanswered. This lack of clarity and the innate room (or lack thereof) for error is what intrigues me. For instance, what is the best way to organise your database(s) within a network, or how can you transmit messages within an internal network in a reliable and high-performing way, or what factors should you consider when deciding the computational roles of your services and understanding the scalability and performance implications that comes with those decisions.
I am a Kafka and Kubernetes advocate. I have written several Kafka-focused libraries that are currently utilised at 10x. Kafka is used by tens of thousands of businesses, including more than a third of the Fortune 500. It's one of the fastest-growing open-source projects, with a massive ecosystem surrounding it. It is at the heart of modern computer architecture. Apache Kafka is a tremendously powerful abstraction for developing distributed systems and apps. It presents a high-performing approach for reliable message-passing between microservices.
My Coding Principles
I am still a programmer at heart. The quintessential foundation of programming is about identifying a problem, classifying it, and then finding an efficient way to solve it. There are four rules I will follow fanatically to my grave.
Readability
Make sure code written is natural to read (i.e. how easy does it convey meaning). I am an idealist when it comes to programming and believe that the code should tell a story (i.e. describes an accurate sub-set of the real world). Anybody can write code and get it to work. A great programmer writes code that is easy to understand for humans.
Correctness is Key
I should guarantee with enough certainty that the code I write achieves what it was set out to do. You would be hard pressed to find any code that can be attributed to me (“allegedly”) that has not been fully tested. There is a beautiful concept in computer science called provability. It is very difficult to verify that a modern program is correct. However, testing can prove to a reliable enough degree that your code works as intended. A disciplined method of programming should give more confidence in the code you are writing. We should run test cases not to look for bugs, but to increase our confidence in a program we are quite sure is correct. Being a good programmer is knowing your code works before your interpreter does.
Keep it Simple
According to the agile approach, a system should be built incrementally over time. A Silicon Valley adage that leaps to mind is that you should strive to fail quickly. It is crucial that we train our brains to focus solely on addressing problems that are important in the short term. We must not lose sight of the forest for the trees. A general rule of thumb is to keep your solution simple enough to rationalise. If you're having trouble communicating your solution to someone else, it's probably because it's too complicated. When dealing with complex problems, you should always start with the basics. Try to break a problem down into smaller chunks. If we can first solve these sub-problems, then we can develop more systematic ways of understanding the solution. If we combine enough of these solutions into one application, we form a complex structure.
Optimisation
Performance is last (Pardon the pun), and it is last for good reason. An overfocus on performance initially can interfere with the natural process of development. You spend stupendous amount of time worrying about things that are unlikely to happen and start theorising before you have implemented any real code. This is akin to walking before you crawl. If you are working on a real-world problem and are having difficulty by the problem's complexity, then dealing with performance will only add to your woes. If you have ever written a complicated SQL query you would understand this feeling o too well. Donald Kruth once famously said “Premature Optimization Is the Root of All Evil”. Performance still remains essential in the real-world. The weighting it should be given should be determined on a case-by-case basis. A service that needs to be called multiple times per second needs to be more performant than a service that runs a periodic batch job at the end of each day. Low-level code optimisation in particular has now becomes a trivial pursuit. For instance, having a static string dictionary (i.e. avoiding the use of the heap/stack) that you reference during the application’s runtime (instead of initialising new strings) will yield negligible performance gains. Compilers have become much better at making optimisations in real time and modern hardware is a lot more performant. The majority of significant performance gains can now be made at the network level. How the application is configured within the servlet container and how many network hops are required to process a message are some of the performance-related questions that need to be addressed when it comes to optimisation.
my Work Experience
Software Engineer At 10x Financial Technologies
2019 - 2022
Part of a team that developed 10x's self-contained FPS solution for processing faster payments (UK primary payment scheme) from the ground up.
Currently utilised by Tier 1 banks in the UK as a solution
The largest contributor to the code base amongst a team of skilled engineers
Utilises the latest technologies: Kafka, Kubernetes, Postgres SQL and Redis to process payments efficiently and reliably
Part of a team that developed 10x's limit management solution. A solution that performs per-transaction limit checks and maintains individual limits for customers.
A scalable and high-performance solution that does not rely on application locks.
Lead the creation of difficult stories and gave direction to other squad members assigned to those tasks.
Set the standard for application architecture, software engineering methods, and understanding of the tech stack.
Was involved in discussions with other squads, lead engineers, and product team members during the planning and execution of delivery.
Author of several important libraries within 10x.
Authored the message outbox library. It introduces a reliable publishing mechanism which incorporates the database as a means of maintaining what messages need to be sent to Kafka.
Authored the idempotency library. It provides an out-of-the-box solution for enforcing idempotency on REST endpoints that modify state.
Authored the dead letter processer library. A library that provides the ability to replay messages that end up on the dead letter queue. It exposes a set of utility endpoints within the enclosing service for accessing and altering DLT topics.
Internship at a start-up called Brainswap to develop a social mobile application
June – September (2018)
A revolutionary app which aims to connect students from all around the world into a single platform.
Excelled in a professional work environment, exchanging ideas and applying them to create tangible results.
Worked within a team of developers, openly expressing my ideas.
Made the head-lead on development only after a month due to the heavy reliance the CEO had put on me to produce results.
Taught Java, HTML and CSS to beginner programmers
January - May (2018)
Teaching allowed me to develop and explain complex ideas in a logical way to beginners, by converting the difficult jargon into understandable concepts.
Work Experience at Islington North Library
Jul – Sep (2015)
Was as able to use and deploy my knowledge of movies and books to aid staff on how they could improve their services, e.g. suggested movie nights and reading group sessions.
Learnt how to effectively work in a team and how to effectively communicate with customers.
My Skill Wall
Programming Languages
- Java
- Android
- Javascript
- Typescript
- React
- Ruby
- C++
- SQL
Tools/Services
- Kubernetes
- Kafka
- Postgres SQL
- Docker
- AWS Amplify
- GraphQL
- Google Firebase
- Aws Lambda
- Redis
Frameworks/Libraries
- Spring Boot
- NextJs
- TailwindCss
- Bootstrap
- Junit 5
- Cucumber
- JavaFx
- JQuery
- Illustrator
- Photoshop
Programming Methodologies
- Functional Programming
- Object Orientated Programming
- Parallel Programming
- Database Design
- Information Security and THREAT Modeling
- Distributed Computation
- Microservice Architecture
- API Design
explore my
Personal Projects
I have spent four years in academia and three years at 10x as a software engineer. During that time, I have been lucky enough to be involved in many cutting-edge projects. Projects that range across multiple environments and languages, and touch on multiple areas within computer science. Here are some of the highlights:
Imperial Masters Project: Automata Simulator Desktop Tool
The tool is a packaged executable written in Java. I worked with Dr Anandha Gopalan to develop a set of simulation tools for the primary devices present in computational theory. The application itself tries to utilise well-established pedagogy principles and accurately incorporate and represent the main ideas covered in the automata literature. The tool attempts to simplify abstract devices to mechanisms that the student can effectively reason with. It does this by using accurate representations (i.e. through animation) and expressive functionality. The primary goal of this project was to introduce an automata simulation tool that could be integrated and used in conjunction with the curriculum at universities. You can read the paper here
Solidity Rock Papper Scissors DApp (smart contract) and Webpage
Developed a decentralised version of rock-paper scissors (dapp) that combines a smart contract with a frontend user interface. It's a two-player Ethereum blockchain-based online multiplayer game. Once a player has consented to a move, it is hidden via public-private key encryption and published onto the blockchain. Since the blockchain is open to the public, it is vital to prevent a player from seeing the other player's move before they have made their own. Before revealing each player's move and establishing the game's conclusion, the game waits for both players to make a move. Each player is given a certain amount of time to make a move.
For a Professional Client, Partnered with Eight Highly Skilled Engineers to Develop a Web Application.
Worked in a group of 8 developers alongside a client to produce a full-scale web application. We created a university module selection tool for students to help them figure out which modules to take based on their chosen career path. We used Ruby on Rails to build out the application. We met with the client weekly to build a set of functional requirements. We split into two groups, one focusing on the front end and the other on the backend. I was the backend team's lead developer, in charge of implementing the core features. At the end of the eight weeks, we presented our application to a group of industry experts at Red Badger and were awarded with the best application award.
Imperial Paper: Proposed A Modern-Day Side-Channel Attack To Identify the User's Identity
Proposed a new attack on the Android operating system and wrote a paper presenting it at Imperial. The attack takes the form of an Android app that, once installed, can detect when a user makes a post on their Instagram client and, using that information, crawl the Instagram platform for that post to infer the user's identity. This is an attack that exploits several side-channels on the Android OS that are open to third-party apps, i.e. external storage. It is an attack with a relatively high success rate. The backend NodeJs application makes use of computer vision to analyse the user-posted image and infer possible tags (i.e. words that describe the image). It then crawls the Instagram site for posts associated with the tags and carries out perceptual image hash comparisons to identify a match. I presented the attack and the findings of the evaluation, which examined the attack’s success rate at Imperial. You can read the paper here
Released Two Android Applications on to the Playstore
Designed, developed and published two android applications: “Quick Fire Maths” and “Balloon Up”. Balloon Up utilises animation along with 2D platform design to construct a game that tests the player’s reflexes. It introduces the basic quarks of any game e.g a life bar and increasing difficulty. QuickFire Maths is a cartoony-style maths game where you must correctly answer numerical questions within a time window and the questions become increasingly difficult with time. You cannot make any mistakes or your score resets to zero. Both games are currently live on the android market.
Tech Lead of a group of 6 in making a Economics Tool for visualising Macro Trends
Project manager of a group of 6 in making a Java graphical interface application for visualising historical data and making trend predictions. An application which drew data from an open CNN API and displayed it in an interactive way back to the user. The user could zoom into the chart, make their own annotations and spawn new charts on the fly. It was a very intricate application that required the handling and streamlining of data in meaningful ways to the user. The process taught me how to mobilise people with various skillsets to ensure a successful outcome and manage conflicts by resolving differences that arose within the group. I was able to coordinate all phases of the project whilst managing and motivating the team.