[comp.edu] Qualified? or Dreaming?

john@nmt.edu (John Shipman) (07/12/90)

+--
| I went to a highly rated (top 5) university, yet all of the real
| fundamentals were only found in electives.  It really surprised me
| that you could get a BSCS without learning about compilers or operating
| systems.  And more than just a few students missed these fundamentals.
+--

Is this generally true?  Nevin Liber (nevin@igloo.scum.com)
wrote the above in misc.jobs.contract, on a thread about
whether a college degree is worthwhile.  I cross-posted to
comp.edu because I'd like to know what is required
elsewhere.

At New Mexico Tech, nobody gets a BS in CS without going
through both the compiler class and the OS class; it's been
this way for twenty years.  And these aren't just lecture
classes, either.  Every student implements a whole compiler
and a whole operating system from scratch, working in a team
with one or two other students.
-- 
John Shipman/Computer Science Department/New Mexico Tech, Socorro, NM 87801
(505)835-5301; john@jupiter.nmt.edu

kitten@wheaties.ai.mit.edu (Patrick Juola) (07/12/90)

In article <1990Jul11.233006.17884@nmt.edu> john@nmt.edu (John Shipman) writes:
>+--  (nevin@igloo.scum.com)
>| I went to a highly rated (top 5) university, yet all of the real
>| fundamentals were only found in electives.  It really surprised me
>| that you could get a BSCS without learning about compilers or operating
>| systems.  And more than just a few students missed these fundamentals.
>+--
>Is this generally true? 
>
>At New Mexico Tech, nobody gets a BS in CS without going
>through both the compiler class and the OS class

Well, at Johns Hopkins U *when I attended (1984-1987)* there was a
joint EE/CS department.  I managed to graduate without having taken
either compilers or OS.  My understanding is that the degree requirements
for the new CS program are somewhat stricter....

I also don't consider myself particularly damaged by failure to take
the OS or compiler classes.  The textbooks and source code are out there;
I've used them to teach myself compiler theory.  In my ideal universe,
computer science would be taught as a branch of the math department
and everyone would know up to and including topology by the time they
left....

	- kitten
Patrick Juola	kitten@ai.mit.edu	juola@boulder.colorado.edu

dlt@lando.la.locus.com (Dan Taylor) (07/14/90)

In article <1990Jul11.233006.17884@nmt.edu> john@nmt.edu (John Shipman) writes:
>+--
>| I went to a highly rated (top 5) university, yet all of the real
>| fundamentals were only found in electives.  It really surprised me
>| that you could get a BSCS without learning about compilers or operating
>| systems.  And more than just a few students missed these fundamentals.
>+--
>
>Is this generally true?  Nevin Liber (nevin@igloo.scum.com)
>wrote the above in misc.jobs.contract, on a thread about
>whether a college degree is worthwhile.  I cross-posted to
>comp.edu because I'd like to know what is required
>elsewhere.
>
>At New Mexico Tech, nobody gets a BS in CS without going
>through both the compiler class and the OS class; it's been
>this way for twenty years.  And these aren't just lecture
>classes, either.  Every student implements a whole compiler
>and a whole operating system from scratch, working in a team
>with one or two other students.
>-- 
>John Shipman/Computer Science Department/New Mexico Tech, Socorro, NM 87801
>(505)835-5301; john@jupiter.nmt.edu

I'm very aware that is IS true.  I have interviewed several prospective
employees, with degrees, that have NEVER had exposure to operating
systems, computer architectures (much less the associated assembly languages),
compilers, or any language that is commonly used in a production environment.
Several of these were from the University of California at Irvine.  Please
note the location, other UC campuses may have different requirements.

This is often the result of a clique running the CS department, that is
heavily involved in AI, or some other heavily-researched, but not yet
in common use, branch of CS.  As an aside, for the edu folks, CS is not
the only descipline with this problem.  UCI's English department is
equally (in)famous for being narrow-minded.  Employers and students need
to research the tendencies of the schools in their locale to determine
which ones offer courses applicable to their requirements.

As John pointed out NM Tech has a more "real-world" approach.  Cal Poly
is similar.  Any others to offer?

Dan Taylor
* dlt@locus.com * Locus Computing Corp is in no way responsible for
*               * my statements.  Complain to me.

