Tim Freeman
(408) 774-1298
tim@fungible.com
http://www.fungible.com

Experience: Hewlett Packard, Palo Alto and Cupertino, CA
February 2005 - present: Designed and developed much of the client and server sides of HP Guide as a Python and Apache application on Linux and Windows XP, and ported a suitable piece of it to Vista for inclusion in HP Advisor and distribution on Spring 2007 HP commercial PC's.

Elemental Security, San Mateo, CA
January 2004 - November 2004: Wrote Java code that functions in a Tomcat server running on Linux, with clients in Python and an Oracle 9 database. Source control was done with Perforce and bugs were tracked with Bugzilla.

Implemented high-level inference about the attributes of devices on the network.

Designed and implemented a synchronization primitive designed to prevent deadlocks. Each thread could specify a set of objects to lock. Nested acquisition of locks was prohibited. The primitive was fair to ensure that requests to lock large numbers of objects would not be indefinitely postponed by requests to lock individual objects.

Designed and implemented a general scheme for keeping a write-through cache consistent with the underlying database in the presence of errors. If an error happened while updating the cache, the values from the cache were flushed and then reread from the database when needed. Modified values in the cache had to be kept locked until the corresponding database values were committed.

Designed and implemented a write-behind queue with a write-through cache to eliminate database writes as a bottleneck in one part of the server. Because new updates to the cache were merged with any redundant updates found waiting in the queue, as the queue gets longer there are more opportunities to optimize away redundant writes. For typical usage, the maximum number of possible non-redundant writes was able to fit into memory, so the queue size is bounded and the server can make progress without waiting on the database no matter how slow the database is.

Wrote a watchdog in Python to restart the Tomcat server if it hangs.

Wrote specifications for aspects of the product as part of a process that achieved consensus where there was none before. The specifications drove actual implementations. This is different from the usual scenario where specifications either document obvious decisions or specifications are written after the implementation.

Wrote automated unit tests for my code that were run with every build. Because the build was considered a failure if the unit tests failed, the unit tests were actively maintained and regressions were promptly fixed, as opposed to the usual scenario where broken unit tests tend to get ignored.

Unemployed (by choice), Sunnyvale, CA
July 2002 - January 2004: Started work on a debugger for Objective CAML. It functioned by keeping a history of some or all computation done by the program being debugged and querying the history at debug time. The history linked cause and effect; effects could be followed back to the corresponding causes even when the cause was some computation in another process. This was implemented by encoding pointers to the history in the interprocess communication.

Got it to work with some small programs, but got bogged down when translating their module system. Eventually decided it wasn't a viable product.

Branders.com, Foster City, CA
May 2003 - January 2004: Occasional consulting work. Fixed performance and reliability problems with their web site. Tuned their garbage collector. Changed their database schema to improve the performance of routine queries.

March 2000 - July 2002: Lead programmer for much of the implementation of their present website using Java, Oracle, and Solaris. Their web site sells promotional products. Their web server is based on Blue Martini, which in turn is built on Weblogic. We often used Weblogic directly.

Implemented the version of the image processing software currently used to composite custom logos and text onto product images on their web site. This included digitally processing some logo images to make them look embossed or embroidered and flood fill algorithms used to eliminate solid background colors of a logo before displaying them on the product.

Implemented the initial Java version of their pricing algorithm. Worked as part of a team of varying size, ultimately 4, of programmers maintaining and adding features to their web site.

Wrote a JDBC driver that tracks and reports connections that were opened but never closed and transactions that are never committed. This driver uses the existing JDBC drivers to access the database. Diagnosed an intermittent networking performance problem using tcpdump.

Implemented an interface using XML to a separate Windows NT Yantra server for tracking orders in progress, and then eventually worked with one other programmer in the group to replace Yantra with Java code on the Solaris servers. Also replaced ACT, a Windows NT based system for contact tracking, with Java code on the Solaris servers.

