My first contact with computers was with a Spectrum ZX when I was a little child. I’ve always felt a special calling towards the world of technology. But I believe that small machine playing awesome video games from an analog cassette tape was the trigger of my passion for this amazing and intriguing universe.
Some years later, I got an Intel 80486DX2 PC. Those were the times of MS-DOS, its command-line interpreter, and the dawn of Windows 3.1, a new graphical operating system interface that lowered the barrier and opened this world to a whole new spectrum of people.
From a software perspective, in the early days, that got me into learning and using a wide variety of languages like C/C++, Java, C#, ASP, PHP, Prolog, or even assembly code. Ultimately, I leaned more towards C# and the .NET platform.
Professionally, I’ve always been invested in learning how to bring new useful ideas and innovations into the world, from inception to production. That’s why I’ve always been connected to the world of startups. First, as CTO at Facephi, building a facial biometrics technology from scratch. Later as a co-founder at Deebbler and Wakeando.
My latest adventure, Freegrowth, is the continuation of that challenging but inspiring mission.
My philosophy, vision, and principles.
My main interest in this area is understanding how to design and bring truly innovative and useful software solutions out into the world.
This is something that has always intrigued me. How can we improve the likelihood of fulfilling that purpose with the solutions we develop?
This question made me jump into the study of other fields out of the scope of technology. I needed to gain a more holistic perspective, which led me to design research, innovation, experience & product design, influence, business design & management…and a whole new universe of knowledge.
From a technical standpoint, I’m mostly guided by the Agile philosophy and principles.
If you want to know more about my vision around software systems, you can have a look at this article I wrote some time ago: An elevated vision around software systems.
My approach to software design.
In short, I lean towards evolutionary design as a general philosophy around design, and Domain-Driven Design (DDD) in particular as a more practical framework for building software.
For the extended version of this, you can look at the following article: Learning and evolution as the key drivers of software design.
My approach and preferred tech stack for software development.
I’ve worked on different types of projects, technologies, and platforms throughout my career, both academically and professionally.
From low-level assembly programs to web and desktop applications going through compilers. From Windows to Linux, through MacOS. From domotics to education, going through AI, e-commerce, or social networks.
In the last years, however, I’ve been more focused on distributed web applications.
I’m kind of a polyglot engineer.
This is just a simplistic generalization but, on the back-end, the most common stack I use is based on C#, .NET, Entity Framework, SQL Server/MySQL, Windows, and Azure.
I’ve also worked with C/C++, Java, and PHP based stacks in different scenarios in the past.
And at a more fundamental level, I also built some simpler programs on languages & frameworks such as Grails, Node.js, Objective-C, Visual Basic, Perl, old ASP, and others.
I love learning new tools and technologies. Yet, I’m a firm defender of choosing the most sustainable technology for the problem at hand, finding a healthy balance between learning new tech or staying with what I already know when it solves the problem well enough.
As technical people, restraining ourselves from the excitement of learning new tech is difficult. Still, I always try to keep the focus of my excitement on the problem and not on learning a new trendy technology if it doesn’t help to move the needle forward.
Learning new tech is funny, but solving real problems is even funnier.
My view around testing.
Long story short. I’m not a purist of techniques like TDD, BDD. I don’t believe in them as tools to be always applied to every piece of code we build in a strict sense.
Instead, I prefer to adhere to the core tenet of self-testing code and decide the specific approach to use depending on the scenario at hand.
For a bit longer explanation, you can look at this short post I wrote some time ago: My View Around Software Testing.
From my point of view, design, testing, and development should be integrated with deployment, operations, and maintenance as it reinforces a collaborative team culture towards a shared end of building useful software for users. A culture of shared responsibility.
This contrasts with the traditional perspective of working in silos which, not just in my opinion, led to an unhealthy culture of blaming which in the end did not benefit anybody (including users particularly).
Actually, this philosophy is what the DevOps movement is all about.
I also advocate for the usage of related Agile practices in this respect. This includes things such as Continuous Integration, Continuous Delivery or Logging, and Monitoring.
In the past, I’ve helped teams I’ve worked with to feed on that culture. Also to automate their deployment pipelines. I’ve mostly done it through the following tools and technologies:
- Version Control: Subversion, Git
- Continuous integration & delivery: Jenkins, GoCD, Visual Studio Online
- Build and deployment automation: MSBuild, Grunt, Gulp, Powershell
- And others I might be forgetting at this moment (sorry for that 😅).