I've been breathing software for over 35 years, learning, practicing, teaching and writing.
In my everyday life, I design software-intensive systems at different scales, using a number of paradigms, languages and technologies.
I complement practice with a rather strong theoretical background, and I tend to go where no one has gone before.
I've been programming since 1978, which was unusual for youngsters at that time. I still code quite frequently, because it's only through direct experience that we can develop the right sensibility for different materials, and because I'm not the kind of guy who quotes the Art of War, but steps back when it's time to reach for the sword.
I got my degree in Computer Science back in 1991, summa cum laude, with a thesis on formal methods; being the way I am, I also developed a compiler to prove that all that math could actually work. Having spent quite some time immersed in the functional and the logic paradigm (other than, of course, old-school structured programming), at the time I picked OOP as my weapon of choice as I ventured into larger projects.
Although no longer en vogue, C++ was all the rage back then, and I've soon found myself immersed in its culture, so close yet so distant from my early friend Smalltalk. Those were also wonderful years for OOP, with the pattern movement taking shape. I stepped in, eager to learn and to contribute.
From 1995 to 2001 I managed to write almost 100 papers, publishing basically everywhere, from IEEE Software to Journal of Object Oriented Programming, from the C++ Report to Object Expert, from Electronics Design to Dr. Dobb's Journal. I also published almost monthly in the leading (back then) Italian journal, Computer Programming, where I served in the editorial board, and published my own newsletter on C++ (focusing on metaprogramming, which, at that time, was kinda cool). During those years, I also spoke frequently at various conferences; then I decided to focus more on my consulting practice, and with a few exceptions in 2005 and 2006, I limited my writings to longish blog posts.
As part of my profession, I've been lucky enough to be involved in many application domains (medical, industrial automation, banking, finance, military, etc), usually as the lead designer of mission-critical systems, working on hardware of any scale (from microcontrollers to the cloud), using many different languages and technologies. I can honestly say that without the continuous practice in real-world projects, all the theories I learnt would have proved useless. Most of what I'm creating, and what I'm writing about, is an indissoluble union of theory and practice.
I tend to observe the problem, the organization, and the people who will eventually grow the system, and to design software which balances all those different needs and has some inherent beauty inside. Though I rely on experience, intuition and patterns, I stay clear of canned architectures. I mix and match ideas and notions, so I frequently use functional parts or aspect-like composition within object-oriented architectures. I call this approach Brain-Driven Design, as I don't expect design to be driven by anything else than brainpower :-).
I'm following a path of learning and discovery. I'm fascinated with software design, which I consider misrepresented by contemporary practices and literature. My work on the physics of software is my latest shot (so far) at reaching a deeper understanding of software as a material to be shaped.
I used to blog at carlopescio.com. Most of my old publications (in English and Italian) and a largely outdated blurb on my professional services are kept at eptacom.net. I'm also on twitter.