The replacement systems had a framework that cleanly separated page layout specifications from code that dealt with the computational content of the pages. The framework supported:
*generating input fields with suitable default values,
*giving read-only, read-write, or no access to individual fields, depending on the role of the current user,
*updating the database and the session when forms were submitted, if the data changed,
*dealing with multiple users attempting to update the same object concurrently,
*audit trails, and
*error handling, for both individual fields and for the entire update.
The framework is built so that making a field available in the UI enables all this machinery; there are no configuration files. Java.lang.reflect is used to set and fetch fields.

Unemployed (by choice), Sunnyvale, CA
October 1999 - February 2000: Wrote Fungimol, an extensible system for designing atomic-scale objects. The source files have about 45,000 lines of C++. The present system is distributed as RPM's, and works only on Linux. Documentation, source, and binaries are at http://www.fungible.com/fungimol.

Infoseek, Sunnyvale, CA
March 1998 - September 1999, and part time October - December 1999: Maintained the process that automatically generates reports from Infoseek's web server logs. Made it more reliable, dealt with occasional failures that are reported to my pager, wrote new reports in Perl and Python, answered questions from users of the reports. Improved the performance of some Perl code by rewriting parts of it as a new Perl primitive implemented in C++.

Starting in December 1998, I eased some bottlenecks in Infoseek's software process. Re-engineered the way plug-ins are installed in Infoseek's web servers so they can be compiled faster. Worked around bugs in Sun's C++ compiler so now they can use available processors concurrently for compilations. Centralized Infoseek's Makefiles written in GNU make. Compile dependencies between source programs could be inferred from the sources and a few lines of configuration files. Before this, their programmers were hand-crafting long detailed makefiles for each directory of sources.

Working with another consultant, split up some large monolithic chunks of their system into reasonable-sized packages free from cyclic build-time dependencies between packages. This involved making tools that can analyze the dependencies between source files and criticize a proposed arrangement of the source files into packages, and finding an arrangement of files in packages that had meaning to the programmers and could also be made cycle-free without modifying too much source code. Replaced the long hand-crafted makefiles in this part of the system with the short configuration files, as described above.

Starting in July 1998, I worked with some other contractors and employees to allow Infoseek's ad servers to use a new version of SelectCast, a banner ad-selecting technology provided by Aptex. First I urgently stabilizized the operation of the old implementation so that it made more rational decisions about when to forget information about old users, as opposed to filling up its disk with useless information or forgetting almost everybody. When we interfaced the new version of the package (version 2.6.3) to Infoseek's web servers, I wrote Java code that determined what SelectCast should learn about users as they traverse content at Infoseek's site.

Silicon Graphics, Mountain View, CA
July 1997 - February 1998: Wrote plug-ins in C++ for Cosmo Worlds, a Windows NT VRML editor. The purpose of the plug-ins was to test the COM API that supports writing plug-ins, and to provide examples for the documentation.
February 1997 - June 1997: Tested, debugged, and rewrote parts of Cosmo Motion, which was a package that enabled multimedia Java applications on the SGI Unix platform. The package supported applications that could work as either applets under Netscape or with a standalone Java interpreter. The rewritten parts included both Java methods and native C++ methods. Also wrote a test harness in Perl, and acquired test object signing certificates to allow testing under Nestscape Communicator 4.0.

Silicon Graphics, Mountain View, CA
April 1996 - October 1996: Contractor
Tested an interactive television application. Wrote a client-server testing tool in Perl that monitored the set-top boxes. Found and fixed a race condition in some C++ code. Reproduced and diagnosed set-top kernel bugs. An in-house system built on ClearCase was used for source code control.

