Self-Taught Learning
Francesco Ciannavei
Sep. 2019 - Today
My passion for computer science was born during my high school years, when I had my first encounter with programming through studying Java. What initially seemed like just another school subject quickly transformed into a true vocation. Following lessons wasn't enough for me: I wanted to understand how things worked, I wanted to build something of my own.
First steps: Node.js and Discord
Alongside my school classes, I began exploring the world of programming on my own. I chose Node.js as my first experimentation environment and started developing bots for Discord. These seemingly simple projects taught me fundamental concepts: handling asynchronous events, interacting with external APIs, data persistence, and error handling in production.
Creating something that other people actually used gave me incredible motivation. Seeing my code work in real scenarios, having to fix bugs reported by users, and adding features requested by the community made me understand that programming isn't just about writing code: it's about solving problems for people.
Expanding my skills
From that moment on, I never stopped. I continued to deepen my JavaScript knowledge, exploring both frontend and backend. I studied Python, appreciating its versatility and power for automation and data analysis. I approached Golang, attracted by its efficiency and the simplicity of its concurrency model.
I dedicated significant time to database management systems, particularly PostgreSQL and MySQL. Understanding how to structure data efficiently, optimize queries, and design scalable schemas has become one of my strongest skills.
Every new technology I study doesn't remain theory. I always apply it in concrete projects, even small ones, because I firmly believe that real learning happens when you get your hands in the code and face real problems.
The home server room: my personal laboratory
One of the aspects that most characterizes me is my small home server room. It's not just a hobby: it's my experimentation laboratory, the place where I put into practice everything I learn.
I manage a Linux infrastructure with Docker, automated backup systems, and monitoring. This environment allows me to test configurations, environments, and tools in real contexts, without the limitations of a simple local development environment.
I'm currently working on building an infrastructure dedicated to running and integrating artificial intelligence models. I handle hardware optimization, autonomous workload management, and integration of different services. It's an ambitious project that's teaching me a great deal about distributed systems, resource management, and modern architectures.
The philosophy of continuous learning
To this day, I dedicate part of my free time to study and experimentation. I don't consider learning as something separate from work: it's an integral part of who I am as a developer.
I'm particularly interested in Go for its performance and simplicity, in machine learning for its transformative potential, and in Large Language Models for their practical applications. In my current work, I've already had the opportunity to implement a Retrieval Augmented Generation system, demonstrating that self-study can quickly translate into concrete value for professional projects.
My approach is pragmatic: I don't study technologies for the sake of accumulating knowledge, but to bring value, performance, and maintainability to the projects I work on. Every new skill must have a practical application, must solve a real problem.
This self-taught journey, which began almost six years ago, has shaped me as a professional. It taught me to be autonomous in problem-solving, not to give up in the face of difficulties, and to always keep alive the curiosity that pushed me to write my first lines of code.
Tools and languages used: