Software Engineer
Join a team of extraordinary engineers working on challenging problems that directly benefit millions of travelers. ITA uses the best open source software to build our industry-leading systems. We seek independent people who will define and build new capabilities for our systems, working closely with airlines, travel agents and other customers. We have multiple positions open for talented people with experience in Lisp, C++, Python or Java.
Responsibilities: • Designing and implementing algorithms to make our search and pricing systems more capable and more efficient.
• Abstracting configuration languages from ever-changing customer rules.
• Designing and implementing fast server code to compute information needed by the Search system.
• Interpreting business rules, new taxes, regulations, etc into code.
• Developing and maintaining messaging layers to reliably process real-time data feeds from legacy computing systems.
Qualifications: • Bachelor's degree in computer science or other technical field or equivalent work experience, plus five years professional programming track record.
Special Knowledge/Skills Required: • Demonstrated practical design and implementation experience with some of the following technologies: web (server-side Java, DHTML, JavaScript), XML (XSLT, XML Schema, Relax NG, web services), databases (Oracle, mySQL), device drivers, compilers, or operating systems.
• Able to read and understand complex domain-specific documents, and design and implement systems based on those documents.
• Demonstrate exceptional programming skills and be willing to code full time; i.e., candidate will take responsibility for implementing finished products based on designs developed.
• Should be highly self-directed, a strong individual contributor, and a strong team player.
How to Apply
If you are interested in this position, please solve one of the puzzles below and send your solution with your resume to us via this link.
Puzzles:
Please select and solve one of the puzzles below to give us an idea of your problem-solving ability and coding style. Unless otherwise specified, you may use any freely-available language you like. Puzzles submitted in C++, Lisp, Python, Java or Perl will be reviewed most promptly, because those are the languages we use every day; if you choose another language, it may take us longer. No pseudo-code, please! In your submission email, along with your source code, please include your program's final answer; a brief (1-2 paragraph) description of your approach and any trade-offs you made (say, for generality, speed, or ease of implementation); and instructions on how to test your program. In order to ensure that your puzzle solution does not get caught in our mail filters, you should zip the source code file(s) and name the archive "Programming_Puzzle_Submission-NameofthePuzzleyouSolved" e.g. "Programming_Puzzle_Submission-RollYourOwnChatServer.zip".
| BitVector Genealogy |
The BitVectors are an ancient and immortal race of 10,000, each with a 10,000 bit genome. The race evolved from a single individual by the following process: 9,999 times a BitVector chosen at random from amongst the population was cloned using an error-prone process that replicates each bit of the genome with 80% fidelity (any particular bit is flipped from parent to child 20% of the time, independent of other bits).
Write a program to guess the reproductive history of BitVectors from their genetic material. The randomly-ordered file bitvectors-genes.data.gz contains a 10,000 bit line for each individual. Your program's output should be, for each input line, the 0-based line number of that individual's parent, or -1 if it is the progenitor. Balance performance against probability of mistakes as you see fit.
To help you test your program, here is a much smaller 500 x 500 input dataset: bitvectors-genes.data.small.gz, along with its solution file: bitvectors-parents.data.small.
|
| Instant Search |
Write a Java web application which provides "instant search" over properties listed in the National Register of Historic Places. Rather than waiting for the user to press a submit button, your application will dynamically update search results as input is typed. We provide the file nrhp.xml.gz, which contains selected information from the register's database.
Database The key component of your server-side application is an efficient, in-memory data structure for looking up properties (written in pure Java). A good solution may take several minutes to load, but can answer a query in well under 0.1 ms on a modern PC. (Note that a sequential search of all properties is probably too slow!) An input matches a property if it is found at any position within that property's names, address, or city+state. Matches are case-insensitive, and consider only the characters A-Z and 0-9, e.g. the input "mainst" matches "200 S Main St" and "red" matches "Lakeshore Dr." Note that the server's JVM will be configured with 1024M maximum heap space. Please conform to the interfaces specified in nrhp.jar when creating your database.
Servlet Your servlet should accept an input string as the request parameter to a GET request. Results should include the information for a pre-configured number of properties (e.g. 10), the total number of matches which exist in the database, and the time taken by your search algorithm. Your servlet should be stateless, ie. not depend on any per-user session information. Paginate your additional results as a bonus!
Client Your web page should access the servlet using JavaScript's XMLHttpRequest object. As the user types, your interface should repeatedly refine the list of search results without refreshing the page.
Please submit a WAR file, configuration instructions, your source code, and any comments on your approach. Your application will be tested with Tomcat on Sun's 64-bit J2SE and a recent version of Firefox.
Resources XMLHttpRequest, StAX, Apache Tomcat, Mozilla Firefox, Eclipse
|
| Optimal Ghost |
In the game of Ghost, two players take turns building up an English word from left to right. Each player adds one letter per turn. The goal is to not complete the spelling of a word: if you add a letter that completes a word (of 4+ letters), or if you add a letter that produces a string that cannot be extended into a word, you lose. (Bluffing plays and "challenges" may be ignored for the purpose of this puzzle.)
Write a program that allows a user to play Ghost against the computer.
The computer should play optimally given the following dictionary: WORD.LST. Allow the human to play first. If the computer thinks it will win, it should play randomly among all its winning moves; if the computer thinks it will lose, it should play so as to extend the game as long as possible (choosing randomly among choices that force the maximal game length).
Your program should be written as a Java web application that provides a basic GUI for a human to play against the optimal computer player from inside the Firefox browser. The web page should access a server using JavaScript's XMLHttpRequest object, and display the results using DOM manipulation.
Please submit your source code, configuration instructions, and any comments on your approach. Please also include a WAR file that we can test against Tomcat 5.5.x on Sun's J2SE 6.0. Finally, in your submission email, answer this question: if the human starts the game with 'n', and the computer plays according to the strategy above, what unique word will complete the human's victory?
|
| Roll Your Own Chat Server |
Implement a simple standalone TCP-based chat server, using the following protocol:
The server responds to all commands with either: OK<CRLF>
or, when an error occurred, with: ERROR <reason><CRLF>
<CRLF> indicates the bytes '\r\n'.
Upon connecting to the server, the client sends: LOGIN <username><CRLF>
Clients can create new chatrooms or join existing chatrooms (chatrooms begin with the character '#') by doing: JOIN #<chatroom><CRLF>
Clients can leave chatrooms by sending: PART #<chatroom><CRLF>
Clients can be in multiple chatrooms at once.
Clients can send a message to a chatroom: MSG #<chatroom> <message-text><CRLF>
Clients can send a message to another user: MSG <username> <message-text><CRLF>
When a message is sent to a chatroom the user is in, the server sends to the appropriate client: GOTROOMMSG <sender> #<chatroom> <message-text><CRLF>
or if the message is sent directly from one user to another: GOTUSERMSG <sender> <message-text><CRLF>
Finally, the client can log off by sending: LOGOUT<CRLF>
Here's a transcript of a sample session where a user named "alice" joins a chatroom called #news after connecting. C indicates the line was sent by the client, S indicates it was sent by the server (end of line indicates CRLF was sent): C: LOGIN alice
S: OK
C: JOIN #news
S: OK
C: MSG #news hi everyone
S: GOTROOMMSG bob #news nothing much happened after that
S: OK
S: GOTROOMMSG alice #news hi everyone
S: GOTUSERMSG carol hi alice, where've you been?
C: MSG carol on vacation
S: OK
C: LOGOUT
<server closes connection>
When implementing the server, aim for scalability and robustness. (Many submissions fail due to lack of robustness!) Your submission should include a description of the steps you took towards those two goals. Keep in mind that the client may be buggy, or even malicious. For example, if a client connects to the server and sends an infinite stream of the byte 'X' with no line break, the server should deal with this case gracefully. Please do not use an existing networking framework (e.g., Twisted or asyncore for Python, ACE for C++, etc.) to implement the server. The server should support running on Linux. |
| The O'Hare Affair |
Objective You want to meet a friend at O'Hare airport at noon and return home the same day. Given a date and an origin airport, find the pair of nonstop flights that gets you to Chicago and home again on that date, minimizing your total time away from home, subject to the constraint that you are at O'Hare at noon.
Details Your program, which must be written in Java, will work by scraping our http://matrix.itasoftware.com website. Create an account on that site called "candidate_YourName" for your program to use. (Please include your name and email address in your registration in case we need to contact you.) Your program should accept two command-line inputs as follows:
java -jar OHareAffair.jar YYYY-MM-DD airportCode
The program should log in to matrix.itasoftware.com with your candidate_YourName account and pose a round-trip query between the given airportCode and O'Hare (ORD), limited to nonstop flights only, using BOS as the sales city, with appropriate date and time constraints. The program should then scan the resulting solution set for solutions that meet the objective specified above. No more than 15 http requests should be made of matrix.itasoftware.com per invocation. Finally, details of the three shortest solutions (breaking ties arbitrarily) should be written out in human-readable form to the console.
For example, for a traveler from Baltimore on July 4th, your program might be invoked as follows:
java -jar OHareAffair.jar 2006-07-04 BWI
Sample output:
Travelling round-trip from BWI to ORD on 2006-07-04:
Trip length: 6:21
Outbound: American Airlines Flight AA3991 (10:03a-11:04a) Return: United Airlines Flight UA1236 (1:30p-4:24p)
Trip length: 6:39
Outbound: United Airlines Flight UA641 (9:45a-10:47a)
Return: United Airlines Flight UA1236 (1:30p-4:24p)
Trip length: 6:54
Outbound: American Airlines Flight AA3991 (10:03a-11:04a) Return: American Airlines Flight AA4009 (2:09p-4:57p)
Strive to make your code clean and robust, and to report errors
cleanly. Be sure to include your source, any necessary libraries,
and instructions on how to run it.
|
| Word Rectangle |
Write a program to find the largest possible rectangle of letters such that every row forms a word (reading left to right) and every column forms a word (reading top to bottom). Words should appear in this dictionary: WORD.LST (1.66MB). Heuristic solutions that may not always produce a provably optimal rectangle will be accepted: seek a reasonable tradeoff of efficiency and optimality.
|
Don't see the perfect job for you? Sign up for our RSS feed.
|