Software Engineer
About the Role
Our client is looking for a Software Engineer to join their team. You'll be responsible for writing high-quality code for our products. You'll tackle the exciting challenge of working with cutting-edge research and technology, always with a focus on market needs. You'll collaborate professionally and effectively with software architects, product managers, project managers, formal methods specialists, and QA test engineers.
Responsibilities
Requirements
- Follow agile software development practices.
- Work independently on software development tasks with minimal supervision.
- Review specifications produced by architects and formal methods specialists.
- Contribute to the design of algorithms.
- Write clean, straightforward, efficient code that satisfies agreed acceptance criteria and specifications.
- Commit often and submit small pull requests frequently.
- Cover your code with unit, property, and integration tests when applicable.
- Review the pull requests of your teammates.
- Fix bugs in your own code and in legacy code.
- Be available for emergency fixing of severity 1 issues on deployed products.
- Integrate software components and third-party libraries.
- Verify and deploy programs and systems.
- Troubleshoot, debug, and upgrade existing software.
- Write documentation for the code.
- Write technical user manuals.
- Be knowledgeable of distributed and concurrent computation.
- Be knowledgeable of the basics of cryptography.
- Work with teams across multiple time zones.
Requirements
Key Competencies
Required Experience & Skills
Specialist Skills (Dependent on Role - Indicate Your Area of Expertise)
- Write idiomatic code that satisfies acceptance criteria.
- Write efficient and sufficient tests (unit tests, property tests).
- Document code and APIs concisely and unambiguously.
- Break down tasks into sub-tasks that are completable in a short amount of time.
- Pragmatically adhere to software engineering principles (modularity, incremental development, no premature optimization, etc.).
Required Experience & Skills
- A minimum of 2-3 years of development experience (professional or otherwise) in one of the following languages: Haskell, Javascript, Scala, or Rust.
- Experience working with Git and Git workflow.
- Practical experience with Agile software development methods.
- Knowledge of functional and object-oriented programming paradigms.
Specialist Skills (Dependent on Role - Indicate Your Area of Expertise)
Candidates should possess strong skills in at least one of the following specializations:
Haskell Engineer
- Good understanding of Quickcheck/Hedgehog and property testing.
- Good understanding of concurrent programming / concurrency.
- Good understanding of call-by-need, memoization, and lazy evaluation.
- Experience in similar languages: PureScript, Elm, Idris, Agda, Ocaml, F#.
- Experience with / contributions to GHC (Glasgow Haskell Compiler).
- Familiarity with frameworks/libraries such as conduit, cryptonite, distributed-process, lens, optparse-applicative, persistent, pipes, servant, stm, template-haskell.
- Proficiency with advanced FP techniques such as: Advanced functional data structures, Dependent types, Extensible effects, Generic programming, Streaming, Type-level programming.
- Advanced knowledge of the Scala type system.
- Familiarity with frameworks such as ScalaPB, Scalacheck, Scalatest, Scala.js, doobie, testcontainers, sttp.
- Familiarity with Poldercast, Dandelion, Kademlia, Tor, P2P architectures and topologies.
- Practical experience with issues related to latency and throughput.
- Knowledge of distributed computing libraries.
- Familiarity with cryptographic signing systems, Zero Knowledge protocols, Multi Party Computation (MPC).
- Familiarity with blockchain cryptography and constructions.
- Practical experience with implementation of cryptographic primitives.
- Security sensibility related to cryptographic implementation.
- Good theoretical cryptography and mathematical knowledge.
- Ability to read cryptographic papers.
- Experience writing or working with (cross) compilers, object formats, linkers, build systems, IDEs and IDE integrations.
- Experience and enthusiasm for working with large legacy code bases, across multiple languages.
- Ability to reach agreements with upstream developers.
- Expertise in programming language design & implementations including frontends, type systems, program transformations, optimisations, and code generation.
- Familiarity with Human-Computer Interface (HCI) aspects of programming languages and DSLs, programmer tools and analysis (a bonus).
- Proficiency in HTML/CSS/LESS/SASS.
- Experience with CSS Preprocessing.
- Proficiency in Javascript/ES6.
- Experience with NPM, Webpack, Gulp.
- Familiarity with React/Angular/Backbone/Vue/Knockout/MobX/REST API.
- Experience with Electron, Cordova, React Storybook.
- Knowledge of GraphQL.
- Understanding of MVC/MVVM patterns.
- Strong grasp of UX/Design Principles.
- Basic knowledge of image and design editing tools (e.g., Sketch, Photoshop, Zeplin etc).
- Experience with NodeJS and Docker.
- Solid System Programming experience (ideally in Rust, but also relevant experience in C/C++ will be considered).
- Experience with distributed system and network development.
- Proficiency in software development methods such as agile programming and test-driven development.
- HTTP API understanding as well as accessibility and security compliance.
- Experience in developing cryptography protocols (a bonus).
- Blockchain experience (a bonus).
- A track record of delivering software projects from start to finish.
- Proficiency in software development best practices, including design, implementation, testing, and debugging.
- Familiarity with continuous integration and deployment pipelines.
- Experience with cloud platforms such as AWS or GCP.
- Web3 experience (a bonus).
Be the first to know aboutnew jobs every week
Get 8 new jobs with salaries, once per week! Sign up here so you don't miss a single newsletter.