jfh@rpp386.cactus.org (John F. Haugh II) (07/16/90)

In article <1990Jul11.233006.17884@nmt.edu> john@nmt.edu (John Shipman) writes:
>At New Mexico Tech, nobody gets a BS in CS without going
>through both the compiler class and the OS class; it's been
>this way for twenty years.  And these aren't just lecture
>classes, either.  Every student implements a whole compiler
>and a whole operating system from scratch, working in a team
>with one or two other students.

At The University of New Orleans everyone was required to take
a theory course in languages, operating systems and so on, but
there were few, if any, courses where students were required
to actually write useful code.  A suggestion to one of my
professors to implement a PL/1 compiler as a project for a
special studies course was met with incredible disinterest.

Many universities that I am aware of take a dim view at students
working together on large projects.  The fear being that the
students would cheat or slack off.  The only course I had which
produced something "useful" was an advanced O/S course taught
by Jim "Nothead" Thomas.  The course was excellent from a learning
experience, but a dismal failure as the O/S we wrote refused to
do much of anything.  Jim Thomas can be found someplace in New
Mexico [ UNM I think ... ] working on Yet Another Degree.
-- 
John F. Haugh II                             UUCP: ...!cs.utexas.edu!rpp386!jfh
Ma Bell: (512) 832-8832                           Domain: jfh@rpp386.cactus.org

                                            Proud Pilot of RS/6000 Serial #1472

greg@uts.amdahl.com (Greg Bullough) (07/17/90)

In article <18454@rpp386.cactus.org> jfh@rpp386.cactus.org (John F. Haugh II) writes:
>In article <1990Jul11.233006.17884@nmt.edu> john@nmt.edu (John Shipman) writes:
>>                  Every student implements a whole compiler
>>and a whole operating system from scratch, working in a team
>>with one or two other students.
>
>At The University of New Orleans everyone was required to take
>a theory course in languages, operating systems and so on...

At Forkover University, every student has to build his/her own
system from scratch. They have to actually mine and process the
silicon themselves. Then they design the circuits, do the layout
work, produce the masks, and make the chips. Then it's on to the
microscopes, to wire 'em into dual-inline packages. That done,
they have to lay out the printed circuit boards, etch them, and
solder the chips in. Of course, that includes the positive and
negative power supplies of various voltages.

Where the greatest number of students flunk out, not surprisingly,
is in the machine shop. Turning those bearings for the hard disks is
pretty fine work.

Well, once they've got that done, they're ready for their first
OS course. That's always taken during the Winter term, so they
have to walk the mile or so from the dorms in the snow. Uphill.
Both ways.   :-)

Greg

hawley@icot32.icot.or.jp (David John Hawley) (07/18/90)

In article <790S02pfb89A01@amdahl.uts.amdahl.com> greg@amdahl.uts.amdahl.com (Greg Bullough) writes:
>At Forkover University, every student has to build his/her own
>system from scratch. They have to actually mine and process the
>silicon themselves. Then they design the circuits, do the layout
...

One of the more interesting "warm-up" exercises given in my OpSys class
was the problem of bringing up your-favourite-dream-system given the
stuck-on-a-desert-island-with-a-big-box-of-hardware-and-a-nuclear-power-plant-
but-absolutely-no-software.

Oh I forgot to say, it was a 'paper' exercise :-)
Further optional courses did give you the opportunity of developing
bits and pieces of the same.

steve@grian.cps.altadena.ca.us (Steve Mitchell) (07/23/90)

>At New Mexico Tech, nobody gets a BS in CS without going
>through both the compiler class and the OS class; it's been
>this way for twenty years.  And these aren't just lecture
>classes, either.  Every student implements a whole compiler
>and a whole operating system from scratch, working in a team
>with one or two other students.
>-- 
>John Shipman/Computer Science Department/New Mexico Tech, Socorro, NM 87801
>(505)835-5301; john@jupiter.nmt.edu

Most of the CS people I've known have this background, but that does
not mean they've learned how to write useful software in general.  A
few years ago I had a new CS grad working for me, and while she may
have been able to write a compiler she had a great deal of trouble
writing simple simulation code, even when the algorithms were
provided.  And forget about having her take a sketch of a solution and
derive the algorithm.  _VERY_FEW_ programming jobs in industry involve
writing compilers or operating systems: most (at least in my
experience) involve using computers to solve various real-world
problems.  It would be much more useful if CS departments turned out
grads with general problem solving and programming skills, rather than
aiming them at jobs developing system software at computer companies.
-- 
		-  Steve Mitchell	steve@cps.altadena.ca.us
					grian!steve@elroy.jpl.nasa.gov
					ames!elroy!grian!steve
