Job opportunity: Software engineer at the University of Washington
We wish to hire multiple programmers who will help to design and implement the next
generation of programming tools.
This is a permanent, full-time position, not a short-term contract job.
To apply and for additional details, see the official job posting at:
You enjoy the energetic, exciting, and flexible environment of a
cutting-edge university research group. You are capable of thinking
abstractly, architecting new designs, and building, testing and deploying
systems, and you also find it rewarding to improve existing systems. You
are a logical thinker and a clear communicator. You are capable of
devising and implementing complex algorithms, but you prefer to discover
simple ones. You are an energetic self-starter who is a good team player.
You can work both with faculty and students on their research projects, and
with the end users of those systems. You have a bachelor's degree in
computer science, or the equivalent. Research experience, or a higher
degree, is desired but not required. Pay will be commensurate with
The PLSE (Programming Languages and Software Engineering) group at the
University of Washington does groundbreaking research in the theory and
practice of programming languages, program analysis, and software
engineering. We build systems, perform experimental evaluation, and
transition our work into use in both research and industry. We distribute
our tools as open source. Our innovations have been the basis of start-up
companies, our tools have discovered thousands of bugs and have prevented
even more, and our ideas have changed research paradigms.
A few specific funded projects for which we need help include the
following. You will assist with one or more of these projects, but will
also be involved with new projects as they come up; we start many each year.
Verification games: We aim to make formal verification as fun as playing
Angry Birds. We are building a tool that converts any program into a game
that requires no knowledge of computing. The game board state at the end
of a game can be converted into a proof of correctness for the program.
Secure phone apps: We are building a toolset to verify the security of
mobile phone applications, so that users installing an app can be
confident it does not contain malware.
Pluggable type-checking: Run-time errors are the bane of programmers.
We have a system, the Checker Framework, that catches such errors at
compile time, before the program is run. Oracle plans to include this
technology in their Java 8 compiler, so it will have very high impact.
Test generation: To free programmers of the burden of writing tests, we
have built the Randoop tool that automatically generates tests for you, and
finds plenty of bugs in the process. Its user community (including
Microsoft, Google, etc.) continues to generate many suggestions for
improvement, particularly in creating more sophisticated tests.
Specifications: Most programmers don't enjoy writing specifications, so
our Daikon system generates them automatically. This is useful for program
understanding, test generation, formal verification, and other uses.
Duties may include some or all of the following, or related tasks.
Software development of research prototypes of program analysis tools:
- Design, build, test, and debug new and existing complex software programs.
- Resolve complex system software problems
- Devise and implement algorithms
- Deploy systems to both local and cloud computer networks
- Give presentations and demos, within and outside the university
Conduct experiments to evaluate efficacy of new techniques and tools:
- Conduct case studies, observe users and generalize results
- Conduct controlled experiments, perform analysis of data
- Create variants of software systems to isolate effects during experiments
- Measures outcomes
- Stores and analyzes data
Support colleagues and external users:
- Answer questions on discussion boards
- Triage and reproduce bug reports
- Write tutorials, usage examples, and user manuals
- Generalize systems to enable customization by external users
- Write internal design documentation
Prepare documentation and technical papers:
- Develop documentation on systems specifications and operating instructions.
- Participate in writing and submission of technical papers to journals, conferences
- Revise papers to address reviewer comments
- Prepare demo materials
- Bachelor's Degree in computer science or related field or equivalent
experience AND three years software development and/or research
- Strong interpersonal skills.
- Ability to work and communicate with faculty, students,
and end users.
- Experience with Unix.
- Experience with at least two of: C, Java, C#, Scala.
- Ability to write clear technical documentation and/or papers.
- Ability to give clear and engaging verbal presentations.
- Software design experience, including knowledge of object-oriented
- Ability to work with substantial existing codebases.
Equivalent education/experience will substitute for all minimum
qualifications except when there are legal requirements, such as a
Desired but not required:
- Master's degree.
- Experience with academic research.
- Experience with compilers or other program analysis tools.