If you ask an ITA engineer what they enjoy most about working here, chances are they’ll mention the once-in-a-lifetime opportunity to build software that is transforming a major industry and impacting millions of people every day. The airline industry needs a new computing infrastructure – and ITA engineers are building it.
Our engineers wrestle with computing challenges that are truly daunting. For example, the combinatorics of computing and searching 1028 fares in less than 20 seconds, or the systems challenges of architecting a core airline IT infrastructure that works with tens of thousands of users, talks to hundreds of computing systems and integrates with dozens of partners' systems.
You can have a successful career at ITA Software without knowing anything about the airline or travel industries, or being an expert in any particular language. In fact, our engineers come from a wide range of industries and educational backgrounds. We seek talented engineers with a passion for learning. That’s it.
Solve hard problems
We're the undisputed innovation leader in travel and airline distribution technologies. As an ITAer, you'll tackle and solve some of the most difficult and fascinating problems in computer science and high tech management.
Make an impact
Airline IT is where the modern software industry got its start. ITA Software is one of the first companies in over 40 years to build core airline reservation and pricing systems from the ground up. At ITA, you'll have a rare opportunity to transform one of the world's largest and most complex industries - while building great software.
Be a part of an innovative culture
ITA Software was founded by computer scientists who understand what it takes for great technologists to thrive. We offer an invigorating, high-energy environment that rewards people for taking chances. Like Google, we hire the smartest, most creative people we can find and then we simply let them do things the right way.
Engineers working on our Testing teams accelerate the delivery, and improve the quality, of ITA products. They design and implement build and test infrastructure, create and enforce good engineering practices, and evaluate product quality.
The combinatorics of airfare search can be overwhelming. There are 25,000,000 practical flight combinations for a round-trip between Boston and Los Angeles with one day travel windows. Computing the price for any of those ways is at least NP-hard. Fares are updated five times a day, while seat availability data is updated in real-time at 100Hz. And we must produce a diverse array of the most convenient and inexpensive solutions in ten seconds or less....
ITA engineers carefully choose the best tool for each problem -- then attack it with algorithms that draw on graph theory, parsing, machine learning, databases, optimization, and distributed systems. We code in whatever language is best suited to the task, be it Lisp, C++, Java, Python, Perl, or XSLT.
What does ITA use Lisp for? In a sense, this is the wrong question. Lisp is a programmable programming language, and one of the few languages that can be used for a wide range of applications. At ITA we have projects with vastly different focus, and it's precisely Lisp's versatility that makes it so useful to us.
Our QPX search engine is engineered for speeds that must not be lower than using C and where huge amounts of data must not be bigger than packing them in C structs. Still, QPX is very complicated, and driven by individuals who write large bodies of code. Lisp allows us to define a wide variety of abstractions to manage the complexity, and at the same time we get the speed we want - and our customers demand. Once QPX is compiled, one cannot easily tell the machine code from the machine code compiled from C.
In other projects we manage even larger collections of coded industry knowledge, and there we use all of Lisp's dynamic features to give us the maximum productivity. This allows us to re-implement airline codebases for use outside of their original scope (mainframes) for the first time.
Python is an integral tool at ITA Software, with a large and growing body of code (almost 200,000 lines checked in). Here are some of the ways we use Python today:
ITA has implemented a reliable multicast transport with congestion control in order to deliver multiple streams of data. The server is a mixture of C++ and Python, running on top of Twisted. In addition, some of the data feeds we receive from our customers and partners are handled by network servers running on Twisted.
Managing Complex Servers
Airline seat availability is remarkably complex, and ITA has worked closely with our airline partners to build high-performance servers to compute seat availability. These complex servers aggregate data from public and private data sources, including both streaming and file-based data. Each server requires a unique set of data feeds, and all the data feeds must be monitored to ensure the data arrives when expected and gets loaded as required, all while ensuring system performance is not impacted by these data management tasks. ITA uses Python to automate all of these tasks to make our systems reliable, easy to maintain, and easy to update when customers' needs change.
ITA Software uses a Python application to monitor our heterogeneous production environment that contains hundreds of servers. In order to do this efficiently, we developed our own monitoring framework that enables the requirements to be expressed in configuration rather than in code.
ITA uses agile development methods that require our software is always buildable. In order to do this, we need to be able to perform automated regression tests with every build; but our systems require dynamically changing data for meaningful tests. ITA has built regression frameworks in Python to test both availability and reservations systems. This framework enables us to load test data while we test, and has been built around a configuration language so that it is straightforward to add new test cases as needed.
With the advent of features like generics and typesafe enums in J2SE 5.0, and the maturity of featureful IDEs like Eclipse, the use of Java at ITA Software is growing. Below is information about two groups at ITA who use Java the most.
The web team leverages Java to drastically reduce the amount of effort it takes to write scalable, maintainable, and robust web applications. Because so many rich and mature open-source libraries are available to use, we can get away with writing far less code than we would have to write in a language with fewer libraries. Open-source IDEs eliminate most of the menial aspects of programming. Highly optimized JVMs give us performance comparable to that of handwritten C or C++ code. Finally, the large pool of programmers fluent in the language (and its libraries) makes it easy for most of our new hires to jump right in and be productive.
Java has been our team's work horse for 5+ years. Java allows for an easy, one-stop-shop integration of all our system's components. It's high performance is highlighted in our computationally intensive machine learning acquisition algorithms. Its stability and reliability is essential to our custom database, and its tight integration with our webapp allows us to provide our users with the best possible user experience
The large volume of high quality libraries, both commercial and open source, allow us to focus our efforts on designing new algorithms and architecting a highly reliable platform instead of continuously reimplementing the wheel. The same arguments can be made for the large number of software tools that are easily accessible when developing a large Java project: the Eclipse IDE, debuggers, memory and CPU profilers, unit test frameworks and code analysis tools.
C++ is a great tool for fast, robust, multi-thread, networked applications. ITA has thousands of servers that have been running nonstop for many months, serving countless network connections, some of white run persistently for the lifetime of the process, exchanging terabytes of data. C++ is key to making this work.
While most of ITA's algorithm-intensive code is implemented in high-level languages like Lisp, we use C/C++ to provide system support to our Lisp-based applications where the Common Lisp runtime support is inadequate. For instance, we represent large static datasets as densely packed arrays stored in files. We use C++ to make the mmap() calls and fetch pointers into these mappings for Lisp to access.
When virtual memory address space has been a limitation, we have employed tricks to fetch memory-mapped data by interacting with cooperating processes running on the same machine. We use C/C++ to manage this communication and the associated setup and error handling.
Once in a while, we have had a hard time fooling the Lisp compiler into generating sufficiently fast machine code for a given function. When that happens, we can usually just rewrite the function in C++ and call it from Lisp.
Another very obvious reason we employ C++ is to take advantage of the knowledge and experience in the language our new and future employees may possess. We like to let our programmers do what they do best, using the tools in which they are already the most productive.