Written Interview for Junior Ubuntu Software Engineering Role - Canonical

This is my answer for the Canonical written interview, formatted using Markdown. The paging might be a bit messy. Thus, feel free to use this live page (anonymously produced).
All metadata is removed in the process of PDF conversion for anonymity.
The answers are long, so the list of main topics is listed here.

Engineering Experience

Q1: Describe a skill or knowledge you acquired recently that has been impactful for you. Why did you make this investment? What has the outcome been?
A: Version Control System (to be more specific, Git)
Even though I started using Git (in Github) for a while (around 2-3 years), I didn’t pay attention to it much, what I did was only commit a bulk change to the branch that the company assigned (or my main research branch).
Now (from last year), I like to commit small changes several times, make a branch, add the tag, and rebase. I found it very easy to compare and revert the change, which makes it easy to debug and investigate the failure cause.
I decided to study the core idea and several functions of Git because I need to use it in my internship and part-time. I heard a lot about interns breaking the production, so I wanted to avoid that situation as much as possible, and finally mastered the fundamental Git command.
Now I use it to manage the collaboration with my juniors to implement an autonomous racing car, apply it to my research repo to jump between versions of algorithms I was unsure of, and, the best outcome, work in the company without any production destruction. //And realized senior won’t let it happen anyway (still a good fundamental strengthening, and happy to invest in it).

Q2: What new skill would you like to learn? Why do you think this is important or timely or interesting? Why do you think you will be good at it?
A: How software operates at low level (how application interacts with the OS, how to handle memories)
I think it’s fundamental that programmers (especially at junior level) needs to consider optimizing the performance and investigating the error. It’s an important idea that juniors (including only me) tend to overlook.
To be honest, I learned coding by myself, focusing on making the code work, never considering what is going under the language I was using. With small projects I worked on, the small optimization might not cause a problem, but not in the large-scaled project. Recently, I found many blogs referring to how software engineers reduce the company’s cost by optimizing the system. That inspired me a lot, and make me want to study it to become a worth software engineer who can spot memory errors, and optimize performance. Moreover, I think understand how languages work at a low level, will help me easily understand the language I never used.
Also, currently RAM prices drastically rise, thus, it will be really important to optimize software. I think it’s timely.
I believe I will be good at it. Even though I never directly consider low level software so far, I have a strong understanding of logic and a strong base for high-level programming. I think having one strong side of the bridge and good resources will make the bridge stronger. Thus, I believe I can learn low-level software smoothly, starting from higher-level components and practicing step-by-step.

Q3: What kinds of software projects have you worked on before? Which operating systems, development environments, languages, databases?
A: In short, my main project is Autonomous driving system on Linux System (Ubuntu 22.04) using ROS2 implemented in C++ using Visual Studio Code editor without databases (please read more explanation below).
More information: I usually use Linux System for all software projects. I think it’s easy to manage package, and it does support several tools for programming (and has convenient keyboard shortcuts).
About development environment, I usually use Visual Studio Code for coding and sometimes nano for some small changes from terminal. For robotics development, such as autonomous driving system, I use ROS/ROS2 (using C++) - using colcon to compile and build project configured in CMakeLists.
Languages I mainly used are C++ and Python. C++ is used in autonomous driving system project in ROS/ROS2 (I found it easier to have strong restrictions, without it the system easily break and is hard to investigate errors). Python is used in my own research for simple and quick implementation. Also, Python is for data analysis and result visualization. Using Python, I can implement algorithm more freely than C++ since I know more syntax with longer experience, but I’m fluent in both languages.
For database, I never used it in production since my part was related to planning and control. But I understand Fundamental SQL, and once extract the data from BigQuery database for further data analysis. (Still never designed or build database by myself - Vibe code is not counted).

Q4: Would you describe yourself as a high quality coder? Why?
A: Yes, I think I’m a high quality coder, but with really clear room to grow. The HIGH-quality code is composed of several parts.
1. Good Algorithm: I believe I can deliver an efficient algorithm avoiding redundant complexity, and keep the code readable.
2. No-Error System: I usually focus on the correctness and reliability of the system by testing all ordinary cases and edge cases before merging to the production. With the fact that there is no system that can work with any conditions, I believe I can implement a system that works under almost any conditions.
3. Performance: Without knowing the low-level idea I mentioned in Q2, the performance of the code will depend on luck. This part might works well, some part might be slow due to bad memory handling. Some might have a null pointer and others. This part is what I lacked of, and I see it as a big opportunity to grow.

I think I can do what the fundamental high-quality good code should be, so with fair assessment, I described myself as high quality coder with room to grow, especially in system-level performance. I believe Canonical is a good place to learn it, and help me grow up as a very high-quality coder.

