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.
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?