"God is licht, an in him there is nae mirkness ava." -- 1 John 1:5

matloff@gandalf.Berkeley.EDU (Norman Matloff) (07/24/90)

In article <1990Jul23.060010.20406@grian.cps.altadena.ca.us> steve@grian.cps.altadena.ca.us (Steve Mitchell) writes:

%derive the algorithm.  _VERY_FEW_ programming jobs in industry involve
%writing compilers or operating systems: most (at least in my
%experience) involve using computers to solve various real-world
%problems.  It would be much more useful if CS departments turned out
%grads with general problem solving and programming skills, rather than
%aiming them at jobs developing system software at computer companies.

This is really shortsighted.  Very few people *write* an OS, but almost
everyone *uses* OSs.  A good knowledge of how an OS works is essential
to making good use of one.

   Norm

john@nmt.edu (John Shipman) (07/24/90)

Steve Mitchell (steve@grian.cps.altadena.ca.us) writes:
+--
| _VERY_FEW_ programming jobs in industry involve writing
| compilers or operating systems: most (at least in my
| experience) involve using computers to solve various real-world
| problems.  It would be much more useful if CS departments turned out
| grads with general problem solving and programming skills, rather than
| aiming them at jobs developing system software at computer companies.
+--

I agree with you, general skills are what we aim for.  The
point of requiring a large compiler project and a large
op sys project here is not simply to try train people for
compiler and op sys jobs, however.

There is a tendency for new programmers to think that once
they have written a 200-line program, they understand how
to program.  But while it is possible to get 200 lines of
``spaghetti code'' working, such bad habits will be a real
obstacle to bringing up a 2,000-line program, not to mention
a 20,000-line program.

In my opinion, much of the value of these large projects is
in getting people used to programming-in-the-large.  Simply
assigning projects in compilers or operating systems is not
enough; as educators, I feel it is important to use these
projects as vehicles for convincing people of the need for
clarity, modularity and top-down design.
-- 
John Shipman/Computer Science Department/New Mexico Tech/Socorro, NM 87801
(505)835-5301; john@jupiter.nmt.edu

bzs@world.std.com (Barry Shein) (07/24/90)

From: steve@grian.cps.altadena.ca.us (Steve Mitchell)
>_VERY_FEW_ programming jobs in industry involve
>writing compilers or operating systems: most (at least in my
>experience) involve using computers to solve various real-world
>problems.  It would be much more useful if CS departments turned out
>grads with general problem solving and programming skills, rather than
>aiming them at jobs developing system software at computer companies.

The issues of compilers and operating systems are directly relateable
to many other problems.

Every time you sit down and try to put a little interpreter front-end
on your program you're facing a lexical analysis and parsing problem.
Some of the more interesting graphics programs (e.g. those used to
inexpensively, but realistically, generate foliage) are generated by
grammars expressed in BNF's (a compiler topic.)

Go ahead, write a little program that verifies and classifies a typed
in number as correct integer or float or e-notation etc. It's a
parsing problem, or at least very simply solved once you understand
such things. Is that really out of the realm of "reality"?

As a matter of fact, any time you sit down to do a transformation of
F(INPUT)->OUTPUT (kinda rare, huh?) where INPUT can be bounded by a
function and the transformation must be rigorous you're basically
writing a compiler. Who cares if it's a textual program being input or
a signal stream (didja know that some of the better work on automatic
EKG analysis used parsing approaches to the problem?) or whatever is
generating the input.

And finite state automatas show up everywhere, not just compilers.
Any network protocol is written down as a DFA, no real difference,
nothing unique about compilers.

Operating systems courses generally teach about concurrency problems
(among other things), something that comes up constantly in data
bases.

There's no difference, at a conceptual level, between OS ideas like
critical sections and atomic writes, concurrency control, multi-stage
commits etc. And deadly embrace is a critical issue in any shared
resource, nothing special about OS's other than that they are careful
to bring the issue up. Avoidance, detection, correction, recovery,
much more than just OS issues.