Q5: Describe your experience building large systems with many services - web front ends, REST APIs, data stores, event processing and other kinds of integration between components. What are the key things to think about in regard to architecture, maintainability, and reliability in these large systems?
A: While my field is usually in Robotics, it doesn’t involve the web front end, REST APIs you mentioned, but the concept to build large system is similar.
My experience building a large system in about build autonomous driving system. In the autonomous driving system using ROS2, the process is divided into several components, such as planning for planning the path to go, control for controlling the motor and steering wheel to follow the planned path, localization for checking the current location (compared to initial location), sensing and perception for receiving environment data. It’s not like REST API that uses GET/POST to request and respond using a web service. ROS2 uses “topic” that is async publish and subscribe. Each component has node(s) to publish the “topic” that contain data, and another node (same or different component) can subscribe to that topic to collect data for further use. It can have data store as log by running command to collect all data during the process.
The key things to think about in regard to architecture is that each component needs to clearly separate responsibility to reduce the complexity. Each component do only one duty for example, perception and sensing only take environment data, planning only uses perception data to plan a path, and control only uses the path to track. If one component does several duties, it can cause complexity.
About the maintainability, the .msg type definition in the topic in system-wide needs to be consistent, not only that, the naming convention, configuration, and documentation needs to be well-designed for maintainer-friendly.
About the reliability, since the failure is unavoidable, especially with large systems, logging and recording logs are very important to check which parts do not work normally. Also, since the large systems need several components to work together, each component needs missing data and hardware handler in case there is a delay or missing hardware.

Q6: Outline your thoughts on quality in software development. What practices are most effective to drive improvements in quality?
A: The quality in software development is that the software needs to be correct, reliable, clarified, maintainable, and efficient.
Correct - The software can deliver desired behavior.
Reliable - The software can work in normal condition (designed) and edge cases (as much as possible).
Clarified - The software must be readable and not overcomplicated. Also, the naming convention and documentation need to be designed and written for others to follow.
Maintainable - The software must be easy to modify and extend for future improvement.
Efficient - The software must use resources the least while return most outcomes. That means the architecture and algorithm need to be well-defined, not only correct.

There are several practices to improve software quality.
Correct - Need to clearly define requirements of the task (including why we need to implement it). If we don’t know what we are doing for, it’s hard to implement well-designed code.
Reliable - Add tests including all conditions that can occur (even it’s rare). Also, the tests on several real scenarios are not only the core logic. These tests need to test on behavior, not logic, since the system might do one part correctly, but failed to integrate with the whole system.
Clarified - Keep the algorithm simple as much as possible, while designing it to allow for modification. Also, keep the useful comments on how functions work, and write the detailed documentation on how the API works and how to use it.
Maintainable - Keep paying technical debt by refactoring code. It will make the system hard to modify. Divide the large system into components, and make them loosely coupled (can modify only one component, and the rest still works). From my experience, the code becomes messy when a new constraint is found during the research. I used to chain all sections with a designated solid type, which is hard to modify only one component. I finally needed to reimplement the whole system.
Efficient - Choose the right algorithm and data structure for each task carefully. For example, in C++, using deque when you need to often insert or remove elements from array instead of using vector. Or use pointer instead of duplicate large object. Also, be careful dealing with memory, needs to understand it well to design memory (as I mentioned in Q2 and Q4, it’s a big room to improve that most people overlook).

Q7: Outline your thoughts on documentation in large software projects. What practices should teams follow? What are great examples of open source docs?
A: Documentation is very important in large software projects (important even in small project). As a user, it’s hard to go through how code works in a large codebase. Documentation is like a navigator that helps the user start and understand the codebase (and functions).
In my opinion, the good documentation should be easy to understand, starting from an overview of the system, how to install, how to use, how each API works (what’s input and what’s output), and how to debug error in case of failure. Keep the documentation in several small sections dedicated for each duty for reader-friendly experience. Try to add images or illustrations as much as possible to improve the explanation. Moreover, it would be nice to separate between general user’s documentation and contributor’s documentation, just divide section is enough. It has different purpose, it will be really helpful for beginner who is scared of plenties of functions in a large system.
A good example for user documentation will be your Company (Canonical)’s Ubuntu Desktop Documentation. Starting from an overview of Ubuntu Desktop, leading to how to try and install it. Using illustrations of installation panels helps me a lot to confidently install it. And several pages for introducing simple command lines and accessing some system’s feature such as upgrade and remote access. Also, there is a common problems page for troubleshooting and fix problem.
Another good example in term of both user and contributor will be Autoware Documentation. As I said, an overview is important, then diving into the installation, architecture design for contributor, and code of conduct for the contributor. Following tutorial can provide a sample system result. If diving more into the main part of Autoware, called Autoware Core, there is also API table for explaining how each function works. Even though there is a lot and quite hard to go through all of it. But it helps both users and contributors to understand all sections of Autoware easily.

