<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://yunjeong-lee.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://yunjeong-lee.github.io/" rel="alternate" type="text/html" /><updated>2026-08-28T07:31:14+00:00</updated><id>https://yunjeong-lee.github.io/feed.xml</id><title type="html">Yunjeong Lee</title><subtitle>personal description</subtitle><author><name>Yunjeong Lee</name><email>yunjeong.lee@u.nus.edu</email></author><entry><title type="html">How to make sense of Model Checking</title><link href="https://yunjeong-lee.github.io/posts/2020/07/blog-post-1/" rel="alternate" type="text/html" title="How to make sense of Model Checking" /><published>2020-07-31T00:00:00+00:00</published><updated>2020-07-31T00:00:00+00:00</updated><id>https://yunjeong-lee.github.io/posts/2020/07/blog-post-1</id><content type="html" xml:base="https://yunjeong-lee.github.io/posts/2020/07/blog-post-1/"><![CDATA[<p>I’ve recently started to explore the ideas behind model checking. This post documents my findings through a Q&amp;A format, in hopes of making it easier to follow especially for those who are not familiar with the subject. I start off with basics – <em>what it does</em> and <em>what it is for</em>, illustrating the mechanism with simple examples – and answer any questions that came to my mind while thinking it through.</p>

<p><br /></p>

<h3 id="q1-what-is-model-checking"><em><strong>Q1: What is model checking?</strong></em></h3>

<p><strong>A:</strong> When you are designing a program, you want your program to correctly behave based on your implementation design. As the software systems have grown bigger and highly complex, we can no longer rely on manual reasoning to verify programs. Instead, we make use of a more automated mechanism – i.e., model checking – to analyze correct behavior of complex programs.</p>

<p>That is, model checking is an automated technique that, given a finite-state model of a system and a formal property, exhaustively and systematically checks whether the model satisfies this property, behaving just as the specifications of the property instructed it to. The main goal of model checking is to prove properties of program computations.<sup id="fnref:5" role="doc-noteref"><a href="#fn:5" class="footnote" rel="footnote">1</a></sup> In this process, model checkers employ different kinds of algorithms (e.g., partial order reduction, bit-state hashing<sup id="fnref:5:1" role="doc-noteref"><a href="#fn:5" class="footnote" rel="footnote">1</a></sup>) to make the verification runs more effective.</p>

<p><br /></p>

<h3 id="q2-what-are-the-steps-involved-in-model-checking"><em><strong>Q2: What are the steps involved in model checking?</strong></em></h3>

<p><strong>A:</strong> The model checking process consists of three different phases: <em>modeling</em>, <em>running</em>, and <em>analysis</em> phase<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">2</a></sup>.</p>

