| CK's Projects |
| Employment History, Goals, Rants and Raves |
|
School School I'm a self-taught programmer. I wrote my first computer program in the summer of 1968, when I attended a summer school (between my junior and senior years in high school) at St. Paul's School in Concord, NH. The math department had a Teletype hooked up to the time-sharing system at Dartmouth College. Kemeny and Kurtz had just developed BASIC, and I wrote a few 10 to 20 line programs in that language. I don't remember exactly what they did, but I believe they were standard beginning programming exercises like calculating square roots with the approximation technique. I then went to Dartmouth for my undergraduate degree (class of 1973). My degree was in Visual Studies, but I took a computer graphics course (using small flat-bed pen plotters) and wrote some longer programs (a couple hundred lines, again in BASIC). I hadn't yet figured out subroutines, so the programs were (in retrospect) not exactly good examples of programming. I got my Masters in Graphic Design from Yale in 1975. My thesis was a program (with accompanying verbiage) written in BASIC on some early DEC PDP (PDP-10?) that rotated a three-dimension (wire-frame) drawing of a "2". I hand-digitized the "2" on graph paper and entered the coordinates in a DATA statement. I choose the "2" because I had hopes of getting a job at the PBS station (Channel 2) in Boston. A designer named Chris Pullman worked there, and I liked his work I also wrote some Fortran (using punch cards) on a mainframe to drive a drum pen plotter. Early Work I came out to the Bay Area and worked as a freelance graphic designer for a few years (textbooks, annual reports, letterheads, etc). I didn't do any programming until someone saw my thesis, which got me a job teaching half time at San Francisco State. I taught an introductory course in programming and a computer graphics course. For the graphics course, we used BASIC and a home-grown set of routines to drive Tektronix tubes (the storage kind, where you had to "flash" the screen to clear it before drawing the next picture). I wrote a 3D subroutine package on top of those Tektronix routines. I also taught myself PASCAL (and greatly enjoyed having procedures and local variables). I also did some messing around with UNIX (a little shell and "C" programming, but very little). Started reading Kernighan and Ritchie books. Bought an Apple ] [. Wrote Apple PASCAL. Got a contract from a publisher for a computer graphics textbook, but never finished the book. From there I got my first job in Silicon Valley, at an Olivetti facility down near Apple's offices in Cupertino. My job was writing a subroutine library based on a proto-standard called GKS (Graphical Kernel System) in PASCAL (with their own compiler). This ran on a proprietary operating system that was being developed at that facility. My next job was at Televideo, which had started out making terminals but was getting into the personal computer (Z-80/8080 based) business. They were using a new chip for graphics, the 7220. I started out writing demonstration programs, but that evolved into a drawing program which they tried to sell. Someone else wrote the driver for the chip, and I worked with higher level routines (DrawLine, etc.) provided by the driver. This program was written in PASCAL-MT on the CPM-80 operating system. I then went to work at Digital Research. They were primarily an operating system company (CPM-80/86), but a group was formed to do graphics programs (the Macintosh had just come out). The group created the GEM graphical environment, and I wrote a drawing program, a slide-maker, and a desktop publishing program. This was my first experience leading a team (albeit small) of 2-4 people. I hadn't figured out source code control or real dependency analysis yet (so I don't know exactly how we managed it, but the group was small). My responsibilities were primarily technical, but I did some interviewing and hiring recommendations. We started out writing in PASCAL, but switched to C (using DRI's compilers). GEM was fast, even on 8086's (unlike the first generations of Windows, which had started to appear at that time). While it wasn't really multitasking, it did the job. Too bad we (like many other companies) got obliterated by Microsoft, first in the graphics business and then in the operating system business. I was at Digital Research for almost 6 years. Got a PC clone. Gave the Apple ] [ away. Recent Work After Digital Research, I went to a startup named Pillar (since bought by Hyperion, which has subsequently merged with Arbor). I went there because I wanted to learn more about this object-oriented stuff. We wrote a budgeting program in Object Pascal on the Mac. Eventually we ported it to C++ and Windows 3.1. We kept the C++ version on both Mac and Windows platforms, which I really enjoyed. Something about cross-platform (as long as there aren't too many platforms!) keeps you honest by making you abstract correctly (and helps root out compiler idiosyncrasies). The program was layered, with an operating system layer, a framework layer, a framework extensions layer (more application-specific than the framework, but not the application itself) and the application on top. At this point I started writing code that I wouldn't mind showing people today. I went from being a team leader at DRI back to being an individual contributor at Pillar. That didn't bother me. My goal is to have a successful product, where I define success as [a] code that I'm not ashamed to show someone, and [b] making money for the company (and me!). Whether I'm a team lead or senior programmer doesn't matter as long as I feel I'm doing the right thing to get a good product out the door. At Pillar I was responsible for the "database" code. We used C-Tree, which provides source code. I spent a lot of time digging into their source and stripping out the stuff we didn't need, and becoming acquainted with their internal file formats (and our usage of those formats). Because of this, I ended up being the customer data "patcher" - if a customer's "database" got corrupted I'd go in with a hex editor to patch around the bad data to recover as much of their uncorrupted data as I could. I also worked on the memory manager. When we ported to Windows, we determined that the native memory manager would not suffice because it was limited (at that time) to 8K handles. This would not have been enough for our application, so we designed a handle-based memory manager that we ended up using on both the Mac and Windows. It actually sped up the Mac application, because we used pages, which localized the compaction (rather than using having to compact the whole Mac heap when more memory was needed). I was also responsible for the distribution/consolidation feature. The Pillar product could replicate (or "distribute") subsets of data (specified by user security lists), which could be edited without affecting the "main" set of data. These changes could then be "consolidated" back into the main set of data. After almost six years at Pillar/Hyperion, I went to another startup named Whitelight Systems. Our primary product was an OLAP server and client library, with a GUI client that used the client library. The server and client library ran on both Solaris and Windows NT, while the GUI client ran only on NT/95/98. All these products are in C++. At WhiteLight I started out working on the calculation engine that took the multi-dimensional queries, calculated and returned the results. I'm also responsible for the connections to the databases - we use both Sybase ct-lib interface and the Microsoft ODBC interface. I also put together a nightly build and regression-test system for the server and client library, written in Bourne Shell and Perl. I ended up being responsible for those nightly runs, which at first consisted of getting people who broke the code line to fix it. Once the builds settled down, then I put the test suite in place (which has grown over the years as others added tests). These nightly runs also detected problems in the databases (databases down, inconsistencies between different databases, etc.) We currently run the regressions against Oracle, DB2, Sybase AdaptiveServer Enterprise, Sybase IQ, MS SQL Server, Informix, RedBrick and Teradata. I spent the first four years working on the server and client library. In the last couple of years I've worked on whatever needed it most. For a number of months I was involved with the QA effort. On some of the releases QA was more of a bottleneck than development, so we decided to work on that for a while. I cleaned up scripts written in 4Test, the scripting language for the Silk program (www.segue.com). These scripts do the keyboard and mouse events that would normally have to be done by a human. The basic problem with the 4Test scripts as they stood was that they do not take timing problems into account. E.g., since the GUI client communicates across a network, there can be latency, so there is no guarantee that a dialog will show up in a certain time interval. Two other developers and myself spent a number of months getting the scripts much cleaner. There are over 2200 test cases in the scripts, and they hardly ever ran to completion before (and would take over a day to run when they did). We got the runs to better than 90% completion, and down to 10 hours so the full suite could be run overnight. There's still lots of work to be done here (lots of duplicated code to be cleaned up, non-determinism to be removed, etc.) but a QA automation manager took over so I could go back to engineering (though I do "consult" with QA whenever they need me). After that I fixed bugs for a few months in the Windows client program (an MFC client named "Workbench"), as well as adding some features. I've also spent a few months fixing bugs in the Web product ("iApplicationServer"), working in Java, JavaScript, HTML and Actuate Basic. I used XML/SOAP to set up users in the Actuate system. I still fixed bugs and adding features on the server, since I was very familiar with that code (after working on it for six years). Whiteliight was acquired by SymphonyRPM. At the end of my stint at Whitelight/SymphonyRPM, I was working on a SOAP client-library interface to the Whitelight multi-dimensional server, written in Java. After six years at Whitelight/SymphonyRPM, I moved to PeopleSoft. Here I've been working on tools to make my development environment more useful. PeopleSoft's development processes are very different from any other company I've worked at. I'm currently involved with specifying and designing the next version of the Budgeting application that PeopleSoft sells. Other work I've also done volunteer work for my kid's middle school and the Oakland Museum Women's Board. Here I used Perl, Visual Basic and English (most of the work was writing instructions for other people). See my web site at http://home.pacbell.net/c_keith (note the underscore between the 'c' and the 'k') for code and documentation examples. Goals, Likes and Dislikes What do I like to do? I know I don't ever want to be director/V.P. level. I know I'm a very good programmer and a good designer, and I work well with people. I want to continue to learn new technologies and techniques, so that I have a larger set of tools to pick from when I'm presented with a task. I'm not proprietary about my code (the more eyes the better, usually), and I don't like it when others are proprietary. I'll allow anyone to fix bugs in my code (and redesign it if it will help). I've got a good (e.g., realistic) picture of how long things really take - I actually prefer to specify, then design, then schedule stuff if at all possible. And I'm a firm believer (after many product cycles) in the 1/3 specify, 1/3 code and 1/3 debug cycle (you're going to do it whether you want to or not... you may do the debugging after you ship the product, but you're going to do it sometime...). I've written requirements and specifications. I've helped our technical support reproduce and debug customer problems. I've reviewed manuals. I wish I could have taught courses about our product (I still like to teach), but that was deemed outside my responsibility. I've never done marketing or sales (and have no plans to). What do I want to work on? I don't have a preference as long as the three "P"s are in place: a good Product, a Process that allows us to get the product out the door, and People that I can work with, learn from and teach (if necessary). I'm not a hacker or an academic; I want to get a product out, but not at the cost of a badly designed product that will be impossible to maintain (of course, nothing is ever perfect - I'm willing and able to make compromises as long as they're not too distasteful). I'd like to learn some new languages like PHP, or perhaps work on Palm Pilot software, or even get back into graphics programming (games?). I also like doing tools (it's very seductive when you can put together a shell script to automate a task). I've also thought about doing a web-based Lotus Notes type of product (with versioning). I'm open to many different types of work, but probably not compilers or operating systems. My weaknesses? I do grumble occasionally. A few times I've followed the wrong decision and had to dump work I'd done. For example, we (as a group) had decided to use Rogue Wave heap code to do our own memory manager at WhiteLight (given our experience at Pillar). I never got it working very well, and it turned out we didn't really need it. I lost a couple of weeks on that one. I may be too skeptical about new technologies, but I don't think so. I'd rather be reasonably confident that new tools are going to make me more (not less) productive. For example, I'm actually still a little reserved about Java (though it has its place). Given my C++ roots, I don't know what I'd do without cleanup objects (stack-based so the destructors are called when the method exits, either normally or abnormally). The group at Whitelight that used Java also had problems with different platforms ("write once, debug everywhere"), and even different JVM versions on the same platform. I sometimes try to automate too soon. I'm a madman for shell scripts to automate tasks, but sometimes end up spending more time on the script than I would have just doing the task. I still think, however, it pays off in the end, in terms of (1) learning, (2) automation and (3) a record of what really works (or at least worked at one time - believe the code, not the documentation). I like to produce software that helps people do their jobs better, and makes a me a decent living (having realized, after 3.5 startups, that the odds of living off stock options are not very good). I like to think of myself as a craftsman. |
| Home |
|
Last Modified: Wednesday, October 12, 2005 |