<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Lightning Talk: Bringing Techniques from Software Engineering into Scientific Software</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Eric L. Seidel</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Gabrielle Allen</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>University of California San Diego</institution>
          ,
          <country country="US">USA</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>University of Illinois at Urbana-Champaign</institution>
          ,
          <country country="US">USA</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>-Research software, for example the large body of simulation frameworks and libraries in Computational Science &amp; Engineering (CSE), is often designed, developed, and then supported by students and postdoctoral researchers trained in scientific domains and not in the discipline of software engineering. While there are a number of initiatives to improve the training and support recognition of these research software developers, we believe there has been little attention in bringing the wealth of research and experience in the computer science field of Software Engineering to bear on the development and support of research software. This paper is written from an experience base of working as an undergraduate REU scholar as part of a team developing the Cactus Framework - a component-based simulation framework for high performance computing, before training as a PhD researcher in Software Engineering. This lightning talk will describe several areas of Software Engineering that could be investigated for their benefit for improving the quality and productivity of research software, and suggest opportunities and challenges for bringing the two communities together.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>I. SOFTWARE CORRECTNESS</title>
      <p>A fundamental concern for research software is correctness.
Incorrect software can lead to crashes or deadlocks during
a long-running computation and waste precious time and
money, or worse, it could complete successfully but produce
an incorrect result, e.g. due to rounding error in floating-point
arithmetic. Researchers in the Programming Languages and
Software Engineering communities have studied techniques
for ensuring correctness extensively. Though our motivation
is seldom connected to scientific software, many of the
techniques and tools should be transferrable.</p>
      <p>Ensuring correctness usually starts with a high-level
specification of a property that we wish our software to exhibit.
For example, when writing low-level C code, we would likely
want to ensure memory safety. If we are writing concurrent
or parallel code, we may want to ensure deadlock freedom.
Software that deals with floating-point arithmetic will likely
want to ensure numerical stability, i.e. that the rounding error
is bounded at some reasonable level. In any program we will
want to ensure some form of functional correctness, that the
program computes what we expect it to. The specification can
be given at varying levels of precision, from a plain english
description to a precise mathematical specification that can be
mechanically checked.</p>
      <p>
        Armed with a specification, we have three choices: (1) we
