As part of my Year in Industry, I have joined the Software Engineering team at GE Aviation in Cheltenham, UK. Since the duration of the placement was 12 months, it gave me a good opportunity to learn about how the company operates and to collaborate with senior Software Engineers on multiple software products. I had to overcome challenges, suggest and implement solutions, as well as to come up with development and test strategies. In addition to improving skills I have already had, I had also developed new ones, as I had not been in such work environment before. I now feel more confident as a developer, and also more prepared for my future career path.
GE Aviation is a world-leading provider of commercial and military jet and turboprop engines, as well as avionics, electrical power and mechanical systems. It is part of General Electric and employs about 40,000 people worldwide. It is headquartered in Ohio, USA and the current CEO is David Joyce.
The site in Cheltenham manufactures integrated modular avionics, flight management and crew information systems, as well as power generation and distribution products. I was positioned in the Remote Interface Units (RIU) tools team, which is responsible for developing the software needed for the RIUs. This includes several products which are part of a toolset used for creating custom configurations, analysing them and producing binary files to be flashed on the actual device. The team is consisted of about 5-6 people and is part of the IO & Control Products team within the UK, which is part of the worldwide Avionics Interface & Control Products team. A colleague of mine is based in Mexico, which further contributes to the team’s global nature.
One of the GE Aviation’s clients is Boeing and we have been working on the upcoming 777X aircraft. The Cheltenham site works on multiple projects at the same time. Crew information system, as well as vehicle health and data management software, are currently being made for another leading aeroplane manufacturer.
The RIUs are replaceable modules and their role is to provide a serial digital interface between subsystems and plant machinery sensors/effectors. They can also provide autonomous local closed-loop control. Furthermore, RIUs have been utilised between units that do not have compatible interfaces, to provide a “data bus gateway” function. The model shown provides approximately 200 channels of flexible analogue I/O and can hold up to 31 configurations simultaneously.
Photo @GE. Learn more about the RUIs on the official website.
The Boeing 777X program was launched in November 2013. It builds on the technologies from the Boeing 787 but has greater cabin width and capacity (426 seats), new composite wings with folding wingtips, larger windows and new interior architecture. It is powered by the new GE9X General Electric engine which set the world record for the most powerful jet engine on the 12th of July 2019. It is 10% more fuel-efficient compared to its predecessor. The Boeing 777X had its maiden flight on January 25 and the first deliveries are planned for 2021. As with any other complex system, the project had suffered multiple issues which had required shifting of priorities in order to minimise delays.
Photo @Boeing. Learn more about the 777X on the official website.
Because of the small size of my team, every addition can make a huge difference and I feel like I was given a great responsibility. During my first week, I familiarised myself with the procedures, the software specifications and the context in which the software products are being used. As the company develops software for safety-critical systems, many software engineering practices are in place which I have not encountered before.
My first task was related to testing. As it is a crucial activity for the type of software the team develops, each tool has a large number of white and black box tests, covering the requirements. All tools, except for one, had its own automated test framework, fulfilling its custom needs. Manually running tests is laborious — going from the environment setup to running every single test and recording the observations for each step. This also means that tests are run less frequently, and are error-prone, which allows for regression bugs to build up with time and make debugging and fixing them harder. Initially, I had to fill the gap and, using one of the already built test frameworks as guidance, created a new one for the tool that did not have such a framework. As part of the task, I had to read and understand a complex codebase, extract the commonalities, and add custom features, targeting this specific product. Then, as I became more familiar with the testing strategy of the tools and how the test frameworks work, I moved on to build a generic one. As many of the products have some overlapping needs, maintaining a generic test framework would be much easier, compared to having multiple individual ones. This posed some challenges for me. As part of my University experience, I have not had to think much about design patterns and abstraction to the level it was required here. I did some more research on that and managed to deliver a working solution that is now used daily for formal and informal test runs. I also learnt more about continuous integration and had to write new and modify existing Jenkins pipelines.
My second major task was to write a new version of a compiler, which is part of the toolset. The previous release was written many years ago and did not benefit from the latest features found in modern programming languages, so the performance was not great. When I started working on the new version, only very few requirements were completed, so it was unusable. I started by gaining more understanding of what the compiler should do and going through the code that was already in place, in order to get a better grasp of what have been already implemented and what had to be developed. The task was indeed challenging, as it required knowledge about computer architecture, computer arithmetic and instruction set architecture, some of which I had gained from “Devices and Networks”, which I took as an optional module during my first year at University. Another obstacle was the fact that my team did not have much knowledge of this particular product, so I had to build inter-team connections. Because of the complexity of the compiler, I utilised a mixture of requirements-driven and test-driven development, based on the feature I was working on. I also had to come up with a test strategy and automated tests which I implemented using the generic test framework I had already developed. Due to the fast-paced situation with the 777X project, I was asked to deliver a working version of the compiler earlier than originally anticipated, which required good organisation and rearranging of work, so to be sure that the essential features are completed. This product is now in use.
In December, I spent some time working on a tool with a graphical user interface. This was a nice change, as most of what I had done until that point was working on tools with a command-line interface. Within a few days, I managed to learn a lot about building WPF applications and delivered changes which aimed at improving the user experience.
I also built some supporting software for the team. The first one was interacting with the API of the project management software our team is using. It runs weekly and exports a spreadsheet with the timesheet entries for each team member and emails it to the team manager. The second one was more complex and is related to the document creation process when a new version of the Toolset is released. The current process is tedious, as it requires tracking down the change requests implemented between a number of builds, filling in tables and document properties and more. The team wanted a solution that would extract and fill in most of the information automatically. The task proved to be harder than we expected, mostly because of some limitations with the software change and configuration management product used by the team. However, I produced a prototype, which exposed some of the flaws with the current procedures. As they have been already identified, I think it will be easier for the team to make the changes needed going forwards, so that they can get closer to an automated solution.
During the second half of my placement, I was working with the team on tasks related to the milestones we had to meet. For me, this was mostly related to testing. I have been doing formal and informal test runs of automated and manual tests and have gathered test evidence. I came across the concept of flaky tests, which could fail or pass on different configurations, and have tried to debug and modify them, so to make them deterministic. Moreover, I wrote new tests and reviewed tests initially produced or modified by others. I had very little experience with testing software when I joined the company, therefore I had to develop this technical skill quite fast. Even if not the most enjoyable stage of the software development lifecycle, I saw how important it is, especially for software of this scale. Regression testing is essential to ensure that any introduced bugs are quickly identified and fixed. I was also assigned document review tasks. They included exporting the documents from the requirement management tool, putting up the review pack in place, and actioning on the comments raised by the reviewers.
Throughout my time at GE, I have mostly been programming in C# which was easy to pick up, as it is very similar to Java which I have experience with from University. This helped me start writing code immediately after joining the company. As XML takes a big part of .NET Framework, I exploited it a lot — for data storage, configuration and layouting — and manipulated it using C#. I also had to use Microsoft Office’s automation features to programmatically create and edit documents.
Generally, I believe that Software Engineering is more about analytical and problem-solving skills, rather than a specific tool or technology, and you can only adopt this by experience. As a software engineer, I am now used to facing new challenges daily and knowing how to cope with them is vital. At University, they were mostly related to learning a broad range of new concepts at a very frequent rate. At work, on the other hand, sometimes the tasks I had to work on were not as well defined. Furthermore, figuring out what information you need and finding it, buried deep in various documents, was sometimes daunting. Nevertheless, overcoming all these challenges has made me more positive that I can cope with any situation. What is more, as I am getting more experienced as a developer, I am also becoming much more aware of performance and maintainability concerns and how to address them. As I had to work with a large codebase, code quality and modularity were of huge importance. The placement provided me with the opportunity to further improve in these areas.
Apart from the involvement with my duties, I have spent some time volunteering and have attended few events over the year.
On 14th of September 2019, I attended a group of like-minded volunteers to represent the Gay, Lesbian, Bisexual, Transgender & Ally Alliance (GLBTA) at the Gloucester Pride. The GLBTA is focused on creating a more inclusive environment for all employees at GE, and promoting the company's commitment to developing GLBT talent around the world. It was formed in 2005 and consists of multiple geographic and virtual chapters in more than 28 countries and well over 100 cities around the globe. GE has received a rating of 100 on its Corporate Equality Index every year since 2014.
In October, we attended a careers event at the University of Warwick, which was aimed at engineering students. We advertised the different ways they can experience what working at GE is like — via the Edison Engineering Development Program or year-long internships. I was representing the year-long placement scheme, and, as I have had already gone through the process, I believe I managed to provide the students with useful insights about the recruitment process. I attended a similar event at the University of Bristol in July.
My learning strategy has always been based around refining existing skills, as well as acquiring new ones. As I had more free time during the placement year, I rebuilt my personal website from scratch, using Ruby on Rails. This required using knowledge taken from the “Software Hut” module, which I took in my second year, as well as doing more research on solving performance-related issues with Rails apps besides debugging web applications and 3rd party libraries. Additionally, as I love the Apple ecosystem, I started learning mobile app development for iOS. Starting from the ground up, I did various courses and tutorials on different topics, including the Machine Learning framework, CoreML, maintained by Apple. This was interesting, as it makes use of general ML concepts and algorithms which I had studied about at University. I also got into SwiftUI, which is a framework for building apps in a declarative way. As the framework was officially released in September 2019, I think that making an early start on learning it would place me in a good position, should I decide I want to do mobile app development once I graduate.