Q8: Outline your thoughts on user experience, usability and design in software. How do you lead teams to deliver outstanding user experience?
A: User experience is an important part of good software. In term of code, the high quality software is what I mentioned in Q6, the user experience, usability, and design are parts of good software (or application). Good software can be defined by how the user interacts with it. Is it easy to use? How does it behave when failure occurs? Does it often cause confusion? Good software needs to make users focus on their tasks, not on how the system works. That’s how the Good User Experience (UX) defined in my opinion. What will make software popular is not only how complicated or cutting-edge it is, but also how easy the user can use it.
Usability is what the users expected the software can do, which really matters. If the software can response to any user’s expectation and do common tasks quickly, users will consider it good software.
And the thing that will tell the user how to use it, and briefly tell them what the software can do, is the design. Design is like a communication between users and system provider - mood and tone, how to use, how much it can do, and simplicity are communicated via design.
Thus, all of these aspects are considered an important part of good software.

If I have a chance to lead teams, I would start from stating the definition of the software - who is using, what is the goal of it, and what state is called success. Who is using it is important to design how hard or detailed the system would be - the general users might want simplicity, while technical users might want configurable software. The goal of software will give info of what the developer needs to do - what is the input, what is the desired output. And finally, the criteria to assess it as success, for checking which tool we should use to achieve and test it. In the process of development, the designers and engineers need to work together from the start. Sketch and discuss the prototype several times to understand requirements, budget, and design. Keep getting feedback before the code becomes solid. For the design, art might not be my way, but the core idea is simplicity and consistency. Reusing the patterns, colors, and component will give a chilling vibe to the user easily.

Q9: Outline your thoughts on performance in software engineering. How do you ensure that your product is fast?
A: Performance is a very important part of a good quality code. In a small project, it barely affects the system, but in a large project, it can change the user experience. The performance can be improved by understanding what the requirements of the system are, and removing unnecessary part of the code. If we fully understand the program including the memory level, the performance can be improved. This is a big difference between junior and senior software engineers that I want to overcome.
An idea to ensure the product is fast is to do benchmark - running on full load, running on unexpected load, running on small load, running on a low-spec machine, running on a high-spec machine. We need to do a benchmark on all conditions and test on all scenarios then, keep recording the data. In global competition, comparing it with competitors might be one criterion. Another criteria will be comparing with the standard or comparing with the past version. We can check it with user blind test to check the feeling, or collect the data of response time. There are several ways to ensure fast product depends on goal and budget.

Q10: Outline your thoughts on security in software engineering. How do you lead your engineers to improve their security posture and awareness?
A: Security is the section where I barely have insight. It’s a very important part that can improve the reliability of the software, besides the fact that it can work in any conditions.
I understand the main idea of security is to keep the authentication secret, do not push on cloud, always have CI to check it. For the confidential database, it needs authentication to access the data. The owner of each data needs to be defined individually. Some data might need to encode such as hashing, for safety before sending or collecting. This would be what I would notice my engineers if I have the chance to lead the teams. Still, I need to study more about it to get more detail and possible vulnerabilities.

Q11: Outline your thoughts on devops and devsecops. Which practices are effective, and which are overrated?
A: As I understand, DevOps is a role who merge between developers who develop system and operation who deploys and monitor system. And DevSecOps add Security part to this term. In the small project, these roles are combined in one person so the boundary is not clear. That’s why, in this case, the DevOps and DevSecOps might be overrated.
However, in the large systems, these roles are very important since the system is too large for one person to handle alone. That causes the incident that developers don’t hear the feedback from the users, while operations that do deployment and monitor response do not know what is going on inside the development process. DevOps is a glue to connect both sides together, and help communicating the necessary data to both sides.
DevSecOps, other than the mentioned duty, have to monitor the security of the code while the developers are implementing. This will avoid the case that many vulnerabilities are found when production is ready if there is no one check it during the implementation. If the system is not well-designed, changing one function might affect several functions and take time to fix.
In short, DevOps and DevSecOps are overrated with small project, but significantly effective in large project that developer, operation, and security are separated. Without them, the system might not crash, but the workflow becomes stuck and wastes more time fixing issues.

Domain Specific Experience

