Software Engineer · WSO2
Οἴδαμεν δὲ ὅτι τοῖς ἀγαπῶσιν τὸν θεὸν πάντα συνεργεῖ εἰς ἀγαθόν, τοῖς κατὰ πρόθεσιν κλητοῖς οὖσιν.
We know that in everything God works for good with those who love him, who are called according to his purpose.
— Romans 8:28
Ad Maiorem Dei Gloriam — For the greater glory of God
I'm a software engineer at WSO2, where I build integration software that connects systems reliably at scale. I enjoy turning complex problems into clean, well-designed solutions and working with teams that value clear communication. Outside of day-to-day engineering, I explore machine learning, deep learning, and AI agents. Right now I'm learning more about the Model Context Protocol (MCP), agentic systems, and modern deep learning architectures. I believe good work is a form of service — and I try to do mine with care and gratitude.
| Area | Focus |
|---|---|
| Software Engineering | Designing maintainable, well-tested systems that are easy to reason about. |
| Machine Learning | Building models that learn useful patterns from real-world data. |
| Deep Learning | Neural network architectures for vision, language, and representation learning. |
| AI Agents & MCP | Connecting language models to tools and data through open protocols. |
| Software Architecture & Integration | APIs, microservices, and the glue that makes systems work together. |
| Research & Development | Prototyping new ideas and turning experiments into production-ready software. |
A small feed-forward neural network in PyTorch
import torch
import torch.nn as nn
class MLP(nn.Module):
"""A simple multi-layer perceptron for classification."""
def __init__(self, in_features: int, hidden: int, num_classes: int):
super().__init__()
self.net = nn.Sequential(
nn.Linear(in_features, hidden),
nn.ReLU(),
nn.Dropout(0.2), # light regularization
nn.Linear(hidden, num_classes),
)
def forward(self, x: torch.Tensor) -> torch.Tensor:
return self.net(x) # raw logits; CrossEntropyLoss applies softmax
model = MLP(in_features=784, hidden=128, num_classes=10)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
loss_fn = nn.CrossEntropyLoss()
x, y = torch.randn(32, 784), torch.randint(0, 10, (32,)) # one dummy batch
loss = loss_fn(model(x), y)
optimizer.zero_grad(); loss.backward(); optimizer.step()
print(f"loss: {loss.item():.4f}")A scikit-learn classification pipeline
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
# Load a small, well-known dataset
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)
# Scaling + model in one pipeline keeps preprocessing consistent
clf = make_pipeline(
StandardScaler(),
RandomForestClassifier(n_estimators=100, random_state=42),
)
clf.fit(X_train, y_train)
# Evaluate on held-out data
print(classification_report(y_test, clf.predict(X_test)))"The only way to do great work is to love what you do." — Steve Jobs
"Your most unhappy customers are your greatest source of learning." — Bill Gates
"Someone's sitting in the shade today because someone planted a tree a long time ago." — Warren Buffett
"The best way to predict the future is to invent it." — Alan Kay