Thomson Consumer Electronics, Culver City and Mountain View, CA
Worked with OpenTV, an operating system for interactive television. OpenTV is portable to a wide variety of embedded microprocessors. The testing platform is a modified RCA Digital Satellite System (DSS) set top box, a Sun Solaris Unix workstation, and an IBM PC. The CPU in the DSS box is an ST9, an inexpensive 8 bit microprocessor that is proprietary to Thomson.
June 1995 - March 1996: Software Quality Manager
Supervised a team of contract testers creating a regression test suite for OpenTV up to and including the first customer ship of three products based on OpenTV. The test bed used Expect to control starting and stopping the tests. Recommended hiring decisions, trained new hires, allocated work, resolved technical issues so testers could consistently make progress. Wrote Perl scripts to verify that various application program interfaces (API's) are fully documented, to aid installation of OpenTV, and to manage software configuration. Supervised release engineering for the CD-ROM used to distribute the OpenTV development environment for SUN's and IBM PC's.
April 1994 - May 1995: Senior Software Engineer
Created the first installable CD-ROM pre-release version of the OpenTV Software Developer's Kit. Created a bug tracking relational database using Microsoft Access.
In C: Maintained and rewrote large pieces of an instance of the GNU assembler ``as''. Wrote an EEPROM device driver and various utility menus for OpenTV. Created software to test the serial port hardware on the DSS box. Ported the Generic Coverage Tool (GCT) to compute coverage information for OpenTV as it runs. Designed and implemented an exception handling mechanism internal to OpenTV.
In C shell: Wrote scripts to interface GCT with our existing configuration management system.
In Perl: Wrote scripts to automatically generate the table of OpenTV system calls, to semi-automatically edit existing code to use the exception mechanism, and to do global searches and replaces in code while cooperating with our revision control system (RCS).

Work during breaks from school:
Carnegie Mellon University, Pittsburgh, PA
Spring 1992: Taught Compiler Design. The course was based around a semester-long project, building an optimizing compiler that converted a subset of Pascal into MIPS assembly language.
Summers 1986-7: Programmer for the Ergo Group. Maintained and wrote C and Common Lisp code for an object-oriented user interface using Unix and X Windows. A prototype was written in the Common Lisp Object System; the final version used an object-oriented programming system I created for this purpose called ADT-OBJ.

IBM Watson Research Center, Yorktown Heights, NY
September-December 1988: Wrote user interface software for the Scratchpad group in C, Common Lisp, and Scratchpad. Scratchpad (now called Axiom) is a computer algebra system that allows writing strongly typed algorithms operating over arbitrary rings, groups, or other structures. My contribution provided graphics capabilities to Scratchpad code.

General Electric R&D, Schenectady, NY
Summer 1985: Implemented a rewrite-rule based theorem prover for First Order Predicate Calculus on a Symbolics Lisp Machine.

Rensselaer Polytechnic Institute, Troy, NY
Fall 1984: Wrote ``Party'', a Unix C program that uses sockets and Curses to allow up to 12 people logged into one computer to have an interactive conversation.

Aquidneck Data Corporation, Dahlgren, VA
Summers 1981-1984: Wrote DEC VAX VMS utility programs in Fortran. One utility read and wrote tapes formatted for the UYK-19, a militarized ROLM 1606; it was in use for years after I left. Because there was no correct documentation of the algorithm for computing the checksum for the UYK-19 tapes, I deduced the algorithm by observing the behavior of the existing implementation on test data.

Education: Carnegie Mellon University, Pittsburgh, PA
Ph. D. in Computer Science, March 1994
Thesis topic: Refinement Types, a customizable type system for ML, a functional programming language.

Rensselaer Polytechnic Institute, Troy, NY
M. S. in Computer Science, May 1985.
GPA: 3.9 out of 4.0

Mary Washington College, Fredericksburg, VA
B. S. in Mathematics, Physics, and Computer Science, May 1984
GPA in all courses required for the Mathematics and Computer Science majors was 4.0 out of 4.0.
Phi Beta Kappa, Honors in Physics
GPA: 3.7 out of 4.0 (Magna Cum Laude)

Publications: Refinement Types for ML, with Frank Pfenning. Presented at the ACM SIGPLAN 1991 Conference on Programming Language Design and Implementation, pages 268-277.

Overriding Methods Considered Harmful; or ADT-OBJ: Rationale and User's Guide, Ergo report 88-064, Carnegie Mellon University, 1988.

Dagwood: A System for Manipulating Polynomials Given by Straight-Line Programs, with Gregory M. Imirzian, Erich Kaltofen, and Lakshman Yagati. ACM Transactions on Mathematical Software, Vol. 14, No. 3, September 1988, pages 218-240.