can verify (i.e. prove) that our implementation satisfies the
This work is licensed under a CC-BY-4.0 license.
specification, (2) validate (i.e. test) the implementation against
a range of inputs, or (3) synthesize an implementation directly
from the specification. Verification is the most difficult option
as it inevitably requires the programmer or machine to provide
internal invariants that are stronger (and often not obvious)
than the top-level property we wish to prove, yet researchers
have had much success in designing (semi) automatic systems
for proving all of the aforementioned properties [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ].
We can trade developer time for a less complete guarantee
of correctness by validating our program against a range of
inputs, driven by the specification. This can also be done
automatically by treating the specification as an oracle, either in
a black-box manner where we sample inputs exhaustively [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ],
[
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] or randomly [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], run the program, and check
that the corresponding outputs satisfy the specification, or in
a white-box manner, where we observe the path taken by
a given set of inputs and then choose a subsequent set in
order to trigger a different path [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. Finally, if the
problem domain is restricted enough, we can avoid writing an
implementation entirely and synthesize one directly from the
specification [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] (or from a naive implementation [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]).
      </p>
    </sec>
    <sec id="sec-2">
      <title>II. REPRODUCIBILITY</title>
      <p>
        Another concern for scientific software is reproducibility.
A key part of the scientific method is reproducing prior
experiments to increase our confidence in the results. However,
the rapidly changing nature of software (and hardware) can
make it very difficult to reproduce the exact experiment that
led to the published results. We can improve reproducibility by
treating each software artifact as a function of its inputs: the
source code, external library dependencies, operating system,
perhaps even the machine architecture. Viewed through this
lens, it becomes natural to describe the process of constructing
the software artifact in a (quasi) declarative language [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ],
[
        <xref ref-type="bibr" rid="ref15">15</xref>
        ], [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ], [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]. The more precise the specification of the build
process — for example we might specify an exact version
requirement for inputs instead of a range, or even provide a
cryptographic hash of the inputs to avoid ghost updates — the
more confident we can be that future researchers will be able
to reproduce our experiments.
      </p>
    </sec>
    <sec id="sec-3">
      <title>III. OPPORTUNITIES AND CHALLENGES In this section we introduce technical and social challenges to adopting Software Engineering research in the Scientific Software community.</title>
      <p>
        It is possible that research software developers are aware
of the advances in software verification, but choose not to
adopt the tools and techniques because they are simply too
difficult to use. The most advanced and expressive verification
engines require semi-manual proofs in a logical language,
which can often result in proofs that are significantly longer
than the program. On the other hand, many automatic verifiers
produce errors that are difficult to decipher, containing either
too little or too much contextual information to properly guide
the user. Even testing can be difficult when it is unclear what
the correct answer to a problem is, as is often the case in
scientific simulations [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ]. A more human-centered approach
to verification and validation may be beneficial.
      </p>
      <p>B. Social</p>
      <p>An equally important challenge to address is the lack of
collaboration between researchers in the Software Engineering
and Scientific Software communities. Without open avenues
of communication between the two disciplines, it is hard for
the Software Engineers to keep abreast of the
state-of-theart in Scientific Software development and the challenges we
might help address. Similarly, research software developers
must go out of their way to stay up-to-date with the advances
in Software Engineering and Programming Languages.</p>
      <p>One mechanism which could be used to bridge the gap
between the academic software engineering community and
the teams developing research software would be to provide
targeted graduate student internships. Currently, many
graduate students in computer science spend short periods working
for industry or at national laboratories, but these internships
usually remain within the student’s own discipline. We propose
that software engineering students be encouraged to intern
with research software development teams and become
embedded in these groups to understand the culture, software stack,
and development challenges and take these experiences back
with them as they develop new tools and approaches. Such
internships could be funded by agencies such as NSF already
funding software development, potentially as supplements to
existing awards.</p>
      <p>One challenge of this approach will be to make sure that
the students involved would be able to publish a creditable
output from their internship which would be recognized as
part of their career development — there is a danger that work
carried out in this area would be viewed by peers as simply
engineering rather than research.</p>
      <p>Another challenge faced by the Software Engineering
community is how to reward researchers for producing not just
techniques, but real, usable software artifacts that employ
those techniques. As in many fields, the reward structure for
Software Engineering researchers heavily emphasizes
publication of novel techniques, which is somewhat at odds with
providing (and supporting!) a usable artifact. The research
software community may be able to help in that regard by
making the case to funding agencies, and hiring and tenure
committies, that well-supported software engineering tools
would aid their own work.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>D.</given-names>
            <surname>Beyer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T. A.</given-names>
            <surname>Henzinger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Jhala</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Majumdar</surname>
          </string-name>
          , “
          <article-title>The software model checker blast,”</article-title>
          <string-name>
            <given-names>Int. J.</given-names>
            <surname>Softw</surname>
          </string-name>
          . Tools Technol.
          <source>Trans.</source>
          , vol.
          <volume>9</volume>
          , no.
          <issue>5-6</issue>
          , pp.
          <fpage>505</fpage>
          -
          <lpage>525</lpage>
          , 13 Sep.
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>C.</given-names>
            <surname>Flanagan</surname>
          </string-name>
          ,
          <string-name>
            <surname>K. R. M. Leino</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Lillibridge</surname>
            , G. Nelson,
            <given-names>J. B.</given-names>
          </string-name>
          <string-name>
            <surname>Saxe</surname>
            , and
            <given-names>R.</given-names>
          </string-name>
          <string-name>
            <surname>Stata</surname>
          </string-name>
          , “
          <article-title>Extended static checking for java,” in Proceedings of the ACM SIGPLAN 2002 Conference on Programming Language Design and Implementation, ser</article-title>
          .
          <source>PLDI '02</source>
          . New York, NY, USA: ACM,
          <year>2002</year>
          , pp.
          <fpage>234</fpage>
          -
          <lpage>245</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>P. M.</given-names>
            <surname>Rondon</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Kawaguci</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Jhala</surname>
          </string-name>
          , “Liquid types,”
          <source>in Proceedings of the 29th ACM SIGPLAN Conference on Programming Language Design and Implementation</source>
          , ser.
          <source>PLDI '08</source>
          . New York, NY, USA: ACM,
          <year>2008</year>
          , pp.
          <fpage>159</fpage>
          -
          <lpage>169</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>D.</given-names>
            <surname>Marinov</surname>
          </string-name>
          and
          <string-name>
            <given-names>S.</given-names>
            <surname>Khurshid</surname>
          </string-name>
          , “
          <article-title>TestEra: A novel framework for automated testing of java programs</article-title>
          ,” in
          <source>Automated Software Engineering</source>
          ,
          <year>2001</year>
          .(
          <article-title>ASE 2001)</article-title>
          .
          <source>Proceedings. 16th Annual International Conference on. IEEE</source>
          ,
          <year>2001</year>
          , pp.
          <fpage>22</fpage>
          -
          <lpage>31</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>C.</given-names>
            <surname>Runciman</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Naylor</surname>
          </string-name>
          , and
          <string-name>
            <given-names>F.</given-names>
            <surname>Lindblad</surname>
          </string-name>
          , “
          <article-title>Smallcheck and lazy smallcheck: Automatic exhaustive testing for small values,” in Proceedings of the First ACM SIGPLAN Symposium on Haskell, ser</article-title>
          . Haskell '
          <fpage>08</fpage>
          . New York, NY, USA: ACM,
          <year>2008</year>
          , pp.
          <fpage>37</fpage>
          -
          <lpage>48</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>K.</given-names>
            <surname>Claessen</surname>
          </string-name>
          and
          <string-name>
            <given-names>J.</given-names>
            <surname>Hughes</surname>
          </string-name>
          , “
          <article-title>QuickCheck: A lightweight tool for random testing of haskell programs</article-title>
          ,”
          <source>in Proceedings of the Fifth ACM SIGPLAN International Conference on Functional Programming, ser. ICFP '00</source>
          . New York, NY, USA: ACM,
          <year>2000</year>
          , pp.
          <fpage>268</fpage>
          -
          <lpage>279</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>C.</given-names>
            <surname>Csallner</surname>
          </string-name>
          and
          <string-name>
            <given-names>Y.</given-names>
            <surname>Smaragdakis</surname>
          </string-name>
          , “
          <article-title>JCrasher: an automatic robustness tester for java,” Softw</article-title>
          . Pract. Exp., vol.
          <volume>34</volume>
          , no.
          <issue>11</issue>
          , pp.
          <fpage>1025</fpage>
          -
          <issue>1050</issue>
          , 1 Sep.
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>C.</given-names>
            <surname>Pacheco</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. K.</given-names>
            <surname>Lahiri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. D.</given-names>
            <surname>Ernst</surname>
          </string-name>
          , and T. Ball, “
          <article-title>Feedback-Directed random test generation,” in 29th International Conference on Software Engineering, ser</article-title>
          .
          <source>ICSE '07</source>
          ,
          <year>2007</year>
          , pp.
          <fpage>75</fpage>
          -
          <lpage>84</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>P.</given-names>
            <surname>Godefroid</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Klarlund</surname>
          </string-name>
          , and
          <string-name>
            <given-names>K.</given-names>
            <surname>Sen</surname>
          </string-name>
          , “DART: Directed automated random testing,”
          <source>in Proceedings of the 2005 ACM SIGPLAN Conference on Programming Language Design and Implementation</source>
          , ser.
          <source>PLDI '05</source>
          . New York, NY, USA: ACM,
          <year>2005</year>
          , pp.
          <fpage>213</fpage>
          -
          <lpage>223</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>K.</given-names>
            <surname>Sen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Marinov</surname>
          </string-name>
          , and G. Agha, “
          <article-title>CUTE: A concolic unit testing engine for C,”</article-title>
          in
          <source>Proceedings of the 10th European Software Engineering Conference Held Jointly with 13th ACM SIGSOFT International Symposium on Foundations of Software Engineering</source>
          , ser.
          <source>ESEC/FSE13</source>
          . New York, NY, USA: ACM,
          <year>2005</year>
          , pp.
          <fpage>263</fpage>
          -
          <lpage>272</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>N.</given-names>
            <surname>Tillmann</surname>
          </string-name>
          and J. de Halleux, “
          <article-title>Pex-White box test generation for .NET,” in Tests and Proofs, ser</article-title>
          . Lecture Notes in Computer Science,
          <string-name>
            <given-names>B.</given-names>
            <surname>Beckert</surname>
          </string-name>
          and R. Ha¨hnle, Eds. Springer Berlin Heidelberg,
          <year>2008</year>
          , pp.
          <fpage>134</fpage>
          -
          <lpage>153</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>E.</given-names>
            <surname>Darulova</surname>
          </string-name>
          and
          <string-name>
            <given-names>V.</given-names>
            <surname>Kuncak</surname>
          </string-name>
          , “Sound compilation of reals,”
          <source>in Proceedings of the 41st ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages - POPL '14</source>
          . New York, New York, USA: ACM Press,
          <year>2014</year>
          , pp.
          <fpage>235</fpage>
          -
          <lpage>248</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>P.</given-names>
            <surname>Panchekha</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Sanchez-Stern</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. R.</given-names>
            <surname>Wilcox</surname>
          </string-name>
          , and
          <string-name>
            <given-names>Z.</given-names>
            <surname>Tatlock</surname>
          </string-name>
          , “
          <article-title>Automatically improving accuracy for floating point expressions</article-title>
          ,”
          <source>in Proceedings of the 36th ACM SIGPLAN Conference on Programming Language Design and Implementation</source>
          , ser.
          <source>PLDI</source>
          <year>2015</year>
          . New York, NY, USA: ACM,
          <year>2015</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>11</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <article-title>“Chef - IT automation for speed and awesomeness - chef</article-title>
          ,” https: //www.chef.io/chef/, accessed:
          <fpage>2016</fpage>
          -7-10.
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <article-title>“Puppet - the shortest path to better software</article-title>
          ,” https://puppet.com/, accessed:
          <fpage>2016</fpage>
          -7-10.
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>E.</given-names>
            <surname>Dolstra</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Lo</surname>
          </string-name>
          <article-title>¨h, and</article-title>
          <string-name>
            <given-names>N.</given-names>
            <surname>Pierron</surname>
          </string-name>
          , “
          <article-title>NixOS: A purely functional linux distribution,”</article-title>
          <string-name>
            <given-names>J.</given-names>
            <surname>Funct</surname>
          </string-name>
          . Programming, vol.
          <volume>20</volume>
          , no.
          <issue>Special Issue 5-6</issue>
          , pp.
          <fpage>577</fpage>
          -
          <lpage>615</lpage>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>G.</given-names>
            <surname>Allen</surname>
          </string-name>
          , F. Lo¨ffler, E. Schnetter, and
          <string-name>
            <given-names>E. L.</given-names>
            <surname>Seidel</surname>
          </string-name>
          , “
          <article-title>Component specification in the cactus framework: The cactus configuration language,” in GRID</article-title>
          . IEEE,
          <year>2010</year>
          , pp.
          <fpage>359</fpage>
          -
          <lpage>368</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>J. C.</given-names>
            <surname>Carver</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R. P.</given-names>
            <surname>Kendall</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. E.</given-names>
            <surname>Squires</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D. E.</given-names>
            <surname>Post</surname>
          </string-name>
          , “
          <article-title>Software development environments for scientific and engineering software: A series of case studies,”</article-title>
          <source>in 29th International Conference on Software Engineering (ICSE'07)</source>
          . ieeexplore.ieee.org, May
          <year>2007</year>
          , pp.
          <fpage>550</fpage>
          -
          <lpage>559</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>