Efstathios Chatzikyriakidis

👨‍🔧 Senior Machine Learning Engineer
🧠 Senior Deep Learning Engineer
👨‍💻 Senior Software Engineer
👨‍🎓 Computer Scientist
🌌 Philosopher

Efstathios Chatzikyriakidis received a B.Sc. in Informatics and Communications with a specialization in Software Engineering from the Technological Educational Institute of Central Macedonia, Greece in 2011, and a M.Sc. in Informatics and Communications with a specialization in Computational Intelligence and Digital Media from Aristotle University of Thessaloniki (AUTH), Greece in 2019.

With over a decade of experience in the software development industry, Efstathios has developed professional expertise in creating both enterprise non-AI and AI software systems. He has held several key roles including Machine Learning Engineer, Senior Software Engineer, Software Quality Assurance Engineer, Software Quality Assurance Tester, Software Engineer, and Lead Full Stack Software Engineer in various companies.

Currently, Efstathios serves as a Senior Machine Learning Engineer for Medoid AI, where he has successfully delivered numerous AI projects to clients worldwide in both cloud and on-premise environments. He has demonstrated strong leadership skills as a team leader, overseeing the development of various AI systems while also providing training and mentorship to team members on software engineering and machine learning technologies.

Efstathios is experienced in system design, productionalization, MLOps, and cloud-native technologies, which equip him to help companies effectively build and deploy their machine learning models into production for scalable, high-available and performant AI solutions. His research interests include Machine Learning, Deep Learning, Natural Language Processing, and Computational Intelligence in general.

Outside of work, Efstathios enjoys traveling, spending time with family, and reading Ancient Greek Philosophy. He is fluent in English and the native Greek language and is available for consultation on Machine Learning, Software Engineering, and Cloud Native Technologies.

First Experiences

My first contact with an electronic computer was in 1993. Of course, this was an IBM PC which used the 8088 microprocessor and whose operating system was the MS-DOS. In the beginning, I was not interested much for the reason that my free time was taken up by the then popular game consoles.

If I remember correctly, from then until now I have been the proud owner of the following consoles: Game Boy, Sega Mega Drive, SNES, Sega Saturn, Nintendo 64, Sega Dreamcast, PlayStation, and PlayStation 2. Of course, the fact that I currently do not possess any of them is admirable. Some, certainly got ruined, others were sold and others were lost. However, my love for computer games is still there.

When I started to deal with electronic computers (starting with the IBM PC) a little more consciously, I began to wonder about the way they operate. Of course, my question was answered several years later. I must first say that I played for some time on the command line of MS-DOS with various internal or external commands to edit files or directories and manage different input / output devices.

Sometimes I ran games and loaded drivers for devices that I wished to support. Also, I created batch scripts to automate tasks and sometimes used the programming languages Pascal and Basic for educational purposes.

In 1995, when Microsoft released the operating system Windows 95, I started using it with much enthusiasm because it had an original graphic interface which had many differences from the well-known terminal MS-DOS and was more friendly.

For some relatively long time I worked on visual programming languages using Microsoft Visual Basic, Borland C++, but again for educational purposes.

Hardware Management & Troubleshooting

Along with programming in Visual Basic and Pascal, I started working on the technical management of computers hardware. So, having experimented some times with various PCs and, after I burned some microprocessors, I was able to manage their hardware. Then, I started working on the different hardware characteristics of PCs, with the formatting of disks, disks partitioning, using the BIOS, setting a drive as Master or Slave, install / uninstall hardware (e.g. memory cards, microprocessors, expansion cards) onto the central processing unit, the from scratch assembly and disassembly of a PC, operating system installation, proper management of the interior of a PC for better performance and addressing hardware problems.

Installing & Managing Computer Networks

Along with the planning and management of PC hardware, I was also involved with PC networks, mainly LANs. I have set up some simple LANs with the Windows family operating systems and GNU/Linux mainly for gaming. Also, I have in the past been involved with the implementation of a Samba File Server and two Web Servers with Windows (IIS) and GNU/Linux (Apache) respectively. Interestingly enough, I had to use the filesystem NFS to enable file sharing between GNU/Linux operating systems.

Computer Science & Architecture

Until then, I did not know how PCs operated; I can say that while I was playing beautiful melodies with them as if they were musical instruments, I did not know their way of operation inside. So, I slowly began to grow my general knowledge about Informatics and more specifically around the architecture of PCs, with a view to understanding how they work.

Once I understood the Von Neumann architecture, which introduced the stored-program computer, I started gradually making it into the microcosm of PCs. I had to know the binary numbering system, the binary logic, the Boolean algebra, the principles of digital circuits, the internal representation, storage and information management by PCs, how the various components of a PC function and the basic principles of structured programming.

So, once I understood how a PC works (if one wishes to understand how a PC works, he should start from older systems because they were simpler than today’s ones), more specifically how programs run and the internal management of information (especially the way the microprocessor and the memory works, and their cooperation in the execution of programs), I had for the first time a desire to write programs with a low-level programming language.

Low-Level & Assembly

