As an IT consultant, I have been constantly learning and updating my technology stack in the past 20+ years. Some of the major shifts were:

  • 1995: Started using Delphi 1.0 to build Client/Server applications. Delphi 1.0 was such a great Windows front end drag and drop GUI development tool that it beat Microsoft Visual Basic in light year at that time. The backbone Object Pascal language was very elegant on the Object Oriented concepts. It eliminated the complicated yet very hard to used features of C++ like multiple inheritance and direct memory access by pointers that as a young developer I learned and fully mastered it in a few months. One of the most fun things here was I implemented a tree structure report component that allowed end users to design their reports by dragging and dropping data elements on the screen, defining groups and sub groups, formatting the report layout, then finally printing it to the printers.
    Until today I still believe Delphi deserve to be one of the best computer languages. The only thing it lacked was a runtime and garbage collection like Java. Obviously we know the original architects and designers of Delphi jumped to Microsoft and invented C# around year 2000.
  • 1999 - 2000: Switch from Microsoft technology COM/DCOM stack to Java. At that time I was in Singapore and working for a Swedish founded Internet consulting company called Icon Medialab Asia. They started a project using WebLogic + EJB 2 for a Hong Kong client. I remembered I bought a book on EJB 1.1 and learned Java language and EJB from scratch. To be honest, that book was so dry and painful to read because it basically was just the EJB Spec itself. Surprisingly I actually mastered both quickly because Java so similar to Delphi, EJB 1.1 was basically Stateless Session Bean in COM/COM+ plus Stateful Session Bean and Data Bean. As we know, Data Bean was a disaster that it was quickly abandoned by the industry. It was so slow and hard to code that we had to implement course grained value objects and dirty flags everywhere in order to make the performance acceptable. Unfortunately I still saw them in a few commercial products pushed by both BEA (WebLogic) and IBM (WebSphere) even many years later. There was one project we detected it was making 17 round trips to save data back to the database in one of IBM products that we had to tell IBM to fix the codes and improve performances.
  • 2003 - 2013: Java, various Java framework, Service Oriented Architecture, SOAP web services, MDBS, Spring, Hibernate, EJB3, JSF, and more Java! In these years I did numerous different sizes projects for financial institutions in Canada with a few of them I am actually very proud of. One of them was a niche ETL tool which can extract mainframe COBOL files, XML files, fixed length or comma delimited CSV files, and load them into a Sybase IQ data warehouse by using XML configuration file and multithreads. One thread to read the file and put records into a ConcurrentLinkedQueue, a few threads to verify the data integrity, a few threads to assemble the records into the files that will load into different tables, and load them by calling bulk load command of destination database or data warehouse. In one instance, it broke one hierarchical COBOL file into 26 relation tables and loaded billions of lines of data in this file less than 12 hours overnight within bank's production implementation window.
    Struts 2 was one of my most favorite frameworks. It was simple and contained the AOP (Aspect Oriented Programming) concepts in its UI framework. I used the Struts 2 AOP concept to build a very complicated roles based privilege control system where I can enable/disable, show/hide component or a section of HTML screen in my web application with just a few hundred lines of codes and some rule configurations in the database. I still couldn't like the fact that JSF (Java Server Face) became part of J2EE spec and got the popularity over Struts 2. JSF 1 was so buggy that I was part of Enterprise Architecture team in a major Canadian bank where we supposed to build standard components for the whole bank but spend quite a lot of time to fix bugs of reference implementation. JSF 2 was much stable and easier to code with annotations, but it was still slow based on its 6 phases life cycle.
    Overall Java tends to be over engineered until Spring and Hibernate showed up. I started to use both of them back in 2006, and switched to EJB 3 and JPA for some banks because they were part of J2EE spec. However I really like the AOP concept I learned in Spring very much that I utilized this idea almost in all my projects since then.
  • 2013 - 2021: Angular SPA front end + Cordova Mobile app + SpringBoot based Micro Services. One day I was recovering after a major project in the office, I saw one of my developers was learning Angular 1.x. I had been always wanted to develop a mobile app for fun. Then I said to myself, why not learn Angular and use it to build my very first mobile app? At that time my daughter started to play OPDL (Ontario Player Development League) and the coach wanted some simple stats like number of passes, shots, goals, and players' time on the field. It took me couple of months hard work on the weekends and evenings to develop Soccer Stats that focuses on the performances and statistics of whole team. This app was a little complex and requires ideally up to 3 people to capture the players' moves at same time by using mobile phone or tablet on the field or watching match replay on TV. Then I developed my second app Soccer Player to capture my daugter's performance individually after she transferred to another club and only I felt it was really helpful to analyze her data and help her to understand her games. Gradually she became the brain and the distributor of whole team to control the rhythm of defending and then attacking of the team.

There were so many interesting stories in my almost 30 years career. As I am getting older, from time to time some of them just emerged from the memory suddenly and I felt it is fun to share them. I will add them here next time.