Engineering platform
Soga platform
R&D leadership for a long-lived internal platform: hexagonal Laravel services, Python workers, and an architecture pack that new work has to follow.
Head of Software Research and Development · Soga SAS · June 2019 — Present
- Backend split
- Laravel domain · Python pipelines
- Integration
- Events and gateway — not shared Eloquent
- Delivery
- Docker · Kubernetes · Helm
Overview
Soga is where the engineering platform is decided: how Laravel services are sliced, how Python workers run, what a stream payload looks like, and what is not allowed to cross a boundary.
The role combines team coordination, budget, architecture, and research. ProCrédito v2 is the most visible product on that platform; the platform is the set of rules that keep the next product from becoming a second monolith.
Standards live in an architecture pack — layers and slices, Laravel service layout, Python worker template, Redis Streams conventions, contracts, Docker and Kubernetes — not as folklore in service READMEs.
Problem
A private platform absorbs every process exception unless someone owns the model. Feature delivery without an architecture function produces shared databases, HTTP on workers, and magic strings for field names.
Research that does not change a decision is reading. The problem is to evaluate technology against a running system — and to fund only the bets that change how the next service is born.
Cross-service shortcuts (shared Eloquent, a FastAPI monolith for the obligation pipeline, business rules in the gateway) look fast and make every later change a coordination tax.
Constraints
Domain code does not import Laravel, Eloquent, Redis, or HTTP. Use cases depend on ports; Eloquent stays in infrastructure adapters.
New Laravel work goes to Application/Slices/{FeatureName}. New Python obligation logic goes to domain/ and processors/, wired in consumers/runtime.py. Internal workers do not grow an HTTP API.
Expected authorization denials are PolicyDecision + ErrorCode. Framework exceptions are for unexpected failure, not for “this user cannot do that.”
Architecture
The platform is a layered hexagon: Infrastructure → Application → Domain. Products are born as Laravel services with JSON:API slices, or as Python stream consumers, not as a new framework per team.
Redis Streams are the async backbone. Payloads and stream names are contracts. Idempotency is designed in; at-least-once delivery is assumed.
Delivery is containerized: Docker images, Nginx, Kubernetes, Helm for migrate jobs. The cluster is the runtime. It does not define bounded contexts.
Architecture
Soga — platform rules, product services
Architecture pack
Slices · contracts · streams
ProCrédito v2
Internal products
Laravel services
Python workers
Redis Streams
API Gateway
Kubernetes
Docker · Helm · Nginx
Architecture pack as the constraint. Laravel services and Python workers are born from the same rules. Events and the gateway are the only legal crossings.
Key decisions
Personal experience
Write the architecture pack; do not copy it into every README
When the rule changes, the pack changes. Service READMEs that restate hexagonal architecture drift and then contradict each other.
Personal experience
Laravel for the domain, Python for the hot pipeline
A FastAPI or Django monolith for obligation processing would duplicate the domain. Workers transform; they do not become the system of record.
Personal experience
Treat R&D as a leadership function
Budget, staffing, and the next architectural bet sit with people who still own delivery. A separate architecture office that does not ship will be ignored.
Trade-offs
Gained
New services start from the same slices, ports, and stream contracts. Research has a path into production, and a path to “no.”
Sacrificed
Less isolation between research and the next operational request. Every architectural rule is a constraint the team must keep paying.
Personal experience
Technologies
Results
The platform rules are the ones ProCrédito v2 and later services follow: hexagonal Laravel, Python stream workers, contracts, Kubernetes.
The obligation pipeline is the proof that the split works: high-volume processing without moving the aggregate into a worker framework.
Headcount, budget figures, and module counts are not published here.
Lessons learned
Architecture in an internal platform is mostly the art of saying no with a reason. Shared Eloquent and HTTP-on-workers are the shortcuts that come back as incidents.
Technology research is only useful if it changes a decision. Reading about a tool is not R&D; changing the system’s shape, or choosing not to, is.
A pack that is not used in the next slice is documentation. A pack that rejects a pull request is architecture.