What kind of developer am I?
I am a developer who believes in standards and best practices. Need a date/time format? ISO 8601. Storing a date/time? Use UTC. Country codes? Use ISO 3166-1. Language codes? Use RFC 5646 or ISO 639-1. All too often I've seem systems developed with a blindness to standards. For example, an advertising platform that used “E” as a code for the English language. I believe that if there's a standard for something, and it costs little to nothing to observe and use that standard, you should do so.
I like elegant solutions. I like to fall asleep trying to think up some solution to a sticky technical problem and wake up in the morning with a fresh perspective and, if I'm lucky, a solution to the problem. Waking up excited to get to work is so satisfying. It lets me know that I love what I'm doing and I'm probably doing a good job. I like working with a group of people (Product, Marketing, QA, Project Management, Performance, Operations) who enjoy doing their job and doing it well. I love it when we're all working toward a common goal and support each other in whatever ways we can.
When I'm happy at work, it's usually on a team that loves what they're doing, but also has a sense of humor and lightness of spirit about it. Just because what we're going might be critical doesn't mean that we can't have fun doing it. I've also worked with developers who don't seem to enjoy the actual act of programming and I wonder why they're doing it.
Computer programming has been a passion of mine since I got my first PC, an Apple //c. I taught myself BASIC with the help of my older brother David. I spent many, many hours doing things like copying hundreds of lines of codes from magazines into the Apple. Usually there would be at least one typo and you'd sit there staring at things, trying to find the mistake.
In my late teens, I got my first Windows PC and I taught myself Visual Basic and continued to program with that on my own through Visual Basic 6 in the late ’90s.
This would lead to my first real programming job at PacifiCorp, in their mapping division. They were in the process of digitizing the physical maps of all their physical assets and structures. I worked as a contractor to develop a Microsoft Access database with a complete UI for maintaining the data regarding which maps had been converted, their status, etc.
With that vaguely map-related work under my belt, it was off to VISION* Solutions, a GIS mapping service provider that used Oracle databases to store geographic information. I developed a custom mapping solution using Visual Basic 6 and VISION* software to allow the U.S.P.S. to map their network facilities. VISION* Solutions was acquired by Autodesk in April, 1999, shortly before I left.
Galileo International, Cendant TDS, Travelport
Uniglobe & Galileo e-Cruise
One of the first projects I worked on was creating an online cruise booking engine for a customer called Uniglobe called Cruise Control. We interfaced with the mainframe-hosted cruise and tour application LeisureShopper using structured data and a new XML-based interface code-named Falcon, soon to become the real XML Select product. This was in the relatively early days of the web and we did some fun things like implement our own SQL Server-backed session state store.
The Uniglobe cruise booking engine became just the second online cruise booking website in the world and won a Gomez WebStar award . Which was a thing. Really, trust me.
We took that code and adapted it for Galileo e-Cruise, an agent-facing cruise booking engine.
Next up was several years taking over maintenance and enhancement on ViewTrip.com, Galileo's itinerary viewing website, similar to Amadeus' CheckMyTrip and Worldspan's MyTripAndMore. The first several years working on this was in Classic ASP. This is where I cut my teeth with XPath and XSLT. We received itinerary (PNR) data as XML via XML Select, massaged it with some server-side code and ran it through XSLT to generate an e-Ticket. However, the code to display the basic itinerary was a bunch of procedural VBScript with very few comments. Because there is a lot of variability in how agencies populate data in a PNR, and that we dealt with slightly different formats of data from the Galileo and Apollo cores, things could get a bit tricky.
ViewTrip.com 2005 Rewrite
In 2005, it was decided to rewrite ViewTrip.com completely using ASP.NET and C# using Visual Studio 2003. It was great to be able to get a fresh start with the code, however, I needed to replicate in XSLT all the logic that had been in basically uncommented VBScript in the old ViewTrip.com website. That was a challenge. I really built up an in-depth experience with XSLT and XPath, creating very complex templates to deal with a multitude of variable data. I remember often wondering things like, “Why do we not display lines of data that start with an asterisk?” I ultimately learned a heck of a lot about XSLT and many tricks for achieving the desired results despite its limitations. It wasn't quite the right time in web development to switch completely to table-less layout, not just because we were presenting more-or-less tabular data.
We initially intended to interact with the mainframe GDS cores via a newish SOAP web service interface. However, we encountered massive performance and availability issues when we made that cutover. It took quite a bit of low-level investigation, logging, profiling and tuning to figure out the exact nature of the problem and ultimate solution. That was a serious period of stress for the team and included in-person 24-hour live monitoring of the website. We ultimately figured out a cause and a solution that worked well and I subsequently learned a lot about IIS web site and application pool tuning, as well as caching and performance techniques relating to both the C# code and basic HTTP optimization of resources. I also really enjoyed learning more about CSS and the challenges of internationalization and localization as the site supported over 20 languages.
Other fun challenges during the project included adding integration with various other internal and external web services and data sources, such as historical itinerary data, reservation-related content that was not stored on the host GDSs, etc.
After working on ViewTrip as lead “everything” (I wore many hats), I was moved to the Universal Desktop project, a completely new point-of-sale application being developed for Flight Centre in Australia. It was a radical leap forward in terms of reimagining agents' workflows and making the process simpler for inexperienced agents. It was a completely new UI for booking travel and almost completely eschewed the traditional “green screen” terminal interface in favor of a bloated WPF GUI.
However, I was unhappy working as a cog in the machine of this large project. I felt I had too little influence among so many developers, and the large amount of code became unwieldy. It was also being developed at the same time that another team was developing Universal API, a “next-generation” SOAP API into multiple GDS systems. The combined growing pains of both of those projects and the friction involved were almost too much to bear. We worked several weekends over the development period, trying to get the defect count down.
Ultimately, I left that project before it was entirely completed. But I did learn about MVVM, WPF (XAML) and some dependency inversion / inversion of control (IoC) during this project.
Smartpoint 1G/1V ( 1G for the Galileo GDS host system and 1V for the Apollo GDS host system ) is another new point-of-sale application for use by travel agents. It also used WPF (XAML) for the UI, but used WPF in a much more light-weight way. It kept the traditional “green screen” terminal interface front and center while enhancing it with additional capabilities. This kept experienced agents happy, in that they could continue to keep their fingers on the keyboard and use the much faster (and cryptic) terminal commands instead of moving a mouse all over the screen. But it also offered simpler GUI interfaces for performing basic agent tasks like checking availability, shopping for fares, etc. I learned a lot about regular expressions in this job, as they were used to parse the cryptic terminal commands into parameters that were then sent to the GDS hosts in structured XML in order to receive more parseable data and be able to make smart decisions on how to process that data.
I was much happier working on this project, which was based on work originally done by a team in Barcelona. I had fun working with the team in Denver as well as the Barcelona team. It was a product I believed in and felt I could really contribute to it in a meaningfully way. Wish I'd spent more time with that team.
Travelport Marketplace was envisioned as a sort of app store for Travelport-produced products and third-party products designed to work in the Travelport ecosystem, such as Smartpoint plugins. It would showcase these apps and enable purchase and licensing of these applications, serving as both a marketing and sales opportunity for Travelport and its partners.
This was my first full ASP.NET MVC website and we used Zurb Foundation (an alternative to Bootstrap) for a responsive UI framework. It has since been migrated to Bootstrap. It has both a customer-facing portion as well as an admin portal for Travelport and third-party developers to administer their product offerings. The admin site was recently redesigned using AngularJS v1.2. I've recently been pulled back in to do some work on Marketplace and I always enjoy the opportunity to do so. It was great fun working again with a team in Barcelona, of which I was team lead.
ViewTrip.com Next Gen
Unfortunately, my time was cut short on Smartpoint and Marketplace and I moved on to work on a project called ViewTrip Next Gen (VTNG). This was to be a reimagining of ViewTrip as a modern, responsive website with advanced features like the option to purchase ancillary services. Again, my time on this project was short and I moved on to my next project.
Traveler UI (Universal Profile UI)
Traveler UI is a traveler-, agent- and agency-facing mobile-responsive website designed to allow travel agencies’ customer to maintain their own traveler profile data. Our initial customer was to be American Express Travel, if I recall correctly. We worked this project in an agile manner and worked rapidly to deliver a working, usable website in a very short amount of time. I lead a team of three onsite contractors and another Travelport developer located in Australia.
We used Travelport Universal Profile (a web service) to store traveler profile data under an agency's hierarchy. Having a close working relationship with the developers and lead on that team really helped both of us. They could get a better idea of how a consumer of their services would like it to work, and I had direct input into the interface that my team would be consuming. I'm proud of the work I did on Traveler UI, however it has languished, largely unused due to the product and marketing teams not knowing what to do with it. At this point, it mainly serves as an admin portal for importing and exporting profile data and for migrating and syncing traveler profile data from and to the host GDSs and Universal Profile.
I really enjoyed using Knockout to create the site. It's not the latest and greatest anymore. Angular had just come out when we started development of this website and I was reluctant to jump right into Angular without it having been tried and tested a bit more in the real world. Otherwise, that would have been my choice of framework.
Travelport Rebooking Module (TPrbm), Emirates Accessibility
In the summer of 2015 I had the opportunity to help the TPrbm team work on improving the accessibility of a rebooking website for Emirates, the airline based in Dubai, U.A.E. Because of DOT mandates springing from the Air Carrier Access Act of 1986, airlines' systems must be accessible. Emirates was working with a third-party company to make their own websites accessible, but we had to implement the same new look and feel and accessibility on our side, in the Travelport Rebooking Module, a website that Emirates uses to allow passengers to rebook their flights.
Fare Control Manager (Search Control Console)
Fare Control Manager is a system whereby agencies can dynamically mark airlines' fares up or down by fixed or percentage amounts based on a variety of matching rules. This is being provided primarily because agencies often have target goals for bookings on specific airlines. If they meet those goals, it can be mean more money in their pocket than the cost of discounting some flights for travelers and eating that cost.
Because Travelport already had a similar system that works with our e-Pricing, shopping and fare systems, it was decided to take that system, Search Control Console, and adapt it to create rules for Fare Control Manager. The learning curve on Search Control Console was steep — not because it was particularly complicated code, but because of heavy technical debt. It was initially built by an intern, from what I understand, and had grown considerably since then, with little apparent understanding of basic coding best practices and patterns. The UI code was doing a lot of the business logic work, as well as making direct database calls.
In light of those shortcomings, I drove adoption of standard software development practices (SOLID design principles) as well as the complete reorganization of the project to move as much logic as possible out of the UI layer and into a services layer. I also moved all database access out of any other projects and into a dedicated data access layer. Along with those changes was an effort I put into place to implement IoC/DI to more loosely couple the layers. Add to that an effort to bring the code more in line with Travelport coding standards (similar to Microsoft's Framework Design Guildelines) and the Microsoft Application Architecture Guide.
This refactoring effort was rather large and extensive. Introducing these changes to a team of relatively inexperienced .NET developers required tact and sensitivity. After all, these were people new to .NET and they were just repeating the patterns that they already saw in the code. When entering unfamiliar territory, it's very easy to fall into that.
All company names, trademarks, registered trademarks, service marks, trade names, trade dress, product names and logos appearing on the site are the property of their respective owners.