<ul>
  <li>In the <em>modeling</em> phase, we model the system using the modelling language to express it as finite-state systems and formalize the property using the property specification language.</li>
  <li>The system under consideration is compiled into a state-transition graph (a.k.a. Kripke structure, as shown in Fig 1.<sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">3</a></sup> below) <em>K</em>, the specification is expressed as a temporal-logic formula <em>φ</em>, and the model checker decides whether <em>K ⊨ φ</em>, i.e., whether a structure <em>K</em> is a model of the formula <em>φ</em>.
    <ul>
      <li>We may run some simulations of the model as a sanity check during the modeling phase.</li>
    </ul>

    <p><!-- blank space in-between --></p>
    <p align="center">
  <img width="320" height="110" src="https://i.postimg.cc/x8t3XVB2/american-austrian-traffic-lights.png" />
  </p>
    <center><font size="-1">Fig 1. American and Austrian traffic lights as Kripke structure</font></center>
    <p><!-- blank space in-between --></p>
  </li>
  <li>In the <em>running</em> phase, we run the model checker to assess whether the property holds for a given state in the model.</li>
  <li>Once the model checker is run, there are three possible outcomes in the analysis phase: property being satisfied, violated, or insufficient memory triggering out-of-memory error.
    <ul>
      <li>If property is satisfied, then check the next property (if any).</li>
      <li>If it is violated analyze the counterexample generated by the model checker, refine the model or property, and repeat the entire process.</li>
      <li>If you run out of memory, reduce the size of the model and try it again.</li>
    </ul>

    <p><!-- blank space in-between --></p>
    <p align="center">
  <img width="320" height="190" src="https://i.postimg.cc/TPBdXyw8/model-checking-methodology.png" />
  </p>
    <center><font size="-1">Fig 2. Basic model-checking methodology</font></center>
    <p><br /></p>
  </li>
</ul>

<p><br /></p>

<h3 id="q3-what-are-some-examples-of-the-model-checking-tools"><em><strong>Q3: What are some examples of the model checking tools?</strong></em></h3>

<p><strong>A:</strong> There are quite a few <a href="https://en.wikipedia.org/wiki/List_of_model_checking_tools#Overview_of_some_model_checking_tools">open-source model checkers</a>. They differ by the modelling language (C, Promela, etc.), properties language (LTL, CTL, etc.), performance in verifying properties of different systems, etc. Examples of the model checking tools include <a href="http://spinroot.com/spin/whatispin.html">SPIN</a>, <a href="http://nusmv.fbk.eu/">NuSMV</a>, <a href="http://www.uppaal.org/">UPPAAL</a>, <a href="https://www.prismmodelchecker.org/">PRISM</a>, <a href="https://pat.comp.nus.edu.sg/">PAT</a>, and <a href="https://en.wikipedia.org/wiki/TLA%2B#Model_checker">TLC</a>, among many others.</p>

<p><br /></p>

<h3 id="q4-what-are-some-examples-of-programs-verified-by-a-model-checker"><em><strong>Q4: What are some examples of programs verified by a model checker?</strong></em></h3>

<p><strong>A:</strong> Let’s first look at the following examples where we use the SPIN model checker, one of the most popular open-source model checking tools used for concurrent and distributed systems. The model is designed in <a href="https://en.wikipedia.org/wiki/Promela">Promela</a> (short for Process Meta Language) language. <br /></p>

<p><strong>Example 1.</strong> Verifying non-termination of a traffic light controller<sup id="fnref:7" role="doc-noteref"><a href="#fn:7" class="footnote" rel="footnote">4</a></sup></p>

<p>Suppose we have a traffic light controller system where light switches from green to yellow, then to red, and so on, as shown below:</p>

<pre><code class="language-pomela">mtype = {red, yellow, green};
mtype color = green;
 
active proctype TrafficLightController() {
  do
    ::(color == red) -&gt; color = green;
    ::(color == yellow) -&gt; color = red;
    ::(color == green) -&gt; color = yellow;
  od;
}
</code></pre>
<p>Once we run SPIN, it results in ‘unreached in proctype’ message as follows:</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">unreached in proctype TrafficLightController
trafficlight.pml:16, state 13, "-end-"
(1 of 13 states)
</span></code></pre></div></div>
<p>This indicates that the proctype never reaches the “end” state, which is what we expected as there is a non-terminating loop in the program.</p>

<p><br /></p>

<p><strong>Example 2.</strong> Verifying that traffic lights are never green simultaneously<sup id="fnref:6" role="doc-noteref"><a href="#fn:6" class="footnote" rel="footnote">5</a></sup></p>

<p>Now, let’s say we have the following system of two traffic lights and a controller, and want to verify the safety property that the two lights are never green simultaneously:</p>

<pre><code class="language-pomela">bit g1=0, g2=0;
 
active proctype TrafficLights()
{
  do
    :: atomic{ (g1==0 &amp;&amp; g2==0) -&gt; g1=1; g2=0 }
    :: atomic{ (g1==0 &amp;&amp; g2==0) -&gt; g1=0; g2=1 }
    :: atomic{ (g1==1 &amp;&amp; g2==0) -&gt; g1=0; g2=0 }
    :: atomic{ (g1==0 &amp;&amp; g2==1) -&gt; g1=0; g2=0 }
  od;
}
 
 ltl P1 {[] (! (g1 &amp;&amp; g2))}
</code></pre>
<p>Running SPIN results in the following outcome:</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>spin <span class="nt">-a</span> lights_simple.pml
<span class="gp">$</span><span class="w"> </span>gcc <span class="nt">-o</span> pan pan.c
<span class="gp">$</span><span class="w"> </span>./pan <span class="nt">-a</span> <span class="nt">-n</span> P1 lights_simple.pml
<span class="go"> 
(Spin Version 6.5.1 -- 6 June 2020)
     + Partial Order Reduction
 
Full statespace search for:
     never claim           + (P1)
     assertion violations  + (if within scope of claim)
     acceptance   cycles   + (fairness disabled)
     invalid end states    - (disabled by never claim)
 
State-vector 28 byte, depth reached 3, errors: 0
        3 states, stored
        2 states, matched
        5 transitions (= stored+matched)
        0 atomic steps
hash conflicts:         0 (resolved)
</span></code></pre></div></div>
<p>Note that I have first generated a verifiable source code in pan.c, and then compiled and executed the verifier.</p>

<p><br /></p>

<p><strong>Example 3.</strong> Verifying a mutual exclusion algorithm<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">6</a></sup> <sup id="fnref:8" role="doc-noteref"><a href="#fn:8" class="footnote" rel="footnote">7</a></sup></p>

<p>Suppose we have the following model based on Peterson’s algorithm for mutual exclusion:</p>

<pre><code class="language-pomela">bool turn;      // indicates whose turn to enter the CS
bool flag[2];   // indicates if a process is ready to enter the CS
 
active [2] proctype user()
{
again:
     flag[_pid] = true;    // _pid: identifier of the process
     turn = _pid;
     (flag[1-_pid] == false || turn == 1-_pid);
 
/* critical section */
 
     flag[_pid] = false;
     goto again:
}
</code></pre>
<p>We are interested in verifying safety properties that there are only at most two instances with identifiers 0 and 1, and that there is always at most one process entering the critical section. These properties can be verified by adding the assertions and specifying an LTL formula as follows:</p>

<pre><code class="language-pomela">bool turn, flag[2];
byte ncrit; // counts the number of processes in critical section
 
active [2] proctype user()
{
  assert(_pid == 0 || _pid == 1);
again:
  flag[_pid] = true;
  turn = _pid;
  (flag[1-_pid] == false || turn == 1-_pid);
 
  ncrit++;
  assert(ncrit == 1); /* critical section */
  ncrit--;
 
  flag[_pid] = false;
  goto again:
}

ltl P1 { [] (ncrit &lt;= 1) }
</code></pre>
<p>Running the SPIN results in the following outcome:</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">$</span><span class="w"> </span>spin <span class="nt">-a</span> peterson.pml
<span class="gp">$</span><span class="w"> </span>gcc <span class="nt">-o</span> pan pan.c
<span class="gp">$</span><span class="w"> </span>./pan <span class="nt">-a</span> <span class="nt">-n</span> P1 peterson.pml
<span class="go"> 
(Spin Version 6.5.1 -- 6 June 2020)
     + Partial Order Reduction
 
Full statespace search for:
     never claim           + (P1)
     assertion violations  + (if within scope of claim)
     acceptance   cycles   + (fairness disabled)
     invalid end states    - (disabled by never claim)
 
State-vector 36 byte, depth reached 49, errors: 0
       40 states, stored
       27 states, matched
       67 transitions (= stored+matched)
        0 atomic steps
hash conflicts:         0 (resolved)
</span></code></pre></div></div>

<p><br /></p>

<h3 id="q5-what-are-some-examples-of-these-properties-how-can-you-classify-them"><em><strong>Q5: What are some examples of these properties? How can you classify them?</strong></em></h3>

<p><strong>A:</strong> With the SPIN model checker, we can check deadlocks (as in invalid endstates), correctness of system invariants via user-inserted assertions, unreachable code, LTL formula, and liveness properties through non-progress cycles (livelocks) or acceptance cycles<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">8</a></sup>.</p>

<p>The properties can be classified into two categories: <em>safety</em> and <em>liveness</em>. Informally speaking, safety properties stipulate that “bad things” do not happen during program computations, whereas liveness properties stipulate that “good things” will eventually happen<sup id="fnref:5:2" role="doc-noteref"><a href="#fn:5" class="footnote" rel="footnote">1</a></sup>. <em>Safety</em> properties are verified via <em>invariants</em> such as “x is always less than 5”, or <em>deadlock freedom</em> such as “the system never reaches a state where no actions are possible”. Specifically, SPIN can find a trace leading to the “bad” thing. If there is no such trace, we know that the property holds. On the other hand, <em>liveness</em> properties are verified via <em>termination</em> that “the system will eventually terminate” or response that “if action X occurs then eventually action Y will occur”. SPIN can search for a loop in which the good thing does not happen. If there is no such loop, then we know that the property is satisfied.</p>

<p><br /></p>

<h3 id="q6-how-do-we-formalize-requirements-into-property-specifications"><em><strong>Q6: How do we formalize requirements into property specifications?</strong></em></h3>

<p><strong>A:</strong> The requirements are formalized into property specifications via propositional temporal logic, so that we have precise and unambiguous formulation of properties under consideration. As for the SPIN model checker, for example, linear temporal logic (LTL) formulae are used to specify requirements. LTL is a mathematical language for describing linear-time propositions, and its formulae consist of propositional logic and temporal logic operators.</p>

<p>Primary operators are:</p>
<ul>
  <li>&lt;&gt; (“eventually”): a property will become true at some point in the future, and</li>
  <li>[] (“always”): a property is satisfied now and forever into the future.</li>
</ul>

<p>For example, the property that the two lights are never green simultaneously, i.e., [] (! (g1 &amp;&amp; g2)), from the <strong>Example 2</strong> above can be expressed in LTL as  ▢ ¬(g1∧g2).</p>

<p>Some of the common composite operators include:</p>
<ul>
  <li>p -&gt; ♢ q          p implies eventually q (response)</li>
  <li>p -&gt; q U r         p implies q until r (precedence)</li>
  <li>▢♢p               always eventually p (progress)</li>
  <li>♢▢p               eventually always p (stability)</li>
  <li>♢p -&gt; ♢q       eventually p implies eventually q (correlation)</li>
</ul>

<p>More details can be found in the reference source<sup id="fnref:6:1" role="doc-noteref"><a href="#fn:6" class="footnote" rel="footnote">5</a></sup>.</p>

<p><br /></p>

<h3 id="q7-what-are-pros-and-cons-of-model-checking-compared-to-other-comparable-techniques"><em><strong>Q7: What are pros and cons of model checking compared to other comparable techniques?</strong></em></h3>

<p><strong>A:</strong> Other related approaches are testing, abstract interpretation (and other program analyses), and higher-order theorem proving. Comparison of the techniques can be summarized as follows<sup id="fnref:4:1" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">3</a></sup>:</p>

<table>
  <thead>
    <tr>
      <th>Testing</th>
      <th>Model Checking</th>
      <th>Abstract Interpretation</th>
      <th>Theorem Proving</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>+ Fastest and simplest way to detect error</td>
      <td>+ Systematic approach to automatic bug detection aimed at model verification</td>
      <td>+ Similar to model checking, employs algorithms to prove properties automatically</td>
      <td>Compared to model checking, focus is on expressiveness rather than efficiency</td>
    </tr>
    <tr>
      <td>+ Relatively easy to automate</td>
      <td>+ Applicable at different stages of design process</td>
      <td>Built on lattice theory rather than logic</td>
      <td>- Typically incorporates manual work, especially for complex systems</td>
    </tr>
    <tr>
      <td>- <a href="https://en.wikiquote.org/wiki/Edsger_W._Dijkstra#1960s"><em>“Program testing can be used to show the presence of bugs, but is hopelessly inadequate for showing their absence”</em></a></td>
      <td>+ Well-suited for finding concurrency bugs and proving their absence</td>
      <td>Compared to model checking, focus is on efficiency rather than expressiveness, on code rather than models</td>
      <td>- Time-consuming and often non-trivial task worthy of a research publication</td>
    </tr>
  </tbody>
</table>

<!-- comment: want to decrease the font size and re-format the table above <font size="-1">Description</font> -->

<p><br /></p>

<h3 id="q8-what-is-the-trend-in-model-checking-research"><em><strong>Q8: What is the trend in model checking research?</strong></em></h3>

<p><strong>A:</strong> The handbook of model checking<sup id="fnref:4:2" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">3</a></sup> classifies advances in model checking into two recurrent themes, driving much of the research agenda: the algorithmic challenge and the modelling challenge.</p>

<ul>
  <li>The <em>algorithmic challenge</em> refers to the problem of designing model-checking algorithms that scale to real-life problems. This is due to the so-called “state-explosion problem”, the combinatorial explosion of states in the Kripke structure. Because state space is not finite in most situations (e.g., unbounded memory, unbounded number of parallel processes), this leads to the modelling challenge.</li>
  <li>The <em>modelling challenge</em> refers to the problem of extending the model-checking framework beyond Kripke structures and temporal logic. We need to extend modelling and specification frameworks to model and specify unbounded iteration and recursion, unbounded concurrency and distribution, unbounded data types, real-time and cyber-physical systems, probabilistic computation, etc. Some extensions maintain decidability, while others sacrifice decidability and maintain the ability to find bugs automatically, systematically, and early in the system design process.</li>
</ul>

<p>In addition, there has been a recent development in convergence between model checking and other related approaches such as white-box testing techniques, abstract interpretation, and theorem proving.</p>

<p><br /></p>

<!-- This is <span style="color: red">written in red</span>. -->

<hr />
<h3 id="references">References</h3>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:5" role="doc-endnote">
      <p>Jhala, Ranjit, and Rupak Majumdar. “Software Model Checking.” ACM Computing Surveys 41, no. 4 (2009): 1–54. https://doi.org/10.1145/1592434.1592438. <a href="#fnref:5" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:5:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a> <a href="#fnref:5:2" class="reversefootnote" role="doc-backlink">&#8617;<sup>3</sup></a></p>
    </li>
    <li id="fn:1" role="doc-endnote">
      <p>Baier, Christel, Joost-Pieter Katoen, and Kim Guldstrand Larsen. “System Verification.” In Principles of Model Checking, 1–18. Cambridge, MA: MIT Press, 2014. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:4" role="doc-endnote">
      <p>Clarke, Edmund M., Thomas A. Henzinger, and Helmut Veith. “Introduction to Model Checking.” In Handbook of Model Checking, 1–22. Springer Publishing Company, 2018. <a href="#fnref:4" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:4:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a> <a href="#fnref:4:2" class="reversefootnote" role="doc-backlink">&#8617;<sup>3</sup></a></p>
    </li>
    <li id="fn:7" role="doc-endnote">
      <p>Roychoudhury, Abhik. “Automated Software Validation.” CS5219 Week 6 Resources. Accessed July 18, 2020. https://www.comp.nus.edu.sg/~abhik/5219/old-lesson-plan.html. <a href="#fnref:7" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:6" role="doc-endnote">
      <p>Murray, Richard M., Nok Wongpiromsarn, and Ufuk Topcu. “Computer Lab 1: Model Checking and Logic Synthesis using Spin.” Class lecture, Specification, Design, and Verification of Networked Control Systems from California Institute of Technology, Pasadena, CA, March 19, 2013. <a href="#fnref:6" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:6:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p>Chechik, Marsha. “Partial order reduction and Promela/SPIN.” Class lecture, Automated Verification from University of Toronto, Toronto, ON, 2007. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:8" role="doc-endnote">
      <p>“Spin Verification Examples and Exercises.” Spin - Formal Verification, November 28, 2004. http://spinroot.com/spin/Man/Exercises.html. <a href="#fnref:8" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>Ben-Ari, Mordechai. “Verification with Temporal Logic.” In Principles of the Spin Model Checker, 68–93. London: Springer, 2008. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Yunjeong Lee</name><email>yunjeong.lee@u.nus.edu</email></author><category term="model checking" /><category term="program verification" /><summary type="html"><![CDATA[I’ve recently started to explore the ideas behind model checking. This post documents my findings through a Q&amp;A format, in hopes of making it easier to follow especially for those who are not familiar with the subject. I start off with basics – what it does and what it is for, illustrating the mechanism with simple examples – and answer any questions that came to my mind while thinking it through.]]></summary></entry><entry><title type="html">What I learned from my first PLDI</title><link href="https://yunjeong-lee.github.io/posts/2020/06/blog-post-1/" rel="alternate" type="text/html" title="What I learned from my first PLDI" /><published>2020-06-27T00:00:00+00:00</published><updated>2020-06-27T00:00:00+00:00</updated><id>https://yunjeong-lee.github.io/posts/2020/06/blog-post-1</id><content type="html" xml:base="https://yunjeong-lee.github.io/posts/2020/06/blog-post-1/"><![CDATA[<p>Programming Language Design and Implementation (PLDI) this year (June 15-19, 2020) was held virtually due to COVID-19. I took this opportunity to attend the conference, but at the same time, I honestly did not expect to get much out of it. That’s because I thought the conference would be mostly about discussing publications of technical papers by much more experienced people in the field. Hence, I initially thought I’d give it a try and see what kind of work people publish in such a renowned conference as a way to get myself familiar with what I am expected to produce further down the road.</p>

<p>But I was wrong! There were these <a href="https://pldi20.sigplan.org/home/PLMW-PLDI-2020">Programming Languages Mentoring Workshop (PLMW)</a> as well as <a href="https://pldi20.sigplan.org/track/pldi-2020-ask-me-anything#About">“Ask Me Anything” track</a>, discussing effective habits for navigating the research landscape and providing opportunities for students to interact with researchers in the field, among other things. In some of these sessions, experienced, senior people were genuinely sharing their research experience and other stories of building their (research) career in non-technical, everyday English, which was enlightening and encouraging for newbies like me. What I enjoyed the most was the Slack’s <code class="language-plaintext highlighter-rouge">#mentoring</code> channel, where attendees could reach out to volunteer mentors and have 1:1 meetings. Through the channel, I could talk to 14 people in total – either professors, professionals or PhD students. I enjoyed these individual meetings so much that I decided to write a blog post about it and share with anyone who might be interested. Below are their responses to the questions I asked.</p>

<p><br /></p>

<h3 id="question-1-what-are-some-good-ways-to-come-up-with-research-topics-especially-for-junior-phd-students-how-can-i-figure-out-what-i-am-interested-in"><em>Question 1: What are some good ways to come up with research topics, especially for junior PhD students? How can I figure out what I am interested in?</em></h3>

<h3 id="answers"><em>Answers:</em></h3>
<ul>
  <li>Many advisors do not expect their early-stage graduate student to come up with original research topics. They may offer you some options and let you work on one of them. It is recommended that you <strong>work closely with your advisor or other senior students</strong> (if possible) for the initial projects, so you learn how the process works.
    <ul>
      <li>If you end up working on existing project as a junior student, your contribution may primarily be on implementation (e.g., working on small fixes to make the implementation work).</li>
      <li>As you gain more experience, your contribution will become more significant (e.g., working on phrasing the problem, coming up with solutions, etc.).</li>
    </ul>
  </li>
  <li>That being said, it is good to think of the <strong>problems and application domains</strong>. For example, are you interested in verification problem, synthesis, and/or language design? In which contexts and applications?</li>
  <li>You can go through <strong>research topics from PL conferences</strong> for the past 5+ years. Go through sessions and pick the topics that pique your interest. If there is any interesting topic, watch the talk. If you find the talk interesting, read relevant papers on the topic, and discuss the following with your advisor:
    <ul>
      <li>why you are considering the topic, and</li>
      <li>what you like about the topic.</li>
    </ul>
  </li>
  <li><strong>Don’t worry too much</strong> about what you are in love with. Often, initial ideas may look silly. Don’t be afraid to bring it up to your advisor. And when approved, start working on the idea. You may end up liking what you end up working on, since there are often a lot of freedom and various approaches in most research projects.</li>
  <li>Don’t limit your network to the PL community. You can learn from people in other communities. In the long run, there could be collaborative work with other fields. New ideas may come up by mashing up two different fields. In this sense, <strong>reading non-PL papers</strong> could be helpful.</li>
  <li>Make use of <strong>graduate course projects</strong> to try out some crazy ideas or explore ideas that you are interested in. Explore the current topics and see who’s been working on the area. Brainstorm ideas and discuss them if you come across these people at the conferences.</li>
</ul>

<p><br /></p>

<h3 id="question-2-what-are-some-useful-techniques-when-it-comes-to-reading-papers"><em>Question 2: What are some useful techniques when it comes to reading papers?</em></h3>

<h3 id="answers-1"><em>Answers:</em></h3>
<ul>
  <li><strong>Survey papers</strong> are typically a good introduction to a topic. They tend to be easier to understand than other technical papers.</li>
  <li>Well-written <strong>dissertations</strong> can be helpful too as they tend to include survey of the corresponding research area.</li>
  <li>Read papers as your <strong>daily ritual</strong>. You will have to spend a lot of time reading papers before they start making sense.</li>
  <li>Don’t just skim through them but make conscious efforts to <strong>remain critical</strong> when reading. If there’s anything that does not make sense to you, <strong>take notes</strong> and ask your advisor or other senior students about them. Make sure you understand them.</li>
  <li>One thing you can do when figuring out whether to thoroughly read the paper or not is first by going over the <strong>Abstract, Introduction, and Evaluation</strong>. If you find the evaluation interesting, then go to the middle part and dig further.</li>
  <li>Make use of <strong>reading groups</strong> and <strong>graduate courses</strong>. Explaining and presenting to others is a way to force yourself to understand the papers. Also, taking more advanced graduate courses will help you better understand the papers.</li>
</ul>

<p><br /></p>

<h3 id="question-3-how-can-i-better-manage-my-time-as-a-phd-student"><em>Question 3: How can I better manage my time as a PhD student?</em></h3>

<h3 id="answers-2"><em>Answers:</em></h3>
<ul>
  <li><strong>Set aside time</strong> for things you have to do every day. Enumerate your tasks and break them down into smaller tasks, and make sure you do them.
    <ul>
      <li>For example, there could four things to work on, such as reading papers, doing math, programming, and writing. As you do one thing, cross one off and move it to the bottom. The following day, start from what is on top.</li>
      <li>Spending the whole day doing one thing will not make you very productive.</li>
    </ul>
  </li>
  <li>Using a <strong>task management system</strong> can help you.</li>
  <li>As a first- or second-year PhD student, you may have to take classes. Let your advisor know of your schedule.</li>
  <li>Make sure you <strong>take your time off</strong>. It affects your productivity.</li>
</ul>

<p><br /></p>

<h3 id="question-4-would-you-recommend-going-for-an-internship-during-phd"><em>Question 4: Would you recommend going for an internship during PhD?</em></h3>

<h3 id="answers-3"><em>Answers:</em></h3>
<ul>
  <li>There are people who take it as a personal choice. Regardless, the response was overall <strong>YES</strong>.</li>
  <li>Internship is a great opportunity for you to figure out whether you want to stay in the academia or work in the industry after PhD. Working in the industry can enable you to see more direct impact of your research, but your freedom in research may be limited by your employer.</li>
  <li>Internship will help you <strong>change your perspective</strong> and learn different things by working with different people.</li>
  <li>Students are usually recommended to go for an internship in either earlier or later – after passing Qualifying Exam and achieving Candidacy – stages of the PhD program. That’s because you may need the summer in 2nd or 3rd year to work on developing ideas for your thesis/research project(s).</li>
</ul>

<p><br /></p>

<h3 id="question-5-any-other-useful-tips-or-advice-for-phd-students"><em>Question 5: Any other useful tips or advice for PhD students?</em></h3>

<h3 id="answers-4"><em>Answers:</em></h3>
<ul>
  <li>Maintaining <strong>a research blog</strong> is highly recommended. By doing so, you can better organize your thoughts, make sure you understand the materials, and it can be a good way for you to get connected with people from other fields. This may lead to a new research project further down the road.</li>
  <li>The more <strong>constructive criticism</strong> you receive from your advisor and other people, the faster you will grow as a student.</li>
  <li>Don’t think you should learn everything. People are specialized in their own field. Don’t let “not knowing so much of all CS fundamentals” bother you so much.</li>
  <li>When you have time, <strong>study math</strong> such as Order Theory or Category Theory. Math can be a useful tool to help you better understand which mathematical structures a particular technique is working with.</li>
  <li>Take advantage of the <strong>teaching opportunities</strong>. The best way to learn a new subject/topic is by teaching a course on it. External motivation plays an important role.</li>
  <li><strong>Don’t compare yourself with others</strong>. There are always people who are better than you. Everyone feels this way. You have something that is great in you.</li>
  <li>Understand that your advisor wants you to succeed! <strong>Good communication with your advisor</strong> is critical. Students may not always bring up what they want to discuss or complain about. If you don’t bring it up, your advisor does not know. Don’t be afraid to talk about your concerns and what is happening to you.</li>
  <li>And as a PhD student, it’s important to <strong>make your advisor HAPPY</strong>.</li>
  <li>It’s great to have <strong>many mentors</strong>!</li>
  <li>Everything can be learned. You just need to put in a lot of time. <strong>Hard work</strong> is like a compound interest. Doing one percent more work than what is required over sustained period of time will make a huge difference.</li>
  <li>Don’t ignore or overlook <strong>your health</strong>. Pulling an all-nighter is never recommended.</li>
  <li>Knowledge can be learned, but <strong>genuine desire to excel</strong> cannot be taught.</li>
  <li>There is no short cut. <strong>Be patient, perseverant and learn from your mistakes!</strong></li>
  <li><strong>Socialize</strong>. Doing research can be a very lonely process. As you start making progress, you may get stuck and feel desperate. Having a nice social network in or outside your lab can be useful to go through these hard times.</li>
</ul>

<h4 id="follow-up-question-how-do-i-better-manage-the-blogging-process"><em>Follow-up question: How do I better manage the blogging process?</em></h4>

<h4 id="answers-5"><em>Answers:</em></h4>
<ul>
  <li>It hardly matters what you write about. You can write about <strong>anything you are reading</strong>. Write about <strong>your perspectives</strong>, anything you find interesting and/or surprising.
    <ul>
      <li>E.g., how SMT solvers work, how it uses algorithms for optimization problems, etc.</li>
    </ul>
  </li>
  <li>Ask yourself, <em>“how would you explain it to yourself 5 years ago?”</em>. The blog posts don’t have to be everything to everyone. Think of it as a service to the community.</li>
  <li>It could be an example that somebody else had come up with, where you fixed minor issues. Then you can write a blog post about it.</li>
  <li>Your goal is to become <strong>better at (technical) writing</strong>. This will improve your paper-writing skills.</li>
</ul>

<p><br /></p>

<h3 id="question-6-what-are-some-useful-resources-or-background-materials-for-me-to-review-as-a-junior-student-in-the-pl-field"><em>Question 6: What are some useful resources or background materials for me to review as a junior student in the PL field?</em></h3>

<h3 id="answers-6"><em>Answers:</em></h3>
<ul>
  <li><a href="https://www.youtube.com/channel/UCDe6N9R7U-RYWA57wzJQ2SQ">Oregon Programming Language Sumer School (OPLSS) talks</a></li>
  <li><a href="https://www.coursera.org/learn/programming-languages">Coursera Programming Languages Part A, B, C by Dan Grossman</a> (<em>a good intro before reading TAPL</em>)</li>
  <li><a href="https://www.cis.upenn.edu/~bcpierce/tapl/">Types and Programming Languages by Benjamin C. Pierce</a> (<em>a bible for PL</em>)</li>
  <li><a href="https://www.cambridge.org/core/books/practical-foundations-for-programming-languages/3D852B5A14F48F85C60B95A0BBCAB7D9">Practical Foundations for Programming Languages by Robert Harper</a></li>
</ul>

<p><br /></p>

<p>Overall, what I found truly amazing was that all the people I’ve talked to, without any exception, were genuinely encouraging and very much willing to help. It felt as if they were freely offering their service without asking for anything in return. Almost all the professors and PhD students I’ve talked to mentioned that I can reach out to them anytime in the future, if I need their help. I personally don’t know much about how other fields are like. But, I have been so touched and have this feeling that, going forward, I will come to appreciate being part of the PL community even more.</p>

<p>Lastly, I would like to thank my advisor, <a href="https://ilyasergey.net/"><em>Ilya Sergey</em></a>, for encouraging me to reach out to mentors via PLDI <code class="language-plaintext highlighter-rouge">#mentoring</code>, as well as the following professors, professionals, and PhD students for their guidance:
<a href="https://karimali.ca/"><em>Karim Ali</em></a>, <a href="https://www.cs.purdue.edu/homes/bendy/"><em>Benjamin Delaware</em></a>, <a href="https://ranjitjhala.github.io/"><em>Ranjit Jhala</em></a>, <a href="https://cp.kaist.ac.kr/jeehoon.kang/"><em>Jeehoon Kang</em></a>, <a href="https://koronkevi.ch/"><em>Paulette Koronkevich</em></a>, <a href="https://users.soe.ucsc.edu/~lkuper/"><em>Lindsey Kuper</em></a>, <a href="https://www.cs.rutgers.edu/~santosh.nagarakatte/"><em>Santosh Nagarakatte</em></a>, <a href="https://mangpo.net/"><em>Phitchaya Mangpo Phothilimthana</em></a>, <a href="https://cseweb.ucsd.edu/~npolikarpova/"><em>Nadia Polikarpova</em></a>, <a href="https://www.cs.purdue.edu/homes/roopsha/"><em>Roopsha Samanta</em></a>, <a href="http://ks.cs.uchicago.edu/"><em>Kartik Singhal</em></a>, <a href="https://manu.sridharan.net/"><em>Manu Sridharan</em></a>, <a href="http://blog.emmatosch.com/bio.html"><em>Emma Tosch</em></a>, and <a href="https://web.eecs.umich.edu/~xwangsd/"><em>Xinyu Wang</em></a>.</p>]]></content><author><name>Yunjeong Lee</name><email>yunjeong.lee@u.nus.edu</email></author><category term="programming languages conference" /><category term="phd experience" /><summary type="html"><![CDATA[Programming Language Design and Implementation (PLDI) this year (June 15-19, 2020) was held virtually due to COVID-19. I took this opportunity to attend the conference, but at the same time, I honestly did not expect to get much out of it. That’s because I thought the conference would be mostly about discussing publications of technical papers by much more experienced people in the field. Hence, I initially thought I’d give it a try and see what kind of work people publish in such a renowned conference as a way to get myself familiar with what I am expected to produce further down the road.]]></summary></entry></feed>