Written Interview for Junior Ubuntu Software Engineering Role - Canonical

This is my answer for the Canonical written interview, formatted using Markdown.

All metadata is removed in the process of PDF conversion for anonymity.

The answers are long so the list of main topics are 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 company assigned (or my main research branch).
Now (from last year) I like to commit small change 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 intern and part-time. I heard a lot about intern breaking the production, so I wanted to avoid that situation and much as possible, and finally mastered (fundamental) Git command.
Now I use it to manage the collaboration with my juniors to implement autonomous racing car, apply to my research repo to jump between versions of algorithm I was unsure, 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 on 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 to OS, how to handle memories)
I think it’s fundamental that programmers (especially, at junior level) needs to consider to optimize the performance and investigate the error. It’s an important idea that juniors (including only me) tends to overlook.
To be honest, I learned coding by myself, focusing on making the code work, never considered what is going under the language I was using. With small projects I worked on, the small optimization might not cause problem, but not in the large=scaled project. Recently, I found many blogs referring how the software engineers reduce the company cost by optimizing the system. That inspired me a lot, and make me want to study it to become a worth software engineer that can spot memory error, and optimize the performance. Moreover, I think understand how languages work low-level, will help me easily understand the language I never used.
Also, currently RAM prices drastically rises, thus, it will be really important to optimize software. I think it’s timely.
I believe I will be good at it. Since I was young, I really enjoyed logical thinking and algorithm, planning the process step by step and going through it. As long as it is on logic, I think I can learn very quick.

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 restriction, without it the system easily break and hard to investigate error). 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 related to planning and control. But I understand Fundamental SQL, and once extract the data from BigQuery database for further data analysis. (Still never design or build database by my own - 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 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 almost with any conditions. 3. Performance: Without knowing 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 null pointer and else. 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.
The Autonomous Driving System is large system I built. 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 motor and steer wheel to follow the planned part, localization for checking the current location (compared to initial location), sensing and perception for receiving environment data. It’s not like REST API that use GET/POST to request and response using web service. ROS2 uses topic that is async publish and subscribe. Each component has node 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 path, and control only uses path to track. If one component does several duties, it can cause complexity.
About the maintainability, the .msg type definition in 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 record 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 that there is delay or missing hardware.

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

Education

Context