<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>完善程式｜林鼎淵 Dean Lin</title>
    <link>https://deanlin.net/tags/%E5%AE%8C%E5%96%84%E7%A8%8B%E5%BC%8F/</link>
    <image><url>https://deanlin.net/images/author_hu_aa256fc934e9a932.jpg</url><title>完善程式｜林鼎淵 Dean Lin</title><link>https://deanlin.net/tags/%E5%AE%8C%E5%96%84%E7%A8%8B%E5%BC%8F/</link><width>144</width><height>144</height></image>
    <description>林鼎淵（Dean Lin）的部落格：生成式 AI 企業內訓講師、外商資安公司軟體專家、7 本書作者。400 多篇文章用白話分享生成式 AI 實戰、Claude Code 與 Vibe Coding 教學、團隊合作與職場成長。</description>
    <generator>Hugo</generator>
    <language>zh-tw</language>
    <copyright>© 2020–2026 林鼎淵 Dean Lin</copyright>
    <lastBuildDate>Fri, 08 Oct 2021 08:34:07 +0800</lastBuildDate>
    <atom:link href="https://deanlin.net/tags/%E5%AE%8C%E5%96%84%E7%A8%8B%E5%BC%8F/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>[面試][白板題]設計一個簡易的抽獎程式</title>
      <link>https://deanlin.net/blog/202110/fullstack-career-notes-day-23/</link>
      <pubDate>Fri, 08 Oct 2021 08:34:07 +0800</pubDate>
      <guid>https://deanlin.net/blog/202110/fullstack-career-notes-day-23/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>職涯成長</category>
      <description>相比於系統設計，白板題往往需要寫出能夠運行的程式，或者提供面試官認為可行性高的演算法；大部分的白板題難度會落在 LeeCode Easy 的等級，有程式基礎的人基本上都能夠給出答案，但除了給出答案外，程式的正確率與執行效率也會列入評分。</description>
      <media:content url="https://deanlin.net/blog/202110/fullstack-career-notes-day-23/images/cover_hu_30d0e6a3c38c3069.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<blockquote>