I think you're very wrong. That you ran into an individual that wasn't
very good at what you needed hardly proves the point. You singled out
some of the most useful courses in a CS program.
-- 
        -Barry Shein

Software Tool & Die    | {xylogics,uunet}!world!bzs | bzs@world.std.com
Purveyors to the Trade | Voice: 617-739-0202        | Login: 617-739-WRLD

conrad@wucs1.wustl.edu (H. Conrad Cunningham) (07/24/90)

In article <37714@ucbvax.BERKELEY.EDU> matloff@heather.ucdavis.edu (Norm Matloff) writes:
>In article <1990Jul23.060010.20406@grian.cps.altadena.ca.us> steve@grian.cps.altadena.ca.us (Steve Mitchell) writes:
>
>%derive the algorithm.  _VERY_FEW_ programming jobs in industry involve
>%writing compilers or operating systems: most (at least in my
>%experience) involve using computers to solve various real-world
>%problems.  It would be much more useful if CS departments turned out
>%grads with general problem solving and programming skills, rather than
>%aiming them at jobs developing system software at computer companies.
>
>This is really shortsighted.  Very few people *write* an OS, but almost
>everyone *uses* OSs.  A good knowledge of how an OS works is essential
>to making good use of one.

Almost everyone uses compilers, networks, text editors, word
processors, database systems, windowing systems, electronic mail, etc., etc.
The list grows longer every year.  Using the argument above we should
have a required course on every piece of technology that we use.
That's ridiculous and "really shortsighted"! I will, of course, agree
that computer science graduates need a sophisticated working
knowledge of the major pieces of technology that they use.  But that
should not require our CS curricula to read like an inventory of the
currently important technological artifacts. 

CS curricula should be focussed on principles rather than specific
technologies.  Emphasis should be given to concepts which cut across
several areas of technology, instead of arbitrarily breaking CS into
many technology-oriented subfields.  Instead of core a course on "operating
systems" why not a course on "concurrent programming".  Such a course
could unify important concurrency-related concepts drawn from
operating systems, programming languages, database systems, networks,
algorithmics, computer architecture, computation theory, etc.
Couldn't such a course be more useful as well as conceptually cleaner.

-Conrad
-------------------------------------------------------------------------------
H. Conrad Cunningham              |  Title:     Assistant Professor
Dept. of Computer & Info. Science |  Telephone: (601) 232-5358    Fax: 232-7010
The University of Mississippi     |  Internet:  cunningham@cs.olemiss.edu
302 Weir Hall                     |--------------------------------------------
University, MS  38677             |  Home:      Rt. 1, Box 81, Oxford, MS 38655
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Dr. H. Conrad Cunningham          |  Title:     Assistant Professor
Dept. of Computer & Info. Science |  Telephone: (601) 232-5358    Fax: 232-7010
The University of Mississippi     |  Internet:  cunningham@cs.olemiss.edu

amanda@mermaid.intercon.com (Amanda Walker) (07/25/90)

In article <BZS.90Jul23214608@world.std.com>, bzs@world.std.com (Barry Shein)
writes:
> The issues of compilers and operating systems are directly relateable
> to many other problems.

Indeed.  I'd say that the most useful skills I brought to the commercial
world were ones that many people classify as "theoretical," including:

 - Automata theory
 - Code optimization techniques (since most commercial compilers couldn't
	optimize their way out of a paper bag)
 - Algorithms and analysis of their behavior over the time domain
 - Concurrency issues
 - Denotational and axiomatic semantics

and, most importantly,

 - A tendency to read CS theory books and journals for fun

This kind of broad background can be extremely useful, even in "boring"
applications.  I once worked with someone who didn't know that different
sorting algorithms had different performance characteristics--he ended up
using an insertion sort on a several-megabyte database, and it ended up
taking 11 hours per run :-).  He had an excellent handle on the mechanics
of coding, but he didn't have the conceptual background to apply it as
effectively as he could.  That particular experience seemed to make an
impression, though :-), and I have a feeling he pays more attention to
"theoretical" issues these days...

--
Amanda Walker <amanda@intercon.com>
InterCon Systems Corporation

matloff@winnie.Berkeley.EDU (Norman Matloff) (07/25/90)

