scala, clojure, java, f#
You consider yourself a software crafter. You care about and are proud of the code you write. You care about doing meaningful work and providing value to your clients or employer via well-crafted code. For you, writing code is not just a job but also a passion. **Test-Driven Development** is second nature to you and that's how you write code. You don't use "lack of time" as an excuse to do a mediocre job, and fully understand the long-term costs and benefits of hacking a project together. You prefer to work in small increments, trying things out and iterating rapidly, tightening the feedback loop as much as possible. You are a **team player**. You understand that software lives on long after it is first delivered and that many different people will contribute to it over its lifetime. You enjoy working with other people, including other coders but also designers, business analysts, testers and anyone else working on the same project. You enjoy frequent collaboration, including pair-programming. As a **passionate developer**, you spend a considerable amount of time outside working hours investing in your craft, learning new technologies and practising different techniques and approaches. You create for creation's sake, building pet projects or contributing to open-source development. You don't do this because a client or employer asks you to; you do it because you want to. As part of the learning process, you consider it important to **share** what you know with others. This might take the form of a blog, some code on GitHub, attendance at community events or something totally different. You also consider it your responsibility to help your fellow colleagues; perhaps this manifests itself as formal knowledge-sharing sessions in the workplace, but just as likely, it's simply coaching as and when it's necessary. You understand that languages and frameworks are just tools. You choose the best tools for the job **without being religious about it**. The majority of books and articles you read are the ones that make you a better developer and not a specialist in a specific framework. At the same time, you are extremely proficient with at least one or two programming languages and the tools around them, including testing frameworks, wiring and dependency injection mechanisms, user interface libraries and development environments. You understand and embrace **Agile** processes, and are able to help other people to understand and adopt them. You are able to work closely with clients and product owners and help them to refine requirements and plan the work to be done. You are proud to be a developer and want to remain a developer. You believe in emergent and collaborative architecture and design; you use your knowledge of **SOLID principles**, the Four Elements of Simple Design, and **Domain-Driven Design** to design applications that reflect the business domain.