Q12: Outline your thoughts on open source software development. What is important to get right in open source projects? What open source projects have you worked on? Have you been an open source maintainer, on which projects, and what was your role?
A: There are several aspects I think of open source software, let me enumerate it.
As a user: Since open source software allows anyone to see the code, it is safe to use it. We don’t need to be afraid if company will secretly track our usage or location.
As a developer (contributor): Since anyone can contribute to this codebase, there is a lot of collaboration and discussion. The growth of the software is very quick. It can be used as a based of other cutting-edge systems. Or the open source software itself can be developed by the real users that faced problems. There might be an edge case that the maintainer overlooks. It can create more efficient software.
Unlike closed-source software, open source software needs to have well-defined contribution guideline like code of conduct, well-described PR, and documentation. The contribution can be done freely, at the same time, can maintain the quality and formats of the codebase. By doing that, CI, to validate modified code, needs to be strictly applied before merging to the main branch (or other important branches) to validate modified code. The maintainer needs to review carefully and also in a timely manner to respond to many contributors. This is where well-described PR plays an important role. It will speed the review process up. Open source software also needs enough maintainers who will take care of each component if there are several components. Moreover, the security, such as the authorization, needs to be verified regularly, since visible code is easier to find vulnerabilities. Documentation is important for all software, but open source software might need to focus more on contributor’s documentation, since the software is not only for use but also for contributing.
The open source project I have worked on is Autoware. I have never been an open source maintainer. I mainly contributed to Autoware by refactoring duplicated functions, porting functions from extension packages to the core system, deprecating those functions, and improving the documentation. This will improve the software quality of Autoware in my point of view. The less extension needed, the better the performance is.

Q13: How comprehensive would you say your knowledge of a Linux distribution is, from the kernel up? How familiar are you with low-level system architecture, runtimes and Linux distro packaging? How have you gained this knowledge?
A: I would describe my knowledge of a Linux distribution as the tip of the iceberg. I’m familiar and quite confident with user-level Ubuntu, especially the command line in terminal and distro packaging such as apt, snap, dpkg(for .deb), mainly from using it as my daily tool for development in my research and robotic projects.
At a low level, I understand the concepts of Linux file systems, basic hardware interaction, kernel, runtimes, and bootloader from self-study(Youtube and Community) and while debugging my small projects. Still, since I never worked directly on low-level code, there is a lot to learn about the low-level architecture, how CPU works internally, and memory management.
Since I’m confident and familiar with user-level and now crawling to the deeper concepts, I think my current knowledge will be a strong base for lower-level software, which is the bottom of the iceberg.

Q14: Detail your experience and contributions to any Linux distributions. You might include details of any work in Ubuntu, Debian, Fedora, NixOS, Arch Linux, etc. Feel free to include links to any notable contributions.
A: I do not have contributions to any Linux distributions yet. But I have experience working on Linux (to be specific, Ubuntu).
I usually use Ubuntu for my research and internship. While using it, I experienced how to debug dependencies issues, how to build and debug both C++ and Python on Linux, do some shell scripting, and configuring virtual environment. I’m also experienced in ROS/ROS2 and basic of Docker via terminal.
While my experience so far is on the user level, I’m interested in contributing more directly to the system level of Linux distribution.

Q15: Outline your experience with software packaging. This might include work with Debian packaging, RPMs, Snaps, Nix packages, Dockerfiles or otherwise.
A: Same as Q13 and Q14, my software packaging is user-level. I do not yet have experience with how the packaging systems work underneath each command. What I strongly understand is what situation to use it, how to use it in, how the outcome will be. The software packaging I am familiar with is mostly from Ubuntu (apt, snap, dpkg). Each Linux distribution will have different package managers, Ubuntu uses apt for supported package, while uses snap for app-like installation. Both of them automatically install dependencies. But dpkg is a package installation from .deb file that is Debian-based. It does not automatically install dependencies (or might be bundled), and the user sometimes needs to install dependencies by themselves. I also have experience with Dockerfile (but just realize it’s also a packaging after reading the question). I used Dockerfile to create my simple container of ROS2 with a necessary container for implementing CI pipeline (using Github Actions) for competition. Basic idea of Dockerfile is to run all the functions inside it to create a Docker image that contains OS, environment (runtimes and kernel), and dependencies, to set the same environment for all users (avoid “it works on my machine” problem).