In article <1990Jul24.140502.17990@cec1.wustl.edu> conrad@wucs1.wustl.edu (H. Conrad Cunningham) writes:
>In article <37714@ucbvax.BERKELEY.EDU> matloff@heather.ucdavis.edu (Norm Matloff) writes:
>>In article <1990Jul23.060010.20406@grian.cps.altadena.ca.us> steve@grian.cps.altadena.ca.us (Steve Mitchell) writes:

%>%derive the algorithm.  _VERY_FEW_ programming jobs in industry involve
%>%writing compilers or operating systems: most (at least in my
%>%experience) involve using computers to solve various real-world
%>%problems.  It would be much more useful if CS departments turned out
%>%grads with general problem solving and programming skills, rather than
%>%aiming them at jobs developing system software at computer companies.

>>This is really shortsighted.  Very few people *write* an OS, but almost
>>everyone *uses* OSs.  A good knowledge of how an OS works is essential
>>to making good use of one.

^Almost everyone uses compilers, networks, text editors, word
^processors, database systems, windowing systems, electronic mail, etc., etc.
^The list grows longer every year.  Using the argument above we should
^have a required course on every piece of technology that we use.

Nope.  Those are different.  When I said that people "use" OSs above,
I meant that their programs make calls to OS services (either directly, 
or via the compiler inserting code to do so).  That is why people need to 
know what an OS does  --  so that they can make good use of those services.

By contrast, rather few people write programs to call on the "services"
of a word processor. :-)

>should not require our CS curricula to read like an inventory of the
>currently important technological artifacts. 

An OS is not a "technological artifact."  As I said, almost every
program (except for "embedded applications") makes OS calls.  I didn't
say that the students should become proficient at a particular OS, by
the way.  Just general principles, though references should be made to
specific systems so as to make the concepts concrete.

And those general OS principles *are* general  --  they do apply to
many of those applications you mention.

>Instead of core a course on "operating
>systems" why not a course on "concurrent programming".  

There's a lot more to OS than concurrency.

BTW, why have a CS major at all?  I'm not being snide here.  If you
really feel that universities should not be "technology schools"
(which I agree), why not go all the way, and not have a CS major at
all?  Let the companies themselves provide training courses.

   Norm

rick@hanauma.stanford.edu (Richard Ottolini) (07/25/90)

In article <37743@ucbvax.BERKELEY.EDU> matloff@heather.ucdavis.edu (Norm Matloff) writes:
>BTW, why have a CS major at all?  I'm not being snide here.  If you
>really feel that universities should not be "technology schools"
>(which I agree), why not go all the way, and not have a CS major at
>all?  Let the companies themselves provide training courses.

Stanford and MIT agree with that.  MIT only added a CS major in the 1980s
and Stanford still doesn't have an undergraduate degree.  Programming was
considered a vocational skill better learned before college.  Both universities
do offer graduate degrees on the more theoretical side.

( CS does not have a monopoly on lopsidedness.  I've met "electrical engineers"
who've never soldered together a circuit and geophysicists who could tell the
difference between limestone and sandstone.  Excess emphasis on theory
and specialization. )

conrad@wucs1.wustl.edu (H. Conrad Cunningham) (07/26/90)

In article <37743@ucbvax.BERKELEY.EDU> matloff@heather.ucdavis.edu (Norm Matloff) writes:
>In article <1990Jul24.140502.17990@cec1.wustl.edu> conrad@wucs1.wustl.edu (H. Conrad Cunningham) writes:

>An OS is not a "technological artifact."  As I said, almost every
>program (except for "embedded applications") makes OS calls.  I didn't
>say that the students should become proficient at a particular OS, by
>the way.  Just general principles, though references should be made to
>specific systems so as to make the concepts concrete.
>
>And those general OS principles *are* general  --  they do apply to
>many of those applications you mention.

I do not deny the importance of the practical side of computer science
education -- either for those students who go into industry or for
those who go directly to graduate school.  "Book learnin'" needs to be
supplemented by some "down-to-earth" experience for the concepts to be
fully appreciated.  Also it is unnecessarily elitist to ignore the
reality that CS graduates need to get jobs.  

