This month, I've completed my three year apprenticeship at endjin - a big landmark in a journey that started with enrolling on a computing MSc several years ago.
Endjin's apprenticeship is a custom programme which aims to bridge the gap between new entrant and competent developer.
The scheme was set up in recognition of the value of mentoring and practical experience, and out of a desire to pass this on – you can read more about its origins in Howard's blog on apprenticeships.
During the past three years, I've received huge amounts of mentoring and support from colleagues, and gained experience in a wide range of technologies and sectors.
In this blog I'm going to try to summarize the last year of the scheme and do a retrospective of the whole experience, following on from write ups of year 2 and year 1, for any others who might come this way.
The defining characteristics of the whole experience have been:
- How supportive the team at endjin is and how enjoyable it is as a workplace
- Pairing to solve problems
- A focus on doing things the right way without compromise on quality
- A focus on learning, automation and always trying to find better ways of doing things
- Being enabled by the latest tools and equipment
- The company's serious commitment to work life balance - accurate estimation and going home on time are encouraged
- The varied, complex and interesting projects we work on.
Endjin supports a varied range of companies from start-ups to large enterprises, in industries across financial services, recruitment, telecoms, media, property, public sector, arts and charity. We tend to take on strategy work, process reviews, and relatively short proof of concept projects, technical spikes, project rescues and cloud re-engineering projects, rather than providing long term outsourced development, which results in intense bursts of challenging and interesting work.
Working here requires continual learning for everyone from apprentice to founder as cloud technologies and the goals driving their selection change - for example the last few years have brought an increase in data related projects, at a time when this part of Azure is developing rapidly.
The three years of the apprenticeship scheme have built on each other in terms of technical stack and responsibilities, but have also been very different.
Year 1 focused on tools, practices such as behavior driven development, the use of Git and Git branching strategies, the software development lifecycle and the use of a build server, basic problem solving, C# knowledge and software development patterns such as DI, and core Azure services.
I was encouraged to spend a large portion of my time carrying out research and wrote several blogs on topics like Git and DI during this period, and also worked on internal and client projects with support from senior colleagues. Blogging proved to be a really good way of developing subject knowledge and has provided a reference that I can go back to.
In Year 2, I took more responsibility for delivering client web and mobile cloud platform projects and lead the scoping and delivery of a web project spanning several months. The platform consisted of mobile apps, a web application, an API and background compute in the form of Cloud Services, which helped expand my knowledge of enterprise and cloud architecture and patterns, such as the use of queue processing and retry mechanisms to make the platform resilient.
During this year I was able to begin providing client developer support. A separate strand of work in year 2 was automation, the development of endjin's content platform and testing libraries, and a series of data services projects.
The content platform evolved from an application I wrote to automate the production of endjin's Azure Weekly newsletter, using using Azure Machine Learning, Stanford NLP libraries, and endjin's text scoring library.
In year 2 I worked with a colleague to re-factor this application into a generic news aggregation and publication platform using Data Factory and Custom Activities implemented using TPL Dataflow. It's been really satisfying seeing the project grow.
The data theme continued during the 3rd year of the apprenticeship, where I worked on a number of client projects, which have largely focused on Azure data services and advanced analytics. Projects included the design and development of data pipelines for custom processing, anomaly detection and reporting, and ML experiments to prove or disprove hypotheses relating to business requirements.
As part of this work I participated in the Azure Advisers forums to raise issues and establish best practices. Towards the end of the year I lead a short project to create a proof of concept data processing pipeline to streamline the validation and publication of Hymans Robertson's modeller results, using Data Factory, PowerBI Embedded, Azure SQL with Elastic Query, and Web Apps.
Alongside these data services projects I worked on an Azure website redevelopment and an Azure migration covering Storage, Web Apps, Application Insights and Azure Active Directory B2B/B2C authentication.
A further theme of year 3 has been DevOps and Application Lifecycle Management, in particular the creation of VSTS (Visual Studio Team Services) projects containing build and release configurations mapping to the GitFlow branching strategy and a set of environments.
This allows the automated deployment of the full set of resources required for a platform from VSTS using ARM (Azure Resource Manager) templates and additional PowerShell scripts, parameterized to allow separate resource groups and services per environment. VSTS is also used to automate NuGet package generation and publication, functionality that we extend through custom tasks.
It's a very powerful concept once you get used to working this way, and removes a lot of the worry from the development lifecycle.
Around client projects I continued to develop endjin's intellectual property; helping to build a data processing pipeline solution, and contributing to Vellum (endjin's Azure CMS), and endjin's content platform.
I also participated in the creation of a new product development process, a data-driven process review platform that enables us to gain insights into client development teams, and an Conversation as a Service Hackathon hosted by endjin for Watchfinder & Microsoft.
Alongside technical skills, the apprenticeship has taught a set of approaches for working methodically, approaching problems effectively, and communicating well with team members.
For example, always working against a tracked work item, carrying out tests in the wider sense of 'test' to validate assumptions and in the narrow sense to focus your code, keeping notes for colleagues and your future self, and providing regular updates on what you're working on.
Because endjin is a small company, working as an apprentice here gives you a view of all aspects of the business from the first contact with new clients, through to strategy and process work, project scoping and technical.
Apprentices are encouraged to understand the financial aspects of the business and to support strategic work with clients, participate in client meetings, and deal with client communication. This holistic overview helps put development work in context and keep it focused.
The technology industry seemed very complex and full of experts when I first starting thinking of joining it. During the first few months of the apprenticeship it was overwhelming to try to come to terms with the jargon of development and DevOps, when I was still trying to get to grips with C#.
It is a complex industry but it's become clear that what's important is putting in time and effort to try to understand problems and technological developments, no matter what your starting point is. Julia Evans (@b0rk)'s wonderful zines make this point much better than I can. More than ever, I'm fascinated and concerned by the technology industry as a whole.
Efforts to remove barriers and help a wide range of people into the industry to widen its perspective, and to build respectful and friendly workplaces like endjin, seem really important.
My original goal 3 years ago was 'to be a developer'. Exposure to the industry has shown how many different roles and types of work can come under that title. I've really enjoyed several of these aspects, particularly carrying out technical spikes, working on building up our content platform, blogging, training and supporting others, working in a team on sprints, and just fixing bugs.
Confidence has been an issue on and off throughout the apprenticeship, but when I look back I realise how much I've learned. Skipping to the present, this morning I've just helped to diagnose an issue that was blocking a production release, where tests were failing for a particular environment, by creating a script to replicate the issue from the command line and output more detailed information.
I'm feeling confident about my abilities and incredibly grateful to endjin for giving me the skills and experience to solve this type of problem. I would thoroughly recommend this apprenticeship scheme for other new entrants to the industry.