Q16: According to your experience so far, how would you engineer a release pipeline for a major software project? What tools might you use for automation, and what are the critical steps in the process that should be executed in the run up to a release?
A: From my experience, I worked on my own small project and contributed to small parts of the release pipeline. What I understand clearly is to have a strong CI (Continuous Integration) that check lint (format), clean build in a specific environment set in Docker, and unit tests. Only the all pass code with the strict reviews can be merged to the main branch. Then, it will go into the release period. The main branch will be version tagged and finalized by fixing minor bugs without large feature. To be honest, I’m not familiar with the detail but in concept, the successful build will be collected as an artifact as binary allowed for users to download to easily use compiled applications.
The tool I usually use to do automation is Github Actions. However, I heard that there is one more tool called Jenkins to do CI. It’s another tool that I want to learn.
All the steps I mentioned earlier are necessary to release high quality system without bugs. However, there is always an unexpected incident. Thus, the CRITICAL steps that need to be executed are the final security check and having a rollback plan. The final security check is for checking new vulnerabilities added with a new feature, while the rollback plan is for when a big problem occurs in the current release. While steps in the first paragraph deliver a good quality system, these critical steps prevent the system from breaking due to an accident or attack.

Education

Q17: How did you rank in your final year of high school in mathematics? Were you a top student? On what basis would you say that?
A: For mathematics in high school, I ranked in the top 1% of high school all the time. Sometimes I could go up to 0.1%. For the context, my high school is the top high school in my country, with rate of acceptance of around 1% (240/20000). Entering this high school will be in the top 1% of the country, and I’m in the top 1% of this high school in mathematics, science, and especially physics. This makes me rank myself as top the 0.1% of the region, meaning a top student. My score in all mathematics tests was always more than 85%, with the GPA always 4.00.
Additional Notes: score in high school is always more than 90% in physics, and always 4.00 as well.

Q18: How did you rank in your final year of high school, in your home language? Were you a top student? On what basis would you say that?
A: For my home language, I would say I’m slightly above average. I passed all the exam with a score of more than 80% all the time with a GPA of 4.00 like mathematics and physics but with some more studies. I could communicate and write report in my home language in native level, even in Business and Academic level. Also, the translation from English or Japanese to my home country in conversational level is not a problem for me. Still, there are some deep details in my home language that I can miss, I would rate myself at top 10% of high school in this aspect.

Q19: Please state your high school graduation results or university entrance results, and explain the grading system used. For example, in the US, you might give your SAT or ACT scores. In Germany, you might give your scores out of a grading system of 1-5, with 1 being the best.
A: For high school, I got a GPAX of 3.92/4.00 due to social studies and history, I’m not that good at it. The full score for the grading system in my high school is 4.00.
For university entrance results, there are several tests listed here:

Q20: Can you make a case that you are in the top 5% in your academic year, or top 1%, or even higher? If so please outline that case. Make reference where possible to standardised testing results at regional or national level, or university entrance results. Please explain any specific grading system used.
A: Yes, I’m the top 1% or higher in my academic year. Starting from high school, which is the top high school with an acceptance rate of 1% (240/20000), and I’m the top 1% in this high school.
I attended the Thailand Physics Olympiad (TPhO) since middle school, and attended again in high school, and can get silver medal.
As mentioned in Q19, all my university entrance test results are in the top 0.1% of the country. (in physics and mathematics)

Q21: What sort of high school student were you? Outside of class, what were your interests and hobbies? What would your high school peers remember you for?
A: I’m not a front-row student, but I pay attention to class at the same level as a front-row student. I wasn’t called a nerd, but I was called a genius.
Outside of class, I played basketball in the evening, and play bass guitar in the school event with the band. My band is the representative band of my batch, always ending the school music event, and performing in the welcome and farewell ceremony of international events held in the school.
In the class, my school peers will remember me as a physics genius. Outside the class, I’m regarded as a very happy, friendly, reliable, good, and kind friend. Also, they will remember me as a part of my band, but they thought what I played is guitar. (I played basketball, but not at a pro-player level.)

Q22: Which university and degree did you choose? What other universities did you consider, and why did you select that one?
A: For Bachelor’s Degree, I considered domestic and international universities. For domestic universities, I considered to continue in Engineering in Chulalongkorn University, which is the best university in Thailand. I already got accepted, but I decided to continue my Bachelor’s Degree at Nagoya University, which has more reputation in Automotive. At that time, I was interested in autonomous driving vehicles in EV cars, thus, I joined Nagoya University for the Electrical Engineering majoring in Automotive Engineering.
I also have interest in Machine Learning and Data Science, thus, I took some classes and applied for other universities in more Informatics Department for a Master’s Degree. However, since the laboratory I joined during the last Bachelor year focuses on control engineering related to autonomous driving systems, a field that I think there are less experts, I decided to continue at Nagoya University for a Master’s Degree in Mechanical Engineering, majoring in Automotive Engineering (since the lab is a part of the Mechanical Systems Department). Still, at the lab, I mostly focus on software using ROS2 to control a robotics car, and sometimes deal with car’s(robot) hardware. I would say I’m between both informatics and mechanical, regardless of my Mechanical Engineering degree.

