Recently a candidate sent us a very thoughtful email asking what kind of knowledge we're looking for in a candidate. It set off a discussion at the office, as we wondered what direction we could provide candidates who might not yet have all of the perfect qualifications.
Below is our response to the candidate, giving guidance on what kinds of knowledge we are looking for in candidates.
None of us came into this field knowing everything. In fact, we came from quite varied backgrounds, and we all have areas we're more or less comfortable in. So even though I'll be giving a more comprehensive list below, it's much more important to be excited about learning new things than having any particular expertise, and we'd be interested in talking to any candidate that knows some things in the list below and is capable and energized to tackle more.
So, after some deliberation, here are some basic resources to get you started. For our company, knowing the basics in cryptography (and cryptocurrency), functional programming, and math is probably the most important.
We're building our protocol in OCaml, but you can learn the functional style in any functional programming language: Haskell, Scala, SML, and Elm are all great. You should be familiar with common techniques such as
- modeling with types
- how to read type signatures and recognize monads
- algebraic data types
- programming in an immutable style
- higher order functions
- pattern matching
- recursion and so on.
If you write a medium-sized project you'll learn a lot about these concepts, and probably become a more well-rounded programmer.
Some books we like are
For our purposes, some basic knowledge of abstract algebra is useful. Good things to understand are the definitions of groups and fields. Basic (discrete) probability theory is useful as well.
Programming for SNARKs can also be quite mathematical, and we think the skills provided by a background in mathematics are somewhat transferable to SNARK programming.
Oded Goldreich's Foundations of Cryptography is a classic, and it'll give you a good grounding in fundamental concepts, including
- hash functions
- signature schemes
- zero knowledge proofs.
For cryptocurrencies in particular, another great book is Bitcoin and Cryptocurrency Technologies, which is one of the best resources we've found on cryptocurrencies.
We also are working on some projects that could really use special expertise in a few areas. We of course don't expect anyone to be an expert in all of these areas, but experience in one or two would certainly set a candidate apart.
- Programming Languages: Type systems, compilers, etc.
- Advanced Cryptography: Elliptic curve cryptography, zk-SNARKs/STARKs, formal treatment of cryptocurrency
- Systems Programming
- Distributed Systems
Again, we stress that a candidate need not have background in any of the above specialized areas, but these are the fields that will be useful to us as we build out our protocol, so if this stuff seems interesting to you, and you'd be willing to start learning a chunk of it, we'd be interested in talking. Click here to view job listings and apply.