And it so happened that after a very short time I was ready to write programs at a low level since most high level languages were of no use to me as I could talk to the PC directly in its own language.

I worked mostly with the Intel 8086 microprocessor and based on that I wrote some programs in its assembly language. Sometime later I was involved with the Intel 8088 in BGC-8088 development platform. I remember I wrote a program that played melodies using the internal speaker of the system, and one which operated on the light emitting diodes of the motherboard. It’s a nice thing to write programs at a low level. I wish all the computer scientists to experience it even for once.

Of course, then I found from my experience that a PC does not have any intelligence at all. You know, periodically, people appeared who reported that computers do have very little intelligence. But those who have seriously done some research on the subject, and are not fanciful enough, know well that computers have no conscious intelligence at all and are entirely driven by the computer programmers.

Operating Systems & Compilers

Another branch of the Computer Science in which I was involved was the development and designing of operating systems.

So, after much study of the principles regarding operating systems design, I understood numerous issues regarding the operating systems, such as processes, threads, kernel and shell, file system, interrupts and signals, resource management, system calls, memory map, environment switching, system stack, system cache and virtual memory, users and authentication, rights and security, time-sharing, multitasking and multiprocessing, services and ports, scheduling and algorithms, interprocess communication, priorities, mutual exclusion, critical sections, semaphores and flags, exclusive locks, deadlocks, memory paging and segmentation, device drivers, sockets, data coding, and more.

It is worth mentioning that I’ve worked enough in the past with the development and design of compilers with Flex and GNU Bison. Specifically, I have dealt with the development of lexical analyzers, syntax analyzers, semantic analyzers and code generators. Also, I was involved at programming level with the Linux kernel (which alongside the GNU system make up the GNU/Linux operating system). The fact that the Linux kernel is Free Software and its source code is accessible by anyone gave me the opportunity to understand how the different parts of a kernel work.

Embedded Systems

I have already seen most of these in practice, while I have analyzed some others only in theory. Of course, I had to deal with the programming language C as most of the operating systems programming is done primarily in it (it is the best language for systems programming). I must confess that this sector is the most exciting one.

Of course, my love for the operating systems did not stop but was extended later as I worked on the theory and practice of embedded systems programming. A platform on which I’ve worked a lot and I have wrote C++ code for various applications of embedded systems is the Arduino (open source platform for physical computing).

User Applications

Another branch in which I was involved and interested enough was to develop software applications. For this reason, I had to deal with programming languages such as C++, Python and C#. After that, I started learning data structures and algorithms, visual programming and other technologies that always need as auxiliary tools. But what plays a more important role is the technological knowledge that anyone involved in software development should hold.

For this reason, until now I have been dealing with software engineering all the while trying to get more and better knowledge on the issues of analysis and development systems. In terms of software engineering, I have dealt with many interesting guidelines it proposes, i.e., programming standards, design patterns (GoF), design principles (SOLID), prototypes, UML diagrams, documentation systems and development methodologies (Agile, Scrum). It is worth mentioning that I also dealt with developing large-scale maintainable and evolable applications with n-tier architecture.

Software Quality Assurance

Another branch in which I worked is the Quality Assurance of various client applications (mobile and desktop applications) and web services, primarily with Functional Testing (Black-Box) as a QA Engineer, using tools like JMeter, SoapUI, and Unit Testing (White-Box) as a Software Engineer using tools like NUnit, Rhino Mocks. Also, I was involved in writing, running or correcting / optimizing various Test Cases using Microsoft Testing Manager. Also, Regression / Smoke / Integration Testing methodologies are also known to me.

Dynamic Web Applications

Furthermore, my relationship with the Internet and web applications is also hot. I think my interest for programming web applications is firmly rooted. Initially, I started creating only static websites using HTML and then did some formatting of HTML documents with CSS. Later, I noticed how large applications require dynamic data management. So I had to deal with relational databases and dynamic web programming languages.

Towards this, I worked on the theory of relational databases and especially with the query language SQL, so I can design efficient and accurate databases. Initially, I was using the Microsoft Access for the database implementation and the programming language ASP for the website development, which is also a product of Microsoft.

Later on, I tried MySQL to implement the database and PHP as a dynamic programming language. I must confess that after some experience in both environments, the development of web applications with MySQL and PHP is better, more efficient and safer.

Of course, my knowledge expanded and so I learned XHTML (either as Transitional or Strict) because it’s better to implement a web application. Also, it seemed very useful to use XML, which had to deal with for various reasons. It was also interesting learning the XSL to format XML documents.

Sometimes, I look back and I realize how much the World Wide Web has changed (mostly the front-end with the various JavaScript web frameworks and the back-end with the NoSQL database management systems) and I am happy that I have catch up that change. So, nowadays I use start-of-the-art web frameworks for building either RESTful APIs or thin and maintainable clients for various web applications.

Current Interests & The End

After all these years dealing with so many fields in my personal long journey I have decided to dedicate more time and try to specialize in Software Engineering and Artificial Intelligence. Lastly, I have decided to stop maintaining this tech-story. So, I hope you get to know me better after you read it. Be well my friends and have a happy life!