Q23: Overall, what was your degree result and how did that reflect on your ability? Please help us understand the grading system for your results.
A: I obtained A and sometimes A+ in almost all courses since the first year of my Bachelor’s until the last year of my Master’s. My grade is 4.04/4.30 for Bachelor’s and 4.09/4.30 for Master’s (two more semesters left). The full score for this grading system is 4.30 for A+. In my Bachelor’s, I only got one B and one C in the Material Engineering course. To be honest, I understand the class so well, but I got this due to unseen and exam (the whole batch got C for reference). For Master’s until now, there are all A and A+. Most of the A courses come from the course that is assessed by report, while A+ are always from exam-prioritized course. I usually answer concretely with shorter discussion so the report seems short, but I’m confident it has high quality and is easy to understand.

Q24: During all of your education years, from high school to university, can you describe any achievements that were truly exceptional?
A: In my point of view, all the steps of my education are exceptional, since I always performed well. But if I need to choose the solid achievements, I will mention the Thailand Physics Olympiad (TPhO) in high school, and the F1-tenth Competition in Japan.
In high school, my math skill is top 1% of the country, and physics is in the top top 0.1% (or even 0.01%) of the country. The evidence is that I can attend the Thailand Physics Olympiad and got a silver medal. This event will be competed by all talented high school students from the whole country. So I can be confident that there are a few people in the country that is above me at the same age. I think this is truly exceptional.
For University, I won first place in F1-tenth Japan, an autonomous racing car competition, with me being the core of the team. Before this competition, I attended the international F1-tenth held in ICRA 2024. At that time, our team can get the top 8 teams internationally. My role at that time was to implement the tools that helped speed up the vehicle. It gave me a very good overview of the system. And the next year, as I mentioned, I won the competition in the role for local planning (to be more specific, focus on path and reference utilization).

Q25: What leadership roles did you take on during your education? Did you conceive of, and drive to completion, any initiatives outside of your required classwork?
A: In all school projects, I was always positioned as a supervisor. I’m not the type who always orders others to work, but I like to assign everyone the sections that they are familiar with. During the project, I always keep following up with the team members to ensure that the workflow has no problem. Even though there is some delay in some sections, I could manage with other team members to do other tasks, or slightly delay the workflow depends on the situation. And at the end of the project, I usually write a final report if it’s required, since I know all the workflow and concepts of each sections. We always have a great result without fight in the team.
Outside the classwork, I once gathered my juniors in the lab and the international community to join some competitions. They are the competitions about the autonomous racing car, which is the field I was working on. Still, with all members’ tight academic schedule (including me), we didn’t spend much time on it (has only one-two weeks). Instead of working alone on my own, I like to guide my team members and assigned them to the section that they have experience in or the one they are interested in. And since some of them have no experience in a development environment, I guided them on how to use Git, make a PR, and deal with the CI pipeline (which I simply made). At the end of the competitions, tough luck to say that we could not win them. However, my team (also me) learned a lot about working in the projects like this, how to manage time to deal with tight deadline, and a more solid concept of an autonomous driving system. All events are a good experience for me. I’m so proud of my team and myself for initiating this team.

Context

Q26: Outline your thoughts on the mission of Canonical. What is it about the company’s purpose and goals which is most appealing to you?
A: Mission of Canonical is to make open source software reliable and easy to use for everyone, from personal computers to enterprise servers. This is an ambitious mission yet meaningful in my thoughts. Open source software itself grows very fast compared to closed source, but it is sometimes less stable. Canonical integrates several open source software and make them stable and practical for all users. I believe this approach will have a global impact.
Canonical adopts several open source projects to Ubuntu, such as GNOME, and at the same time, provide long term support and security with high engineering standards. Rather than focusing on profits, the company focuses on improving and spreading Ubuntu Open Source world-wide to several levels of users. I believe the outcome will be visible soon in the upcoming generation. I want to see myself as a part of that outcome, not only around that outcome but at its core by contributing directly to it. That is what motivates me to apply for this position.

Q27: What do you see as risky or mistaken in our offering, positioning or strategy?
A: I think it’s not a mistake, but in the past, Linux had a reputation for being difficult for normal users. Many people believed it required strong technical knowledge, which made them choose other OS as their first choice. But in this generation, I, as a user, don’t feel that it’s hard or requires high technical skills to use. Canonical does well in making it easy to use, stable, and lightweight right now. But since we start later than the market leader, the market share of Linux is not large enough to convince some developers, such as game or commercial software companies, to support Linux. Most of them select to develop a system based on the API of the most widely used OS. That is not an exact mistake, but it’s a reality that affects market share increment.
However, as I mentioned in Q26, the world is now moving to Linux OS with your past effort, especially in servers, cloud, and development environment. When the market share grows, more software needs to support Linux OS equally. When there is no issue in compatibility, I believe Linux will easily take over the market.
One risk I’m thinking of is that there are several distributions of Linux having different package managers and desktop environments. That’s a strong advantage of open source software, the user can customize and choose what fits them the most. But for developers, it can be a challenge to support all of those variations. That could be called a disadvantage.

