Hello ! My name is Emma Falkiewitz and I am 21 years old.
I am in my 4ᵉ year of computer science school at Compiègne University of Technology (the UTC) in France. I just finished my internship at Savoir-faire Linux where I worked on Jami.
How did this career choice come about?
In high school, I was already interested in computers, even if I didn’t really know what it involved. After high school, I had to choose a university. I felt good about my schooling, so I was aiming for a master degree. I wanted to go beyond two or three years of study before launching myself into professional life. Knowing that I had an affinity with computers and telephones, I opted for a computer engineering school. “Engineer” is a somewhat generic title that allows you to do whatever you want afterward.
What were your first years in engineering school like?
My school is quite generalist. The first two years we touched on biology, chemistry and so on. Given that computer science is a varied field, you gradually discover what you like, whether it’s artificial intelligence or network systems, etc.
What specific field of computer science are you interested in?
Mainly artificial intelligence. I want to learn how it works, the possibilities it offers, and it’s a rapidly developing field. It’s fascinating!
Why Montreal, and how did you end up at Savoir-faire Linux?
As part of my curriculum, there are two 6-month internships requirements, in the 4th and 5th year. It’s a trend to go to Canada in our school because we have close ties with several Montreal schools for double degrees or masters.
Even though I wasn’t interested in starting a double degree, the idea of discovering Quebec culture by doing a paid internship was attractive.
I applied to numerous Quebec companies, but since 6-month internships in the 4th year are a particularity of my university, it was complicated to find one.
Consulting our school’s internship histories, I discovered that a student from my university, Nicolas Vengeon, had done an internship at Savoir-faire Linux. I sent my CV and cover letter to Savoir-faire Linux, and after an interview I was accepted.
When did you join the Jami project and what did you work on?
I joined the Jami project at the end of August. At first, like all newcomers to the Jami project, you start with the desktop versions, using Qt. I had to try to resolve bugs by exploring the application, which allowed me to discover Jami’s code. After a week or two, I was asked to move on to Android, and I accepted because Kotlin, the language used for Android development, is very close to Java.
How was the transition to Android?
I’d already had a Java course, so I was more at ease with Kotlin. Whereas I was completely unfamiliar with the C++ used on Qt. When I came to Android, it was the same principle as in the beginning: discover the code by trying to solve bugs. Then, as time went by, I was assigned tasks such as improving the user interface or implementing new functions.
What notable feature have you implemented?
❗Using a QR code to link your Jami account to another device is one of the major features I’ve implemented. Previously, you could only use a PIN code. 💫
Are you also working on the user interface graphics?
Not really, I just implement the new designs in the application. For example, once a new conversation bubble design has been chosen, I modify the bubble parameters in the code, or implement new functions. Working on the design has enabled me to work with XML.
Did you have any difficulties with Jami?
Jami is very complex. It’s a massive thing to assimilate. There will always be parts I don’t understand. All I did was ask myself questions to understand its mechanics.
Similarly, if you add code, you have to be careful about what was written before: you risk to break deeper parts of Jami.
Android Studio informs us if there are functions that are no longer in use, so we think “we’ll just remove them”. Except that if you want to put the function back in, you will have to rewrite it entirely or search through the history. It’s a real job. Every time we delete code, it’s very tricky.
What do you think of Jami’s operation and use?
I really like the project. It includes concepts that most other applications wouldn’t use. I knew about peer-to-peer (P2P), but I had never seen it applied.
You can compare Jami to any other communication app, but connecting users without a central server, and in a distributed way, is brilliant. The technology is incredible!
Not having a server that consumes resources is also much more ecological.
What’s the Jami team like?
Everyone is friendly and available. If you have a question, they’ll come and help you. It’s also nice to have a voice, as an intern. I’ve made suggestions or even gave my opinion on certain designs, which were taken into account and changed.
The IT world is often more masculine. What has been your experience?
It’s true that in my school, there’s a majority of boys in my class. When you go into IT or mechanics, you expect that. But I feel good. In any case, there’s a good atmosphere at ours. It doesn’t make much difference whether you’re a woman or a man. At Savoir-faire Linux, I remember that when I was hired, we became a majority of women, and it was the first time
🚀 Thank you, Emma, for having granted us this interview and for all your work on Jami!
We wish you all the best for the future. 😊
– The whole Jami team
This interview is transcribed by A.I.
Whisper is one of OpenAI’s open source project which gained a lot of popularity.
Whisper’s code is used for one of Jami’s extensions: Whisper transcript.
During calls, the A.I. model runs locally on your device to subtitle the conversation in real time! (only available on desktop and Android).
To transcribe Emma’s interview recordings into text, we added the python module and created our own tool :
import whisper
import os
model = whisper.load_model("small")
text_dir = "text"
if not os.path.exists(text_dir):
os.makedirs(text_dir)
for file in os.listdir("audio"):
if file.endswith(".wav"):
new_file_name = file.replace(' ', '_') # Store the new file name
os.rename(f"audio/{file}", f"audio/{new_file_name}")
absolute_path = os.path.abspath(f"audio/{new_file_name}")
if os.path.exists(f"{text_dir}/{new_file_name}.txt"):
continue
result = model.transcribe(absolute_path)
with open(f"{text_dir}/{new_file_name}.txt", "w") as f:
f.write(result["text"])