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:
- General Subject Tests:
- Math: 90/100 (mean: 25.39)
- Physics: 84/100 (mean: 28.29)
- Professional and Academic Aptitude Test (PAT)
- Math: 278/300 (top 8 out of 173,708 applicants)
- SAT Subject
- Chemistry: 800/800
- Math Level 2: 800/800
- Physics: 800/800
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)
- General Subject Tests:
- Math: 90/100 (mean: 25.39)
- Physics: 84/100 (mean: 28.29)
- Professional and Academic Aptitude Test (PAT)
- Math: 278/300 (top 8 out of 173,708 applicants)
- SAT Subject
- Chemistry: 800/800
- Math Level 2: 800/800
- Physics: 800/800
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?