Senior Software Engineer

Elsevier Science Ltd
United Kingdom
11 Jan 2018
09 Feb 2018
Contract Type
Full Time
Elsevier Research Products is seeking an experienced software developer to join a new cross-functional Agile and DevOps implementation team, tasked with decomposing and evolving a legacy monolithic system. You will be responsible for analyzing, designing, developing, deploying and operating web applications in a cloud-hosted distributed system. Collaborating closely with business stakeholders, iterating quickly and optimizing for fast feedback, you will provide input into architectural decisions, support and mentor other developers and continually seek to improve our delivery process. Strong research and communication skills and a proactive, self-directed approach to work will be critical in this role. Experience and Education: · 5+ years of Software Engineering experience · Bachelor Degree Engineering/Computer Science or equivalent experience required Key Responsibilities: · Deliver new system functionality, specified in Agile user stories, through the design and implementation of technical solutions across a Java-based, cloud-hosted microservices architecture – implementing both application code & supporting infrastructure · Use test-driven development, pair programming and other XP practices to achieve high quality technical solutions · Identify the appropriate types of tests to write against systems, determining what granularity of the system to target and how comprehensive the coverage should be · Coherently model the business domain using object-oriented programming and domain driven design · Minimize code-level technical debt through continual refactoring · Collaborate with business analysts, product owners, architects and other members of a cross-functional product team to define and analyse functional and technical requirements · Perform an equal share of the functional and non-functional testing of the team’s work and ensure features get all the way to Production · Develop, maintain and monitor alerting, metrics and logging systems for the services you run in Production · Take responsibility for the Production operation of the systems you develop. Respond to Production alerts, diagnose Production issues and maintain an awareness of normal operational characteristics. Inject your insights about Production back into the development phase · Commit code to source control multiple times a day using trunk-based development and continuous integration, fully embracing the continuous delivery principle that the master branch is always in a releasable state · Take shared responsibility for maintaining and evolving the continuous integration server, infrastructure definitions and automated deployment pipelines · Maintain and evolve the local development environment and toolchain to ensure the efficient development of microservices · Support the technical lead in designing, evaluating and guiding the architecture of an evolving distributed system, following wider Elsevier guidelines and principles · Champion awareness of and design solutions for cross-functional concerns such as security and performance · Seek continuous improvement of the software delivery process by drawing on Agile and Lean principles and through active participation in team retrospectives · Actively engage in your professional and personal development through one-on-one feedback and mentorship, stay appraised of software delivery trends and introduce new ideas into the team · Mentor other team members in good software development practices and software delivery methodology Technical Skills: · Languages: Java (advanced), Javascript (advanced), SQL (proficient), HTML (proficient) · Experience developing web applications with a working knowledge of the HTTP protocol · Experience developing on and administering Linux systems · Experience deploying to / orchestrating infrastructure on AWS. Experience with Terraform / infrastructure as code is desirable. · Experience with Java web frameworks such as Dropwizard (Jersey) or Spring Boot and embedded web servers such as Jetty · Experience with at least one database technology, preferably including NoSQL · Experience with Docker and associated development and scheduling technologies would be desirable · Experience with gradle or Maven, with Git and a continuous integration or delivery server such as Jenkins, TeamCity or GoCD · Experience with alerting, monitoring and logging tools such as StatsD, Logstash, Kibana, NewRelic, Datadog, Graphite, Nagios · Experience with IDEA IntelliJ and proficiency in using its automated refactoring tools · Experience working in a team that uses pair programming, continuous integration and other XP practices · Experience of continuous delivery, automated deployments, immutable servers and zero-downtime deployments · Experience of acceptance-test driven development, behavior-driven development, unit testing and mocking libraries · Awareness of Mike Cohn’s test pyramid model for test distribution would be desirable · Appreciation of architecture concepts such as the principles, benefits and costs of microservices, the ethos of REST-based APIs, scalability and anti-fragility, weakly-coupled service integration, CAP theorem, high cohesion and low coupling · Strong object-oriented programming skills, with a clear understanding of the SOLID principles · Strong ability to refactor code to coherent models. Experience of domain driven design code practices would be desirable. · Experience of performance testing web applications and securing them against common security holes (OWASP Top 10) · Advanced knowledge of Agile methodologies and preferably an understanding of Lean software development principles · Experience of participating in and facilitating retrospectives would be desirable · Experience of a DevOps culture or systems engineering in the context of web-based applications would be preferable