<p>白板題跟系統設計問題的相同點，就是重視<mark>釐清問題</mark>與<code>溝通</code>。</p>
</blockquote>
<p>相比於系統設計，白板題往往需要寫出<mark>能夠運行的程式</mark>，或者提供面試官認為<mark>可行性高的演算法</mark>；大部分的白板題難度會落在 LeeCode Easy 的等級，有程式基礎的人基本上都能夠給出答案，但除了給出答案外，程式的<mark>正確率與執行效率</mark>也會列入評分。</p>
<p>本篇文章筆主要是分享<mark>答題思路</mark>以及<mark>完善程式</mark>，演算法並非筆者所擅長；如果想提升演算法的能力，除了買一本書好好閱讀外，同時也要去 LeetCode 刷題累積實戰經驗。</p>
<blockquote>
<p>有些公司是考 LeeCode Medium/Hard 等級的題目，除非天賦異稟；否則這個難度需要花大量時間（可能半年以上）練習，才能在現場穩定發揮。</p>
</blockquote>
<hr>
<h2 id="大綱">大綱<a class="h-anchor" href="#%e5%a4%a7%e7%b6%b1" aria-label="這個段落的連結"></a></h2>
<ol>
<li><strong>初探白板題</strong>
<ul>
<li>1.1 白板題的類型</li>
<li>1.2 過程有時比解答更重要</li>
</ul>
</li>
<li><strong>設計一個簡易的抽獎程式</strong>
<ul>
<li>2.1 問題敘述</li>
<li>2.2 面試官為什麼會問？</li>
<li>2.3 面試官想從答案確認什麼？</li>
<li>2.4 筆者提供的簡答</li>
</ul>
</li>
<li><strong>衍伸問題</strong>
<ul>
<li>3.1 如果使用者輸入的機率有小數點呢？</li>
<li>3.2 你有考慮到使用者可能輸入不合理的機率嗎？</li>
<li>3.3 你會用什麼方式來驗證程式的正確性？</li>
<li>3.4 留給讀者優化與思考的問題</li>
</ul>
</li>
</ol>
<hr>
<h2 class="h-nomark" id="1-初探白板題">1. 初探白板題<a class="h-anchor" href="#1-%e5%88%9d%e6%8e%a2%e7%99%bd%e6%9d%bf%e9%a1%8c" aria-label="這個段落的連結"></a></h2>
<h3 class="h-nomark" id="11-白板題的類型">1.1 白板題的類型<a class="h-anchor" href="#11-%e7%99%bd%e6%9d%bf%e9%a1%8c%e7%9a%84%e9%a1%9e%e5%9e%8b" aria-label="這個段落的連結"></a></h3>
<p>白板題大概分成以下幾種形式：</p>
<ul>
<li>
<p><strong>在白板回答</strong><br>通常用白板回答的只要寫出演算法跟架構就好。</p>
<blockquote>
<p>相較於其他形式，更注重與面試官的「溝通」與「確認問題」。</p>
</blockquote>
</li>
<li>
<p><strong>紙上作業</strong><br>用來觀察求職者在沒有 IDE 輔助下，是否具備寫程式的能力。</p>
<blockquote>
<p>現在的 IDE 實在太方便了，函式會自動補全、錯誤會直接 Highlight，很多工程師脫離 IDE 後真的是武功全廢。</p>
</blockquote>
</li>
<li>
<p><strong>上機考</strong><br>通常會給你一個時間限制，要求你在時間內寫出一個可以 Run 的 MVP；大多數的面試官會看著你寫 Code 的過程。</p>
<blockquote>
<p>有些人會因為不適應有人盯著寫程式，導致現場發揮失常。</p>
</blockquote>
</li>
</ul>
<hr>
<h3 class="h-nomark" id="12-解題過程比解答更重要">1.2 解題過程比解答更重要<a class="h-anchor" href="#12-%e8%a7%a3%e9%a1%8c%e9%81%8e%e7%a8%8b%e6%af%94%e8%a7%a3%e7%ad%94%e6%9b%b4%e9%87%8d%e8%a6%81" aria-label="這個段落的連結"></a></h3>
<p>也許你已經非常熟悉 LeeCode 的解題模式；但白板題跟 LeeCode 不同的地方在於<mark>通常沒有測資、題目相對模糊</mark>。</p>
<p>如果你接到題目就直接解題，可能會<mark>忽略一些隱性條件</mark>；在了解題目時如果發現模糊地帶，請與<mark>面試官釐清問題</mark>，有時自己想像出來的條件反而會增加題目的複雜度。</p>
<p>通常在你給出第一版的解答後，面試官會以你的解答為基礎<mark>循序漸進問一些延伸性的問題</mark>，這部分除了考核程式能力外，也是判斷求職者在開發過程中<mark>能否與團隊成員溝通</mark>；畢竟隨著專案規模的擴增，單打獨鬥的情境已不多見。</p>
<p>如果遇上你無法解決的白板題，請以積極的態度<mark>與面試官溝通你想到的解題方式和卡住的點</mark>；相比於求職者的程式能力，有些面試官更加看重求職者的<mark>人格特質</mark>；有些人也許程式能力不足，但能理解面試官的問題，並在討論過程中作出改善；若能在解題過程中被面試官<mark>視為有潛力的人才</mark>，也是有機會獲得 Offer 的。</p>
<blockquote>
<p><strong>備註 1</strong>：解題過程中並不是所有面試官都是以「討論」的形式與你溝通，有些是以「質問」的態度面對求職者；遇到用「質問」態度的面試官，你也要思考<mark>自己是否能夠與這樣的同事一起共事</mark>。</p>
</blockquote>
<blockquote>
<p><strong>備註 2</strong>：白板題需要有良好的程式基礎與抗壓性，才可能在面試現場表現優良。</p>
</blockquote>
<hr>
<h2 class="h-nomark" id="2-設計一個簡易的抽獎程式">2. 設計一個簡易的抽獎程式<a class="h-anchor" href="#2-%e8%a8%ad%e8%a8%88%e4%b8%80%e5%80%8b%e7%b0%a1%e6%98%93%e7%9a%84%e6%8a%bd%e7%8d%8e%e7%a8%8b%e5%bc%8f" aria-label="這個段落的連結"></a></h2>
<p>為了方便讀者閱讀與驗證，本篇文章以<code>上機考</code>的形式向大家分享。</p>
<h3 class="h-nomark" id="21-問題敘述">2.1 問題敘述<a class="h-anchor" href="#21-%e5%95%8f%e9%a1%8c%e6%95%98%e8%bf%b0" aria-label="這個段落的連結"></a></h3>
<p>請你設計一個抽獎系統，獎品有「一獎、二獎、三獎」，其餘都是感謝獎。</p>
<p>一獎、二獎、三獎的中獎機率可以自由輸入，若沒輸入則默認一獎（1%）、二獎（2%）、三獎（3%）。</p>
<p><strong>時間限制</strong>：5 分鐘</p>
<hr>
<h3 class="h-nomark" id="22-面試官為什麼會問">2.2 面試官為什麼會問？<a class="h-anchor" href="#22-%e9%9d%a2%e8%a9%a6%e5%ae%98%e7%82%ba%e4%bb%80%e9%ba%bc%e6%9c%83%e5%95%8f" aria-label="這個段落的連結"></a></h3>
<p>這個題目雖然簡單，卻有很多<mark>延伸的議題可以討論</mark>；是一個瞭解求職者<code>基本功</code>的經典題目。</p>
<hr>
<h3 class="h-nomark" id="23-面試官想從答案確認什麼">2.3 面試官想從答案確認什麼？<a class="h-anchor" href="#23-%e9%9d%a2%e8%a9%a6%e5%ae%98%e6%83%b3%e5%be%9e%e7%ad%94%e6%a1%88%e7%a2%ba%e8%aa%8d%e4%bb%80%e9%ba%bc" aria-label="這個段落的連結"></a></h3>
<ul>
<li>你的程式是否保留擴充空間</li>
<li>你會用什麼演算法解決這個問題</li>
<li>是否有驗證使用者輸入的參數</li>
<li>如何驗證你的程式是符合需求的</li>
</ul>
<hr>
<h3 class="h-nomark" id="24-筆者提供的簡答">2.4 筆者提供的簡答<a class="h-anchor" href="#24-%e7%ad%86%e8%80%85%e6%8f%90%e4%be%9b%e7%9a%84%e7%b0%a1%e7%ad%94" aria-label="這個段落的連結"></a></h3>
<p>在面對白板題時，筆者是<mark>先求有再求好</mark>；如果一昧追求高效但自己不熟悉的演算法，有時會有意想不到的錯誤。</p>
<p>筆者的邏輯是先把籤放入籤筒，再透過亂數抽獎印出結果，以符合題目的基礎要求為目標：</p>
<ul>
<li>使用者可以透過<mark>調整參數</mark>變更中獎機率。</li>
<li>有<code>默認</code>的中獎機率：一獎（1%）、二獎（2%）、三獎（3%）。</li>
<li>用 <code>Math.random()</code> 函式模擬亂數抽獎。</li>
<li>會印出<mark>中獎結果</mark>。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic">// 寫一個函式，有默認的抽獎機率：一獎(1%)、二獎(2%)、三獎(3%)
</span></span></span><span style="display:flex;"><span><span style="color:#ff7b72">function</span> lottery(first_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">1</span>, second_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">2</span>, third_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">3</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> lickbox <span style="color:#ff7b72;font-weight:bold">=</span> [];
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 放入籤筒
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">for</span> (<span style="color:#ff7b72">var</span> i <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">0</span>; i <span style="color:#ff7b72;font-weight:bold">&lt;</span> <span style="color:#a5d6ff">100</span>; i<span style="color:#ff7b72;font-weight:bold">++</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">if</span> (first_prize <span style="color:#ff7b72;font-weight:bold">!==</span> <span style="color:#a5d6ff">0</span>) {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;一獎&#34;</span>);
</span></span><span style="display:flex;"><span>      first_prize<span style="color:#ff7b72;font-weight:bold">--</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> <span style="color:#ff7b72">if</span> (second_prize <span style="color:#ff7b72;font-weight:bold">!==</span> <span style="color:#a5d6ff">0</span>) {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;二獎&#34;</span>);
</span></span><span style="display:flex;"><span>      second_prize<span style="color:#ff7b72;font-weight:bold">--</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> <span style="color:#ff7b72">if</span> (third_prize <span style="color:#ff7b72;font-weight:bold">!==</span> <span style="color:#a5d6ff">0</span>) {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;三獎&#34;</span>);
</span></span><span style="display:flex;"><span>      third_prize<span style="color:#ff7b72;font-weight:bold">--</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;感謝獎&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 抽獎
</span></span></span><span style="display:flex;"><span>  console.log(lickbox[Math.floor(Math.random() <span style="color:#ff7b72;font-weight:bold">*</span> <span style="color:#a5d6ff">99</span>)]);
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>lottery();
</span></span></code></pre></div><p>上面的程式先不論演算法優劣，<mark>還有許多細節是沒有被考慮到的</mark>；在完成 MVP 後有些面試官會先問你：「之前有寫過類似的程式嗎？」如果沒有相關經驗就老實說沒有吧；接下來面試官會以這個程式為基礎，跟你討論哪裡還可以做改善。</p>
<hr>
<h2 class="h-nomark" id="3-衍伸問題">3. 衍伸問題<a class="h-anchor" href="#3-%e8%a1%8d%e4%bc%b8%e5%95%8f%e9%a1%8c" aria-label="這個段落的連結"></a></h2>
<h3 class="h-nomark" id="31-如果使用者輸入的機率有小數點呢">3.1 如果使用者輸入的機率有小數點呢？<a class="h-anchor" href="#31-%e5%a6%82%e6%9e%9c%e4%bd%bf%e7%94%a8%e8%80%85%e8%bc%b8%e5%85%a5%e7%9a%84%e6%a9%9f%e7%8e%87%e6%9c%89%e5%b0%8f%e6%95%b8%e9%bb%9e%e5%91%a2" aria-label="這個段落的連結"></a></h3>
<p><mark>考點：求職者對浮點數的處理</mark></p>
<p>很顯然，如果使用者輸入的機率包含小數點，現在的函式無法應付，下面是筆者的處理方式：</p>
<ul>
<li>取得輸入得獎機率中<mark>最長的小數點</mark>有幾位（N）。</li>
<li>將所有得獎機率乘以 10 的 N 次方，這樣機率<mark>就沒有小數點</mark>了。</li>
<li>將 10 的 N 次方再乘以 100，以此為<mark>籤筒的總數量</mark>。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#ff7b72">function</span> lottery(first_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">1</span>, second_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">2</span>, third_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">3</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 取得最長小數點
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> tmp <span style="color:#ff7b72;font-weight:bold">=</span> [first_prize, second_prize, third_prize];
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> longest <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">0</span>;
</span></span><span style="display:flex;"><span>  tmp.forEach((prize) =&gt; {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">let</span> after_point <span style="color:#ff7b72;font-weight:bold">=</span> prize.toString().split(<span style="color:#a5d6ff">&#34;.&#34;</span>)[<span style="color:#a5d6ff">1</span>];
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">if</span> (after_point) {
</span></span><span style="display:flex;"><span>      <span style="color:#ff7b72">if</span> (after_point.length <span style="color:#ff7b72;font-weight:bold">&gt;</span> longest) {
</span></span><span style="display:flex;"><span>        longest <span style="color:#ff7b72;font-weight:bold">=</span> after_point.length;
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  });
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 讓機率變整數
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> multiple <span style="color:#ff7b72;font-weight:bold">=</span> Math.pow(<span style="color:#a5d6ff">10</span>, longest);
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 沒有用 Math.floor 會出現 js 小數點結尾的 bug，ex:11100.000000000002
</span></span></span><span style="display:flex;"><span>  first_prize <span style="color:#ff7b72;font-weight:bold">=</span> Math.floor(first_prize <span style="color:#ff7b72;font-weight:bold">*</span> multiple);
</span></span><span style="display:flex;"><span>  second_prize <span style="color:#ff7b72;font-weight:bold">=</span> Math.floor(second_prize <span style="color:#ff7b72;font-weight:bold">*</span> multiple);
</span></span><span style="display:flex;"><span>  third_prize <span style="color:#ff7b72;font-weight:bold">=</span> Math.floor(third_prize <span style="color:#ff7b72;font-weight:bold">*</span> multiple);
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 籤筒的總數量
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> max <span style="color:#ff7b72;font-weight:bold">=</span> multiple <span style="color:#ff7b72;font-weight:bold">*</span> <span style="color:#a5d6ff">100</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> lickbox <span style="color:#ff7b72;font-weight:bold">=</span> [];
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 放入籤筒
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">for</span> (<span style="color:#ff7b72">var</span> i <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">0</span>; i <span style="color:#ff7b72;font-weight:bold">&lt;</span> max; i<span style="color:#ff7b72;font-weight:bold">++</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">if</span> (first_prize <span style="color:#ff7b72;font-weight:bold">!==</span> <span style="color:#a5d6ff">0</span>) {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;一獎&#34;</span>);
</span></span><span style="display:flex;"><span>      first_prize<span style="color:#ff7b72;font-weight:bold">--</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> <span style="color:#ff7b72">if</span> (second_prize <span style="color:#ff7b72;font-weight:bold">!==</span> <span style="color:#a5d6ff">0</span>) {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;二獎&#34;</span>);
</span></span><span style="display:flex;"><span>      second_prize<span style="color:#ff7b72;font-weight:bold">--</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> <span style="color:#ff7b72">if</span> (third_prize <span style="color:#ff7b72;font-weight:bold">!==</span> <span style="color:#a5d6ff">0</span>) {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;三獎&#34;</span>);
</span></span><span style="display:flex;"><span>      third_prize<span style="color:#ff7b72;font-weight:bold">--</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;感謝獎&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 抽獎
</span></span></span><span style="display:flex;"><span>  console.log(lickbox[Math.floor(Math.random() <span style="color:#ff7b72;font-weight:bold">*</span> (max <span style="color:#ff7b72;font-weight:bold">-</span> <span style="color:#a5d6ff">1</span>))]);
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>lottery(<span style="color:#a5d6ff">1.11</span>, <span style="color:#a5d6ff">2.34</span>, <span style="color:#a5d6ff">3.567</span>);
</span></span></code></pre></div><hr>
<h3 class="h-nomark" id="32-你有考慮到使用者可能輸入不合理的機率嗎">3.2 你有考慮到使用者可能輸入不合理的機率嗎？<a class="h-anchor" href="#32-%e4%bd%a0%e6%9c%89%e8%80%83%e6%85%ae%e5%88%b0%e4%bd%bf%e7%94%a8%e8%80%85%e5%8f%af%e8%83%bd%e8%bc%b8%e5%85%a5%e4%b8%8d%e5%90%88%e7%90%86%e7%9a%84%e6%a9%9f%e7%8e%87%e5%97%8e" aria-label="這個段落的連結"></a></h3>
<p><mark>考點：能舉例會發生錯誤的情境，並設計程式來驗證傳入的參數</mark></p>
<p>如果沒有對輸入參數做驗證，程式的穩定性真的是極低，下面列舉幾個要做的基礎驗證：</p>
<ul>
<li><mark>中獎機率不可能超過 100%</mark>，如果一獎、二獎、三獎加起來超過 100 是不合理的。</li>
<li><mark>中獎機率要是正數</mark>，輸入負的機率也是不合理。</li>
<li>如果參數輸入<mark>文字或是符號就一定是錯的</mark>。</li>
</ul>
<p>這邊筆者透過撰寫一個函式（validate_input）來驗證輸入的參數，如果<mark>不符規則就會跳出錯誤訊息</mark>。</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#ff7b72">function</span> validate_input(first_prize, second_prize, third_prize) {
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 確認是否為正數
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">var</span> reg <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#79c0ff">/^(?=.+)(?:[1-9]\d*|0)?(?:\.\d+)?$/</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">if</span> (<span style="color:#ff7b72;font-weight:bold">!</span>(reg.test(first_prize) <span style="color:#ff7b72;font-weight:bold">&amp;&amp;</span> reg.test(second_prize) <span style="color:#ff7b72;font-weight:bold">&amp;&amp;</span> reg.test(third_prize))) {
</span></span><span style="display:flex;"><span>    console.log(<span style="color:#a5d6ff">&#34;請確認輸入參數皆為正數！&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">return</span> <span style="color:#79c0ff">false</span>;
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 確認沒爆表
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">if</span> (first_prize <span style="color:#ff7b72;font-weight:bold">+</span> second_prize <span style="color:#ff7b72;font-weight:bold">+</span> third_prize <span style="color:#ff7b72;font-weight:bold">&gt;</span> <span style="color:#a5d6ff">100</span>) {
</span></span><span style="display:flex;"><span>    console.log(<span style="color:#a5d6ff">&#34;中獎機率超過 100 %，爆表了！&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">return</span> <span style="color:#79c0ff">false</span>;
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">return</span> <span style="color:#79c0ff">true</span>;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">const</span> argsArray <span style="color:#ff7b72;font-weight:bold">=</span> [
</span></span><span style="display:flex;"><span>  [<span style="color:#a5d6ff">100</span>, <span style="color:#a5d6ff">2.34</span>, <span style="color:#a5d6ff">3.567</span>], <span style="color:#8b949e;font-style:italic">//中獎率不可能超過100
</span></span></span><span style="display:flex;"><span>  [<span style="color:#ff7b72;font-weight:bold">-</span><span style="color:#a5d6ff">1</span>, <span style="color:#a5d6ff">2.34</span>, <span style="color:#a5d6ff">3.567</span>], <span style="color:#8b949e;font-style:italic">//機率不可為負
</span></span></span><span style="display:flex;"><span>  [<span style="color:#a5d6ff">1</span>, <span style="color:#a5d6ff">&#34;錯誤&#34;</span>, <span style="color:#a5d6ff">3.567</span>], <span style="color:#8b949e;font-style:italic">//含有文字
</span></span></span><span style="display:flex;"><span>  [<span style="color:#a5d6ff">1</span>, <span style="color:#a5d6ff">2.34</span>, <span style="color:#a5d6ff">3.567</span>],
</span></span><span style="display:flex;"><span>];
</span></span><span style="display:flex;"><span>argsArray.forEach((args) =&gt; {
</span></span><span style="display:flex;"><span>  console.log(<span style="color:#a5d6ff">&#34;驗證: &#34;</span> <span style="color:#ff7b72;font-weight:bold">+</span> args);
</span></span><span style="display:flex;"><span>  validate_input.apply(<span style="color:#ff7b72">this</span>, args);
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><hr>
<h3 class="h-nomark" id="33-你會用什麼方式來驗證程式的正確性">3.3 你會用什麼方式來驗證程式的正確性？<a class="h-anchor" href="#33-%e4%bd%a0%e6%9c%83%e7%94%a8%e4%bb%80%e9%ba%bc%e6%96%b9%e5%bc%8f%e4%be%86%e9%a9%97%e8%ad%89%e7%a8%8b%e5%bc%8f%e7%9a%84%e6%ad%a3%e7%a2%ba%e6%80%a7" aria-label="這個段落的連結"></a></h3>
<p><mark>考點：是否有自動化的測試方案來驗證程式</mark></p>
<p>程式的正確性並不是用嘴說的，面試官想了解你會用什麼方法<mark>驗證程式的正確性</mark>。</p>
<p>筆者這邊會寫一個測試函式來蒐集抽獎結果，並對原本程式做如下調整：</p>
<ul>
<li>籤筒會反覆使用，所以把它獨立成函式（initLickbox）。</li>
<li>lottery 函式改為純粹抽籤用。</li>
<li>建立測試函式（qa），可調整測試次數，在執行時會印出實際機率與期望機率的比對。</li>
</ul>
<p>這裡附上調整過的完整程式：</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#ff7b72">function</span> initLickbox(first_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">1</span>, second_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">2</span>, third_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">3</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 先驗證輸入參數
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">if</span> (<span style="color:#ff7b72;font-weight:bold">!</span>validate_input(first_prize, second_prize, third_prize)) {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">return</span>;
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 取得最長小數點
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> tmp <span style="color:#ff7b72;font-weight:bold">=</span> [first_prize, second_prize, third_prize];
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> longest <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">0</span>;
</span></span><span style="display:flex;"><span>  tmp.forEach((prize) =&gt; {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">let</span> after_point <span style="color:#ff7b72;font-weight:bold">=</span> prize.toString().split(<span style="color:#a5d6ff">&#34;.&#34;</span>)[<span style="color:#a5d6ff">1</span>];
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">if</span> (after_point) {
</span></span><span style="display:flex;"><span>      <span style="color:#ff7b72">if</span> (after_point.length <span style="color:#ff7b72;font-weight:bold">&gt;</span> longest) {
</span></span><span style="display:flex;"><span>        longest <span style="color:#ff7b72;font-weight:bold">=</span> after_point.length;
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  });
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 讓機率變整數
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> multiple <span style="color:#ff7b72;font-weight:bold">=</span> Math.pow(<span style="color:#a5d6ff">10</span>, longest);
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 沒有用 Math.floor 會出現 js 小數點結尾的 bug，ex:11100.000000000002
</span></span></span><span style="display:flex;"><span>  first_prize <span style="color:#ff7b72;font-weight:bold">=</span> Math.floor(first_prize <span style="color:#ff7b72;font-weight:bold">*</span> multiple);
</span></span><span style="display:flex;"><span>  second_prize <span style="color:#ff7b72;font-weight:bold">=</span> Math.floor(second_prize <span style="color:#ff7b72;font-weight:bold">*</span> multiple);
</span></span><span style="display:flex;"><span>  third_prize <span style="color:#ff7b72;font-weight:bold">=</span> Math.floor(third_prize <span style="color:#ff7b72;font-weight:bold">*</span> multiple);
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 籤筒的總數量
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> max <span style="color:#ff7b72;font-weight:bold">=</span> multiple <span style="color:#ff7b72;font-weight:bold">*</span> <span style="color:#a5d6ff">100</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> lickbox <span style="color:#ff7b72;font-weight:bold">=</span> [];
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 放入籤筒
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">for</span> (<span style="color:#ff7b72">var</span> i <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">0</span>; i <span style="color:#ff7b72;font-weight:bold">&lt;</span> max; i<span style="color:#ff7b72;font-weight:bold">++</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">if</span> (first_prize <span style="color:#ff7b72;font-weight:bold">!==</span> <span style="color:#a5d6ff">0</span>) {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;一獎&#34;</span>);
</span></span><span style="display:flex;"><span>      first_prize<span style="color:#ff7b72;font-weight:bold">--</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> <span style="color:#ff7b72">if</span> (second_prize <span style="color:#ff7b72;font-weight:bold">!==</span> <span style="color:#a5d6ff">0</span>) {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;二獎&#34;</span>);
</span></span><span style="display:flex;"><span>      second_prize<span style="color:#ff7b72;font-weight:bold">--</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> <span style="color:#ff7b72">if</span> (third_prize <span style="color:#ff7b72;font-weight:bold">!==</span> <span style="color:#a5d6ff">0</span>) {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;三獎&#34;</span>);
</span></span><span style="display:flex;"><span>      third_prize<span style="color:#ff7b72;font-weight:bold">--</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> {
</span></span><span style="display:flex;"><span>      lickbox.push(<span style="color:#a5d6ff">&#34;感謝獎&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">return</span> lickbox;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">function</span> lottery(lickbox <span style="color:#ff7b72;font-weight:bold">=</span> []) {
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> max <span style="color:#ff7b72;font-weight:bold">=</span> lickbox.length;
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 抽獎
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> result <span style="color:#ff7b72;font-weight:bold">=</span> lickbox[Math.floor(Math.random() <span style="color:#ff7b72;font-weight:bold">*</span> (max <span style="color:#ff7b72;font-weight:bold">-</span> <span style="color:#a5d6ff">1</span>))];
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">return</span> result;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">function</span> validate_input(first_prize, second_prize, third_prize) {
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 確認是否為正數
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">var</span> reg <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#79c0ff">/^(?=.+)(?:[1-9]\d*|0)?(?:\.\d+)?$/</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">if</span> (<span style="color:#ff7b72;font-weight:bold">!</span>(reg.test(first_prize) <span style="color:#ff7b72;font-weight:bold">&amp;&amp;</span> reg.test(second_prize) <span style="color:#ff7b72;font-weight:bold">&amp;&amp;</span> reg.test(third_prize))) {
</span></span><span style="display:flex;"><span>    console.log(<span style="color:#a5d6ff">&#34;請確認輸入參數皆為正數！&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">return</span> <span style="color:#79c0ff">false</span>;
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 確認沒爆表
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">if</span> (first_prize <span style="color:#ff7b72;font-weight:bold">+</span> second_prize <span style="color:#ff7b72;font-weight:bold">+</span> third_prize <span style="color:#ff7b72;font-weight:bold">&gt;</span> <span style="color:#a5d6ff">100</span>) {
</span></span><span style="display:flex;"><span>    console.log(<span style="color:#a5d6ff">&#34;中獎機率超過 100 %，爆表了！&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">return</span> <span style="color:#79c0ff">false</span>;
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">return</span> <span style="color:#79c0ff">true</span>;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">function</span> qa(test_times <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">10000</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#8b949e;font-style:italic">// 設定中獎機率
</span></span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> first_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">1.5</span>,
</span></span><span style="display:flex;"><span>    second_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">2.33</span>,
</span></span><span style="display:flex;"><span>    third_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">3.98</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> thanks_prize <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">100</span> <span style="color:#ff7b72;font-weight:bold">-</span> first_prize <span style="color:#ff7b72;font-weight:bold">-</span> second_prize <span style="color:#ff7b72;font-weight:bold">-</span> third_prize;
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> lickbox <span style="color:#ff7b72;font-weight:bold">=</span> initLickbox(first_prize, second_prize, third_prize);
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">let</span> first <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">0</span>,
</span></span><span style="display:flex;"><span>    second <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">0</span>,
</span></span><span style="display:flex;"><span>    third <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">0</span>,
</span></span><span style="display:flex;"><span>    thanks <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">0</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#ff7b72">for</span> (<span style="color:#ff7b72">var</span> i <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">0</span>; i <span style="color:#ff7b72;font-weight:bold">&lt;</span> test_times; i<span style="color:#ff7b72;font-weight:bold">++</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">let</span> result <span style="color:#ff7b72;font-weight:bold">=</span> lottery(lickbox);
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">if</span> (result <span style="color:#ff7b72;font-weight:bold">==</span> <span style="color:#a5d6ff">&#34;一獎&#34;</span>) {
</span></span><span style="display:flex;"><span>      first<span style="color:#ff7b72;font-weight:bold">++</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> <span style="color:#ff7b72">if</span> (result <span style="color:#ff7b72;font-weight:bold">==</span> <span style="color:#a5d6ff">&#34;二獎&#34;</span>) {
</span></span><span style="display:flex;"><span>      second<span style="color:#ff7b72;font-weight:bold">++</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> <span style="color:#ff7b72">if</span> (result <span style="color:#ff7b72;font-weight:bold">==</span> <span style="color:#a5d6ff">&#34;三獎&#34;</span>) {
</span></span><span style="display:flex;"><span>      third<span style="color:#ff7b72;font-weight:bold">++</span>;
</span></span><span style="display:flex;"><span>    } <span style="color:#ff7b72">else</span> {
</span></span><span style="display:flex;"><span>      thanks<span style="color:#ff7b72;font-weight:bold">++</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  console.log(<span style="color:#a5d6ff">&#34;一獎:&#34;</span> <span style="color:#ff7b72;font-weight:bold">+</span> ((first <span style="color:#ff7b72;font-weight:bold">/</span> test_times) <span style="color:#ff7b72;font-weight:bold">*</span> <span style="color:#a5d6ff">100</span>).toFixed(<span style="color:#a5d6ff">2</span>) <span style="color:#ff7b72;font-weight:bold">+</span> <span style="color:#a5d6ff">&#34;% (&#34;</span> <span style="color:#ff7b72;font-weight:bold">+</span> first_prize <span style="color:#ff7b72;font-weight:bold">+</span> <span style="color:#a5d6ff">&#34;%)&#34;</span>);
</span></span><span style="display:flex;"><span>  console.log(<span style="color:#a5d6ff">&#34;二獎:&#34;</span> <span style="color:#ff7b72;font-weight:bold">+</span> ((second <span style="color:#ff7b72;font-weight:bold">/</span> test_times) <span style="color:#ff7b72;font-weight:bold">*</span> <span style="color:#a5d6ff">100</span>).toFixed(<span style="color:#a5d6ff">2</span>) <span style="color:#ff7b72;font-weight:bold">+</span> <span style="color:#a5d6ff">&#34;% (&#34;</span> <span style="color:#ff7b72;font-weight:bold">+</span> second_prize <span style="color:#ff7b72;font-weight:bold">+</span> <span style="color:#a5d6ff">&#34;%)&#34;</span>);
</span></span><span style="display:flex;"><span>  console.log(<span style="color:#a5d6ff">&#34;三獎:&#34;</span> <span style="color:#ff7b72;font-weight:bold">+</span> ((third <span style="color:#ff7b72;font-weight:bold">/</span> test_times) <span style="color:#ff7b72;font-weight:bold">*</span> <span style="color:#a5d6ff">100</span>).toFixed(<span style="color:#a5d6ff">2</span>) <span style="color:#ff7b72;font-weight:bold">+</span> <span style="color:#a5d6ff">&#34;% (&#34;</span> <span style="color:#ff7b72;font-weight:bold">+</span> third_prize <span style="color:#ff7b72;font-weight:bold">+</span> <span style="color:#a5d6ff">&#34;%)&#34;</span>);
</span></span><span style="display:flex;"><span>  console.log(<span style="color:#a5d6ff">&#34;感謝獎:&#34;</span> <span style="color:#ff7b72;font-weight:bold">+</span> ((thanks <span style="color:#ff7b72;font-weight:bold">/</span> test_times) <span style="color:#ff7b72;font-weight:bold">*</span> <span style="color:#a5d6ff">100</span>).toFixed(<span style="color:#a5d6ff">2</span>) <span style="color:#ff7b72;font-weight:bold">+</span> <span style="color:#a5d6ff">&#34;% (&#34;</span> <span style="color:#ff7b72;font-weight:bold">+</span> thanks_prize <span style="color:#ff7b72;font-weight:bold">+</span> <span style="color:#a5d6ff">&#34;%)&#34;</span>);
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>qa();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic">// console.log(lottery(initLickbox()))
</span></span></span></code></pre></div><p>圖片為程式測試的結果：</p>
<p><img src="https://deanlin.net/blog/202110/fullstack-career-notes-day-23/images/fullstack-career-notes-day-23-01.webp" width="976" height="145" alt="3.3 你會用什麼方式來驗證程式的正確性？（圖 1）" fetchpriority="high" decoding="async"></p>
<hr>
<h3 class="h-nomark" id="34-留給讀者優化與思考的問題">3.4 留給讀者優化與思考的問題<a class="h-anchor" href="#34-%e7%95%99%e7%b5%a6%e8%ae%80%e8%80%85%e5%84%aa%e5%8c%96%e8%88%87%e6%80%9d%e8%80%83%e7%9a%84%e5%95%8f%e9%a1%8c" aria-label="這個段落的連結"></a></h3>
<p>上面只是筆者在面對白板題時的簡單發想，這邊還有一些問題留給讀者思考：</p>
<ul>
<li>需不需要限制浮點數在小數點後的位數？</li>
<li>筆者的解決方案超級土法煉鋼，有沒有更好的演算法可以優化？</li>
<li>如果改成抽籤不放回的機制，程式要如何調整？</li>
<li>假使有四獎、五獎、六獎&hellip;程式架構要如何優化？</li>
</ul>
<p>即使是抽獎系統這種看似簡單的題目，如果深入探討還是有許多的細節需要完善。</p>
<p>筆者上面所提出的<mark>衍伸問題</mark>，其實是求職者<mark>一開始要跟面試官釐清的細節</mark>，如果能夠在開始作業前就<mark>定義好需求</mark>，在開發的過程中就能<mark>避免不合適的設計</mark>。</p>
<p>不過有些面試官會傾向等求職者<mark>完成 MVP 後再做細節討論</mark>，筆者就曾遇過面試官出完白板題後就離開 15 分鐘讓求職者作答；所以實際狀況還是需要讀者在現場<mark>隨機應變</mark>。</p>
<hr>
<p>感謝大家的閱讀，如果喜歡我的文章可以<code>訂閱</code>接收通知；如果有幫助到你，按<code>Like</code>可以讓我更有寫文的動力，我們明天見～</p>
<hr>
<blockquote>
<p><img src="https://deanlin.net/blog/202110/fullstack-career-notes-day-23/images/fullstack-career-notes-day-23-02.webp" width="1024" height="233" alt="3.4 留給讀者優化與思考的問題（圖 2）" loading="lazy" decoding="async"></p>
<p>在許多人的幫助下，本系列文章已成功出版，除了添加新的篇章，更完善了每個案例的應對進退；如果對現在的職涯感到迷茫，也許這本書能帶給你不一樣的觀點～</p>
<p><strong>天瓏書局：</strong> <a href="https://www.tenlong.com.tw/products/9786263334571">https://www.tenlong.com.tw/products/9786263334571</a></p>
</blockquote>
]]></content:encoded>
    </item>
  </channel>
</rss>