Neither do I deny the importance of a working knowledge of operating
systems.  (I have made my living for many more years as a "systems
programmer" than as a teacher/researcher.)  But I could probably make
an equally strong case for the importance of the study of programming
language design.  Perhaps others could argue strongly for their pet
technologies or subfields.

CS programs need to be organized around the significant concepts of
computing (whatever those may be).  Case studies, laboratory
exercises, individual/group projects, co-op work experiences, etc., 
should illustrate and provide practical experience in use of these 
concepts.  My primary complaint against the current approach is the
unnecessary fragmentation of CS into subfields organized around
technologies.  We need more computing generalists, not more
specialists in arcane subfields who can't talk to each other or can't
recognize the same problem when it appears in different trappings.

For several years I worked in the aerospace industry.  I often was
involved in interviewing new CS graduates.  We wanted to hire people
for "software engineering" positions to design real-time embedded
control systems for aircraft and support tools needed to assist in this
work.  I didn't expect to find many with experience or specific
knowledge of our applications, but I hoped to find open-minded
professionals who could apply a strong general knowledge of computing
to challenging applications.  Unfortunately, many of the stronger
grads that I saw were only interested in writing operating systems or
compilers or in being "knowledge engineers".  Many seemed to feel that
you couldn't be a real computer scientist unless you were involved in
such activity.  The weaker grads I saw were little more than Pascal,
Cobol, C, or Pascal hackers.  

>
>> Instead of core a course on "operating systems" why not a course on
>>"concurrent programming".   
>
>There's a lot more to OS than concurrency.
>

I agree and didn't mean to imply that.  Perhaps the  course should be
entitled "control programming" or "coordinated computation".  The
focus should be on the process of developing such programs, not on
the products themselves (e.g., on an operating system, programming
language runtime, robot control system, etc.).   Perhaps the actual
content would not be much different from what you have in mind for an
operating systems course. 

>BTW, why have a CS major at all? 

Before we answer this question perhaps we should define what CS is.
...

Some people would argue that the whole idea of a "major" or of a
"field" is wrong-headed--that it introduces an arbitrary and unhealthy
compartmentalization of knowledge.

-- Conrad Cunningham, University of Mississippi CIS Dept.

dgil@pa.reuter.COM (Dave Gillett) (07/29/90)

In <1990Jul24.140502.17990@cec1.wustl.edu> conrad@wucs1.wustl.edu (H. Conrad Cunningham) writes:

>CS curricula should be focussed on principles rather than specific
>technologies.  Emphasis should be given to concepts which cut across
>several areas of technology, instead of arbitrarily breaking CS into
>many technology-oriented subfields.  Instead of core a course on "operating
>systems" why not a course on "concurrent programming".  Such a course
>could unify important concurrency-related concepts drawn from
>operating systems, programming languages, database systems, networks,
>algorithmics, computer architecture, computation theory, etc.
>Couldn't such a course be more useful as well as conceptually cleaner.

Hear, hear!  The CS grads I've known who "didn't work out" in professional
employment had taken all the courses, but didn't seem to have abstracted the
concepts, and so couldn't see how to apply them to the job at hand.

On the other hand, it's amazing how many people manage to get a CS degree
without any clear understanding of how memory, registers, and pointers
interact at a practical level.  I hesitate to call such people "professional
programmers", but when that's what they get paid for and they have CS degrees,
how's an employer supposed to tell the difference?

                                             Dave
 

windley@ucdavis.edu (Phil Windley) (07/30/90)

In article <279@saxony.pa.reuter.COM> dgil@pa.reuter.COM (Dave Gillett) writes:

   Hear, hear!  The CS grads I've known who "didn't work out" in professional
   employment had taken all the courses, but didn't seem to have abstracted the
   concepts, and so couldn't see how to apply them to the job at hand.

Having taught introductory classes for freshmen for several years, I can
testify that its much easier to NOT teach abstraction.  I did and it cost
me a lot of office hours.  Most of the students were not at all comfortable
with abstraction to any degree (these werer people who had, for the most
part, tested out of at least one calculus class).  Any time I got abstract,
I had an office full of students wailing and crying about how this was "so
hard!"   

I'll continue to teach abstraction because I think its one of the core
principles of the field, but I can see why some introductory courses are
simple "please program a blackjack game" kinds of programming classes.

--
Phil Windley                          |  windley@iris.ucdavis.edu
Robotics Research Lab                 |  ucbvax!ucdavis!iris!windley
University of California, Davis       |