Q28: How should Canonical set about winning, commercially?
A: A very good strategy to win commercially is to not copy the market leader, but focus on the strong point of Ubuntu and fulfil what the users want.
Canonical is already strong in cloud server and infrastructure for developers. Keep improving these aspects or just maintaining the long-term support and security update would generate stable revenue from companies that rely on Ubuntu easily.
For common developers, Ubuntu is a very convenient development environment, except for CUDA for GPU. Now AI/ML becomes important, which required GPU usage, but sometimes it’s hard to set up and use CUDA in Ubuntu due to driver and version mismatch. Canonical might need to focus on users’ needs and improve the ease of hardware compatibility while maintaining customizability.
For normal users, since now Ubuntu is easy to use and stable, what we still need is an office program and game. Since Libre Office is not compatible with main stream office, and not well-known, some users might be afraid of using it. Also, some games are built on DirectX, which need to be ported to Linux Vulkan or OpenGL. There is some companies working on it, such as Valve, working on Proton to port these games, so being a partner with them will be a good way to accelerate the market share growth in game sections.
The most important part is to not copy the market leader, but support what they cannot do. We win all in light-weight, stability, and now easy to use. Keeping our system good, and easier to use while maintaining customizability will be a win for Canonical commercially.

Q29: How should Canonical amplify its impact in open source?
A: I believe Canonical is already amplifying its impact in open source.
By setting clear guideline for contribution, a lot of contributors will have the will to contribute to open source. And with the open community, it’s easier for the newbie to join the community. With less friction in contributing to open source, the open source will have more contributors and more applications will be developed from the large open source community.
Canonical usually collaborates with other open source projects by adopting them into Ubuntu. That’s a really great move. Instead of competing with other open source organizations, collaboration will share the strong and weak points of both Canonical and others, then push the better version or the integration of both products. The benefits will fall on the users because there are easy to use software with wide compatibility. When it’s useful, it becomes well-known as well as open source software. Rather than one impact from good products, all collaborated organization will gain more users from this amplification.

Q30: Why do you most want to work for Canonical?
A: There are several reasons why I want to work for Canonical.
First, I’m now interested in low-level architecture and system-level software. Canonical is the company that develops Ubuntu, which is the OS I like the most. I think it’s the most interesting place to start a career as a software engineer. The more fundamental, I know the better software engineer I will be. So I want to grow in an environment that is strong in low-level architecture.
Second, it’s a global and remote-first environment, it means that I can work with talented people from many countries around the world, not located only in one country. This is an opportunity for me to learn from diverse and skilled engineers who I might not meet in traditional office setting. I believe it will be a really challenging environment and will help me grow quickly in this field.
Finally, I believe in my long-term potential. I want to join not only as a junior who learns from seniors, but also as someone who can eventually guide future juniors. I want to contribute meaningfully and grow with the company and the community that I am a part of. Canonical is one of the best open source companies in the world, and I believe it is the right place for me to develop at a high level.

Q31: What gives you the most satisfaction at work?
A: The most satisfaction at work for me comes from my own growth. In any situation, whether it’s failure or success, if I can learn something, I will be satisfied. It can be soft skills, hard technical skills, development skills, or system architecture. I feel I’m moving forward every day step by step. It really motivates me to keep going forward.
Another source of satisfaction is seeing the outcome of that growth. In the past, I might build systems roughly, just to make them work. Now I can implement a reliable and well-designed system from the knowledge I have gained. Keep getting this feeling gives me a long term motivation.
Finally, I like to share what I have learned with others. I’m very fulfilled when I can digest the experience I gained with difficulty to future juniors, and the teammates can trust my decision or well-designed contribution. That satisfies me as a great software engineer.

Q32: What would you most want to change about Canonical?
A: I am still the external person, I may not fully understand Canonical’s internal strategy. But from my perspective, I think Canonical needs to increase the visibility of Ubuntu among normal users.
As I mentioned in several questions before, I believe in Ubuntu’s potential and I think all engineers at Canonical believe too. It’s now very well-known in cloud and servers but it’s not promoted or advertised well to normal users. Collaboration with hardware vendors might be a good way to increase users’ awareness. It might take time to compete the market leader, but in long-term it will be worth it. I’m not sure about the idea, but I believe in Ubuntu’s strength, and it should be announced properly to let normal users know it.

