5+ years of professional software development experience
Strong grasp of software engineering fundamentals like data structures and algorithms
Experience with functional programming languages or substantial projects
Proficient in debugging and problem-solving
Commitment to high code quality and maintainability
Effective communication and collaboration skills
Eagerness to learn new technologies and adapt to various environments
Responsibilities
Design, implement, test, and maintain software using functional programming principles
Develop clear and maintainable solutions for complex engineering challenges
Apply strong typing and domain modeling to enhance software reliability
Collaborate with engineers and clients to understand and fulfill requirements
Contribute to system design and architecture, balancing correctness and performance
Write automated tests to validate system behavior
Review code and share technical knowledge to uphold engineering standards
Benefits
Opportunity to work on diverse and challenging client projects
Collaborative environment with engineers and client teams
Focus on continuous improvement in engineering practices
Exposure to cutting-edge technologies like blockchain and distributed systems
Support for professional growth and learning new skills
Full Job Description
About the Role
We're looking for a Functional Software Engineer to join our engineering team and contribute to challenging client projects across our technical domains. You'll design, develop, and maintain software using functional programming principles, working with engineers and client teams to turn complex requirements into robust, maintainable solutions. Depending on the project, your work may involve backend systems, domain modelling, distributed systems, financial infrastructure, blockchain applications, or developer tooling.
This role is suited to an engineer who enjoys reasoning about complex systems, values strong types and clear abstractions, and sees software development as more than simply making code work. Knowledge in every technology is not necessary. We value strong engineering fundamentals, a willingness to learn, and the ability to apply sound technical judgment to unfamiliar problems.
Key Responsibilities
Design, implement, test, and maintain reliable software using functional programming principles.
Develop clear, composable, and maintainable solutions to complex engineering problems.
Apply strong typing, domain modelling, and abstraction to improve software correctness and reliability.
Collaborate with engineers, technical leads, and client stakeholders to understand requirements and deliver effective solutions.
Contribute to the design and architecture of systems, making thoughtful trade-offs between correctness, simplicity, performance, and maintainability.
Write automated tests and use appropriate techniques to validate system behaviour.
Review code, share technical knowledge, and contribute to engineering standards.
Investigate and resolve complex technical issues across existing systems.
Communicate technical decisions clearly and explain trade-offs to both technical and non-technical stakeholders.
Adapt to different client environments, codebases, and technical challenges.
Contribute to continuous improvement across our engineering practices, tools, and delivery processes.
Key Requirements
5+ years of professional experience developing and delivering production software.
Strong understanding of software engineering fundamentals, including data structures, algorithms, testing, and software design.
Experience with functional programming, either professionally or through substantial projects.
Ability to reason about complex problems and translate requirements into well-structured software.
Strong debugging and problem-solving skills.
Commitment to code quality, correctness, and maintainability.
Ability to communicate effectively and collaborate with other engineers.
Willingness to learn new technologies and work across different technical environments.
Preferred Requirements:
Experience with Haskell, Scala, OCaml, F#, Clojure, or another functional programming language.
Familiarity with type systems, algebraic data types, pattern matching, and immutable data structures.
Experience with strongly typed domain modelling and functional design patterns.
Exposure to distributed systems, concurrent programming, or backend infrastructure.
Experience in blockchain, financial infrastructure, capital markets, or other domains where correctness and reliability are particularly important.
Familiarity with property-based testing and other techniques for validating complex software behaviour.
Experience with Nix or reproducible development environments.
Experience working in an engineering consultancy or collaborating directly with client teams.