Q33: What gets you most excited about this role?
A: In short, low-level infrastructure of Ubuntu knowledge, talented seniors and colleagues, and a work on Ubuntu system.
For more detail, this role could give me the very insight and practical knowledge of the low-level infrastructure of Ubuntu experience, which I could not get by just contributing to some surface sections.
I will be surrounded by talented seniors and colleagues, which will accelerate my growth. At the same time, I can show my skills as one of the talented engineers in this challenging environment as well.
I really like Ubuntu and feel really happy that market share has been growing in the past few years. I want to be part of it, I want to be the one that increase Ubuntu compatibility with other softwares and finally take over the whole market share. I believe in its potential, and want to be a person who drives it.

Acknowledgement

Thank you for this written interview. Answering these questions helped me show you my perspective, and at the same time, reflect on myself. That’s a great review for me. I really appreciate it, and I hope we will have the opportunity to work together in the future.

List of All Questions

Engineering Experience
Q1: Describe a skill or knowledge you acquired recently that has been impactful for you. Why did you make this investment? What has the outcome been?
Q2: What new skill would you like to learn? Why do you think this is important or timely or interesting? Why do you think you will be good at it?
Q3: What kinds of software projects have you worked on before? Which operating systems, development environments, languages, databases?
Q4: Would you describe yourself as a high quality coder? Why?
Q5: Describe your experience building large systems with many services - web front ends, REST APIs, data stores, event processing and other kinds of integration between components. What are the key things to think about in regard to architecture, maintainability, and reliability in these large systems?
Q6: Outline your thoughts on quality in software development. What practices are most effective to drive improvements in quality?
Q7: Outline your thoughts on documentation in large software projects. What practices should teams follow? What are great examples of open source docs?
Q8: Outline your thoughts on user experience, usability and design in software. How do you lead teams to deliver outstanding user experience?
Q9: Outline your thoughts on performance in software engineering. How do you ensure that your product is fast?
Q10: Outline your thoughts on security in software engineering. How do you lead your engineers to improve their security posture and awareness?
Q11: Outline your thoughts on devops and devsecops. Which practices are effective, and which are overrated?

Domain Specific Experience
Q12: Outline your thoughts on open source software development. What is important to get right in open source projects? What open source projects have you worked on? Have you been an open source maintainer, on which projects, and what was your role?
Q13: How comprehensive would you say your knowledge of a Linux distribution is, from the kernel up? How familiar are you with low-level system architecture, runtimes and Linux distro packaging? How have you gained this knowledge?
Q14: Detail your experience and contributions to any Linux distributions. You might include details of any work in Ubuntu, Debian, Fedora, NixOS, Arch Linux, etc. Feel free to include links to any notable contributions.
Q15: Outline your experience with software packaging. This might include work with Debian packaging, RPMs, Snaps, Nix packages, Dockerfiles or otherwise.
Q16: According to your experience so far, how would you engineer a release pipeline for a major software project? What tools might you use for automation, and what are the critical steps in the process that should be executed in the run up to a release?

Education
Q17: How did you rank in your final year of high school in mathematics? Were you a top student? On what basis would you say that?
Q18: How did you rank in your final year of high school, in your home language? Were you a top student? On what basis would you say that?
Q19: Please state your high school graduation results or university entrance results, and explain the grading system used. For example, in the US, you might give your SAT or ACT scores. In Germany, you might give your scores out of a grading system of 1-5, with 1 being the best.
Q20: Can you make a case that you are in the top 5% in your academic year, or top 1%, or even higher? If so please outline that case. Make reference where possible to standardised testing results at regional or national level, or university entrance results. Please explain any specific grading system used.
Q21: What sort of high school student were you? Outside of class, what were your interests and hobbies? What would your high school peers remember you for?
Q22: Which university and degree did you choose? What other universities did you consider, and why did you select that one?
Q23: Overall, what was your degree result and how did that reflect on your ability? Please help us understand the grading system for your results.
Q24: During all of your education years, from high school to university, can you describe any achievements that were truly exceptional?
Q25: What leadership roles did you take on during your education? Did you conceive of, and drive to completion, any initiatives outside of your required classwork?

Context
Q26: Outline your thoughts on the mission of Canonical. What is it about the company’s purpose and goals which is most appealing to you?
Q27: What do you see as risky or mistaken in our offering, positioning or strategy?
Q28: How should Canonical set about winning, commercially?
Q29: How should Canonical amplify its impact in open source?
Q30: Why do you most want to work for Canonical?
Q31: What gives you the most satisfaction at work?
Q32: What would you most want to change about Canonical?
Q33: What gets you most excited about this role?