<?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>Framework｜林鼎淵 Dean Lin</title>
    <link>https://deanlin.net/tags/framework/</link>
    <image><url>https://deanlin.net/images/author_hu_aa256fc934e9a932.jpg</url><title>Framework｜林鼎淵 Dean Lin</title><link>https://deanlin.net/tags/framework/</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>Mon, 23 May 2022 17:39:55 +0800</lastBuildDate>
    <atom:link href="https://deanlin.net/tags/framework/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>用新技術前請先閱讀官方文檔</title>
      <link>https://deanlin.net/blog/202205/read-the-official-docs-first/</link>
      <pubDate>Mon, 23 May 2022 17:39:55 +0800</pubDate>
      <guid>https://deanlin.net/blog/202205/read-the-official-docs-first/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>職涯成長</category>
      <description>有時我們覺得某個框架、套件很難用，常常寫到一半就卡住；除了可能是它本身設計的問題外，很多時候是因為沒仔細看官方文檔，導致我們拋棄好用的現成方案，選擇了一條孤獨難走的道路。</description>
      <media:content url="https://deanlin.net/blog/202205/read-the-official-docs-first/images/read-the-official-docs-first-og_hu_7de1b3d30d6cf148.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<p>有時我們覺得某個框架、套件很難用，常常寫到一半就卡住；除了可能是它本身設計的問題外，很多時候是因為沒仔細看官方文檔，導致我們拋棄好用的現成方案，選擇了一條孤獨難走的道路。</p>
<p><img src="https://deanlin.net/blog/202205/read-the-official-docs-first/images/read-the-official-docs-first-01.webp" width="1280" height="679" alt="用新技術前請先閱讀官方文檔（圖 1）" fetchpriority="high" decoding="async"></p>
<pre tabindex="0"><code>大綱
ㄧ、別談技術，先來看看筆者發生的蠢事
二、也許不是關關難過，而是從沒看過
三、如果方向是錯的，那離目標會越來越遠
四、總結
</code></pre><h2 id="ㄧ別談技術先來看看筆者發生的蠢事">ㄧ、別談技術，先來看看筆者發生的蠢事<a class="h-anchor" href="#%e3%84%a7%e5%88%a5%e8%ab%87%e6%8a%80%e8%a1%93%e5%85%88%e4%be%86%e7%9c%8b%e7%9c%8b%e7%ad%86%e8%80%85%e7%99%bc%e7%94%9f%e7%9a%84%e8%a0%a2%e4%ba%8b" aria-label="這個段落的連結"></a></h2>
<p>筆者過去購買家電時有個壞習慣，就是幾乎不看說明書；總覺得憑藉自己的理工頭腦可以輕鬆駕馭這些產品。</p>
<p>儘管大多數的狀況下我都能無師自通，但現實生活總是會找機會賞你幾個巴掌，有時我沾沾自喜的用法，過一段時間才發現根本是錯誤的。</p>
<p>就拿吸塵器來舉例好了，現代的吸塵器往往是多功能的，吸地、吸床單、吸鍵盤各有不同的吸頭；自以為聰明的我，認為吸附面積最大的頭一定是拿來吸地板的，但用了一陣子後總覺得馬力不夠，地板上常常有灰塵很難吸起來。</p>
<p>此時我去看說明書才明白，原來我一直拿吸床單的頭來吸地板！？儘管這樣也能使用，但卻無法發揮出每個吸頭應有的功效。</p>
<blockquote class="pullquote"><p><code>會發生這個蠢事，就是因為我覺得這個東西很簡單，沒必要看說明書。</code></p>
</blockquote>
<hr>
<h2 id="二也許不是關關難過而是從沒看過">二、也許不是關關難過，而是從沒看過<a class="h-anchor" href="#%e4%ba%8c%e4%b9%9f%e8%a8%b1%e4%b8%8d%e6%98%af%e9%97%9c%e9%97%9c%e9%9b%a3%e9%81%8e%e8%80%8c%e6%98%af%e5%be%9e%e6%b2%92%e7%9c%8b%e9%81%8e" aria-label="這個段落的連結"></a></h2>
<p>現在的技術日新月異，很多時候開發人員真的沒時間慢慢看文檔。</p>
<p>如果今天的需求較為簡單，那可能用套件的範例程式就能解決；但萬一需求較為複雜，那勢必要更深入的研究套件。</p>
<p>理論上是這麼說，但實際上有不少工程師，是選擇投入大量精力在魔改基礎的範例程式，而非去深入閱讀官方文檔。</p>
<p>就拿前端（Vue.js）來舉例，框架提供的 Component 有很多的 Props 可以使用；但很多人會選擇自己用 watch、computed 刻出一樣的功能。</p>
<p>一個問題往往有多種解決方案，但站在筆者的角度，除非框架沒有提供 Solution，不然盡量不要自己手刻，這些多餘的程式碼會導致日後的維護更加困難。</p>
<blockquote class="pullquote"><p><code>遇到需求請先閱讀官方文檔，很多時候有更省力的解決方案。</code></p>
</blockquote>
<hr>
<h2 id="三如果方向是錯的那離目標會越來越遠">三、如果方向是錯的，那離目標會越來越遠<a class="h-anchor" href="#%e4%b8%89%e5%a6%82%e6%9e%9c%e6%96%b9%e5%90%91%e6%98%af%e9%8c%af%e7%9a%84%e9%82%a3%e9%9b%a2%e7%9b%ae%e6%a8%99%e6%9c%83%e8%b6%8a%e4%be%86%e8%b6%8a%e9%81%a0" aria-label="這個段落的連結"></a></h2>
<blockquote>
<p>如果你人在台中，接下來打算前往台南；但車子卻一直往北開，你認為什麼時候才會抵達目的地？</p>
</blockquote>
<p>前兩個案例，我們只是在解決問題的路上多花一點力氣；但在這個案例，是整個團隊白費力氣。</p>
<p>幾年前筆者曾選擇 Adonis.js 這個 Node.js 的框架來開發後端，前期開發的很順利，但隨著專案結構越來越複雜，我們發現這個框架缺少許多實用的功能，甚至還遇到不少需要等待作者維修的 Bug。</p>
<p>儘管當時已經使用它開發了 3 個月，但最終開發團隊還是決定忍痛放棄，跳槽到其他穩定的框架；而這次的失誤，導致系統架構要重新設計，不少程式需要重新撰寫。</p>
<blockquote class="pullquote"><p><code>會發生這個慘劇，是因為貿然選擇了一個不夠成熟的框架，且事前評估不足就直接投入開發。</code></p>
</blockquote>
<hr>
<h2 id="四總結">四、總結<a class="h-anchor" href="#%e5%9b%9b%e7%b8%bd%e7%b5%90" aria-label="這個段落的連結"></a></h2>
<p>古人是因為缺少前人的經驗，才需要靠自己試錯來尋找答案。</p>
<p>現在資訊這麼發達，大部分的坑都有前輩幫你踩過了，沒必要親自去體驗。</p>
<p>儘管讀文檔要花費不少時間，但在很多時候它可以幫你解省更多時間。</p>
<blockquote>
<p>磨刀不誤砍柴工，古人的話別當耳邊風。</p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>[面試][後端]你會的後端框架不只一個，可以說明一下它們之間的差異嗎？</title>
      <link>https://deanlin.net/blog/202109/fullstack-career-notes-day-13/</link>
      <pubDate>Tue, 28 Sep 2021 08:52:51 +0800</pubDate>
      <guid>https://deanlin.net/blog/202109/fullstack-career-notes-day-13/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>職涯成長</category>
      <description>工程師真的很難，會得不多會被問為什麼沒學，會得很多還要被質疑專業程度；這種比較類型的問題，除非你有事先做功課，不然就算你都會用也未必能在現場對答如流。</description>
      <media:content url="https://deanlin.net/blog/202109/fullstack-career-notes-day-13/images/cover_hu_fd19aa6d1c00a16c.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<blockquote>
<p>你是十八般武藝樣樣精通，還是樣樣通樣樣鬆？</p>
</blockquote>
<p>工程師真的很難，會得不多會被問為什麼沒學，會得很多還要被質疑專業程度；這種比較類型的問題，除非你有事先做功課，不然就算你都會用也未必能在現場對答如流。</p>
<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>
<li>1.3 筆者提供的簡答</li>
</ul>
</li>
<li><strong>回答問題所需具備的知識</strong>
<ul>
<li>2.1 PHP VS Node.js</li>
<li>2.2 用 supervisor 讓 Node.js 熱更新</li>
<li>2.3 不一定要拼個誰輸誰贏</li>
</ul>
</li>
<li><strong>衍伸問題</strong>
<ul>
<li>3.1 既然你先學了 Node.js 的框架，為何後來改用 PHP 的框架？</li>
<li>3.2 使用框架有什麼好處跟壞處？</li>
</ul>
</li>
</ol>
<hr>
<h2 class="h-nomark" id="1-你會的後端框架不只一個可以說明一下它們之間的差異嗎">1. 你會的後端框架不只一個，可以說明一下它們之間的差異嗎？<a class="h-anchor" href="#1-%e4%bd%a0%e6%9c%83%e7%9a%84%e5%be%8c%e7%ab%af%e6%a1%86%e6%9e%b6%e4%b8%8d%e5%8f%aa%e4%b8%80%e5%80%8b%e5%8f%af%e4%bb%a5%e8%aa%aa%e6%98%8e%e4%b8%80%e4%b8%8b%e5%ae%83%e5%80%91%e4%b9%8b%e9%96%93%e7%9a%84%e5%b7%ae%e7%95%b0%e5%97%8e" aria-label="這個段落的連結"></a></h2>
<h3 class="h-nomark" id="11-面試官為什麼會問">1.1 面試官為什麼會問？<a class="h-anchor" href="#11-%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>中顯示求職者會如下的後端（Backend）框架：</p>
<ul>
<li>PHP：Laravel</li>
<li>Node.js：Express.js、AdonisJS</li>
</ul>
<p>當你會的東西多，面試官就會想了解你是每個都學一點，還是真的了解它。</p>
<hr>
<h3 class="h-nomark" id="12-面試官想從答案確認什麼">1.2 面試官想從答案確認什麼？<a class="h-anchor" href="#12-%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>能否簡單敘述 PHP 與 Node.js 的差異</li>
<li>舉例過去用這些框架做過哪些專案或是功能</li>
<li>為什麼會學習新的框架</li>
</ul>
<hr>
<h3 class="h-nomark" id="13-筆者提供的簡答">1.3 筆者提供的簡答<a class="h-anchor" href="#13-%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>之前使用 <code>PHP 的 Laravel 框架</code>開發過內部管理系統，也曾用 <code>Node.js 的 Express.js 框架</code>完成過餐廳點餐系統。</p>
<p>兩者的<mark>差異主要因為程式語言</mark>而產生的，PHP 是同步語言、多執行緒，Node.js 是一個能執行 JavaScript 的環境，支援非同步，為單執行緒。</p>
<p>如果專案要求<mark>穩定一致的效能</mark>，我會偏向使用 PHP 框架；而如果要<mark>承接高流量</mark>，我會選擇 Node.js 框架。</p>
<hr>
<h2 class="h-nomark" id="2-回答問題所需具備的知識">2. 回答問題所需具備的知識<a class="h-anchor" href="#2-%e5%9b%9e%e7%ad%94%e5%95%8f%e9%a1%8c%e6%89%80%e9%9c%80%e5%85%b7%e5%82%99%e7%9a%84%e7%9f%a5%e8%ad%98" aria-label="這個段落的連結"></a></h2>
<h3 class="h-nomark" id="21-php-vs-nodejs">2.1 PHP VS Node.js<a class="h-anchor" href="#21-php-vs-nodejs" aria-label="這個段落的連結"></a></h3>
<p>如果面對一個問題只有<mark>一種解決方案</mark>時，面試官會<mark>深入詢問</mark>這個技術；但如果面對問題有<mark>兩個以上的解決方案</mark>，他就會問你在<mark>不同情境</mark>下該使用什麼技術，每個技術都有各自的優勢，這邊我們就從不同的角度來做分析吧～</p>
<ul>
<li><strong>同步的 PHP vs 異步的 Node.js</strong>
<ul>
<li>同步的 PHP 會為每個 Request 建立一個 thread，每個 thread 都會消耗記憶體，也就是說如果想要服務更多的客戶就要花心思在<mark>硬體設備</mark>上。</li>
<li>異步的 Node.js 是非阻塞 (non-blocking) I/O 設計，搭配上 Event Loop 可以用一句很形象的話說明：「與其人多但好多人閒著；還不如一個人拼命往死裡做。」</li>
</ul>
</li>
<li><strong>多執行緒的 PHP VS 單執行緒的 Node.js</strong>
<ul>
<li>
<p><strong>多執行緒 (multi-threaded)的 PHP</strong><br>使用阻塞 (blocking) I/O 的設計</p>
<blockquote>
<p>PHP 可以為每個 Request 都開一個執行緒；如果你想要實現非阻塞也能透過 <a href="https://reactphp.org/">reactPHP</a> 來實現。</p>
</blockquote>
</li>
<li>
<p><strong>單執行緒 (single-threaded)的 Node.js</strong><br>使用非阻塞 (non-blocking) I/O 設計 + 提供非同步 (asynchronous) 處理</p>
<blockquote>
<p>Node.js 原則上是單執行緒，但可以透過 <a href="https://pm2.keymetrics.io/">PM2</a> 的 Cluster Mode 達到多執行緒。</p>
</blockquote>
</li>
</ul>
</li>
<li><strong>應用場景</strong><br>從 Client 端與 Server 端的溝通頻率來做分析：
<ul>
<li><strong>溝通頻率不高</strong><br>PHP 是個不錯的選擇（ex：個人部落格，像 WordPress 就是用 PHP 寫的）。</li>
<li><strong>溝通頻率頻繁</strong><br>Node.js 更能激發性能（ex：single-page-application、聊天室）；它適合大吞吐量的系統，較不適合需要大量 CPU 運算的系統。</li>
</ul>
</li>
<li><strong>可使用的資源</strong>
<ul>
<li>
<p><strong>PHP 有 Composer</strong><br>Composer 的命名方式：「所有者/package 名稱」</p>
</li>
<li>
<p><strong>Node.js 有 NPM</strong><br>NPM 的命名方式：「package 名稱」</p>
<blockquote>
<p>因為 NPM 的命名方式太自由，導致上面有很多的資源都是無效資源，<mark>關鍵字第一個找到的未必是最合適的</mark>。</p>
</blockquote>
</li>
</ul>
</li>
<li><strong>人才市場</strong>
<ul>
<li><strong>人才數量</strong><br>PHP 比 Node.js 早了 10 幾年發行，因此市場上使用 PHP 的人比使用 Node.js 的人更多；如果<mark>職位流動性高，用 PHP 開發</mark>會比較合適。</li>
<li><strong>薪資</strong><br>物以稀為貴，同樣都是新人，<code>會 Node.js 的薪水會略高於會 PHP</code> 的求職者。</li>
</ul>
</li>
<li><strong>專案容量</strong><br>用 Laravel 跟 Express.js 來比較：
<ul>
<li><strong>專案初期</strong><br>一開始 Laravel 因為包山包海所以專案體積較大。</li>
<li><strong>專案後期</strong><br>儘管 Express 是 Node.js 輕量級的框架，但因為<mark>實作過程往往要擴充一堆 package</mark>，而且一個 package 往往會有很多的 dependency；這些原因容易導致最終實作出來的是一個笨重的專案。</li>
</ul>
</li>
<li><strong>程式語言轉換</strong><br>除非你的運氣逆天，每次都剛好找到符合你技能樹的公司，而且這間公司專案用的技術還很固定；不然肯定要面對程式語言的轉換，這邊分享幾個轉換時要注意的重點。
<ul>
<li><strong>找類型相似的框架</strong><br>從 PHP 跳到 Node.js 一定會面臨諸多不適應；但如果你選擇的是跟 <mark>Laravel 很類似的 AdonisJS 框架</mark>，這份不適感會下降許多，反之亦然。</li>
<li><strong>語言語法</strong><br>如果你已經熟悉了一種程式語言，我覺得轉換到另外一個語言的學習成本不會太高；但許多<mark>內建函式都要重新學習、生命週期也要重新熟悉、錯誤處理的經驗也要重新累積</mark>。</li>
<li><strong>專案規模</strong><br>如果是只需要 CRUD 邏輯的小專案，那我覺得藉此多瞭解一門程式語言是一個很棒的機會；但如果面臨的是業務邏輯複雜的大專案，我強烈建議一定要選自己熟悉的程式語言，或者團隊中的扛霸子熟悉這門語言；不然出事根本沒人可以救得了。</li>
</ul>
</li>
<li><strong>效能</strong>
<ul>
<li><strong>響應速度</strong><br>Node.js 靠著 V8 引擎加上非同步的特型，擁有較快的響應速度。</li>
</ul>
</li>
<li><strong>面對錯誤的處理</strong>
<ul>
<li>
<p>PHP 遇到某個 Request 錯誤時，它只對這個 Request 產生影響。</p>
</li>
<li>
<p>Node.js 因為所有 Request 都在單執行緒的 Web-server 中，所以某個 Request 導致的未知錯誤就可能影響到整個 Server。</p>
<blockquote>
<p>不過這塊可以透過 PM2 的 Cluster Mode 與自動重啟來補救。</p>
</blockquote>
</li>
</ul>
</li>
<li><strong>熱更新</strong>
<ul>
<li>PHP 修改後，只要刷新頁面就能看到。</li>
<li>Node.js 預設沒有熱更新，需要關閉專案後重啟。</li>
</ul>
</li>
</ul>
<hr>
<h3 class="h-nomark" id="22-用-supervisor-讓-nodejs-熱更新">2.2 用 supervisor 讓 Node.js 熱更新<a class="h-anchor" href="#22-%e7%94%a8-supervisor-%e8%ae%93-nodejs-%e7%86%b1%e6%9b%b4%e6%96%b0" aria-label="這個段落的連結"></a></h3>
<p>在開發階段推薦使用 supervisor 這款套件。</p>
<ul>
<li>
<p><strong>STEP 1</strong>：在全域安裝套件<code>npm install supervisor -g</code></p>
</li>
<li>
<p><strong>STEP 2</strong>：建立一個<code>myapp.js</code>的檔案，並複製貼上下面程式</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">var</span> http <span style="color:#ff7b72;font-weight:bold">=</span> require(<span style="color:#a5d6ff">&#34;http&#34;</span>);
</span></span><span style="display:flex;"><span>http
</span></span><span style="display:flex;"><span>  .createServer(<span style="color:#ff7b72">function</span> (req, res) {
</span></span><span style="display:flex;"><span>    res.writeHead(<span style="color:#a5d6ff">200</span>, { <span style="color:#a5d6ff">&#34;Content-Type&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;text/plain&#34;</span> });
</span></span><span style="display:flex;"><span>    res.end(<span style="color:#a5d6ff">&#34;Hello World!&#34;</span>);
</span></span><span style="display:flex;"><span>  })
</span></span><span style="display:flex;"><span>  .listen(<span style="color:#a5d6ff">3000</span>, <span style="color:#a5d6ff">&#34;127.0.0.1&#34;</span>);
</span></span></code></pre></div></li>
<li>
<p><strong>STEP 3</strong>：用<code>node myapp.js</code>啟動程式後，修改<code>res.end(&quot;Hello World!&quot;);</code>的內容；再刷新網頁後<mark>內容不變</mark>。</p>
</li>
<li>
<p><strong>STEP 4</strong>：改用<code>supervisor myapp.js</code>啟動程式，修改<code>res.end(&quot;Hello World!&quot;);</code>的內容；再刷新網頁後<mark>內容更新</mark>。</p>
</li>
</ul>
<p>supervisor 也可以做專案資料夾的監控，但是要記得排除一些資料夾（ex：儲存 log 檔的）；否則你的專案就無時無刻在重起了。</p>
<blockquote>
<p>如果是正式的網站且流量大，建議使用 PM2 來做處理，它也有監控資料夾的功能。</p>
</blockquote>
<hr>
<h3 class="h-nomark" id="23-不一定要拼個誰輸誰贏">2.3 不一定要拼個誰輸誰贏<a class="h-anchor" href="#23-%e4%b8%8d%e4%b8%80%e5%ae%9a%e8%a6%81%e6%8b%bc%e5%80%8b%e8%aa%b0%e8%bc%b8%e8%aa%b0%e8%b4%8f" aria-label="這個段落的連結"></a></h3>
<blockquote>
<p>存在即合理</p>
</blockquote>
<ul>
<li><strong>小專案不用花太多時間在評估框架及程式語言選擇上</strong><br>有些公司對專案要用什麼框架以及程式語言保持著非常謹慎的態度，謹慎的態度是對的，但也要考量到專案的規模；如果今天的專案就是 CRUD 的簡單應用，<mark>預估使用者數量不多或是主要來自於內部成員，用什麼框架及程式語言其實都差不多</mark>。</li>
<li><strong>看組織成員擅長的語言</strong><br>如果公司高層為了追求潮流而要求開發人員用一個不熟悉的框架去做專案，他最好祈求專案上線後平平安安；不然<mark>出事了公司沒有能夠處理的人才</mark>，沒有人會在意一個不能用的網站效能有多好。</li>
<li><strong>每個程式語言都有自己的擁護者</strong><br>在不同的條件下，每個程式語言都有自己的優勢，而且每年都會誕生新的框架與程式語言；筆者覺得與其不停盲目追逐新的技術，不如先深入研究一個成熟的技術，<mark>當你有辦法靠它解決各種現實難題時，再去學新的框架跟程式語言也不晚</mark>。</li>
</ul>
<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-既然你先學了-nodejs-的框架為何後來改用-php-的框架">3.1 既然你先學了 Node.js 的框架，為何後來改用 PHP 的框架？<a class="h-anchor" href="#31-%e6%97%a2%e7%84%b6%e4%bd%a0%e5%85%88%e5%ad%b8%e4%ba%86-nodejs-%e7%9a%84%e6%a1%86%e6%9e%b6%e7%82%ba%e4%bd%95%e5%be%8c%e4%be%86%e6%94%b9%e7%94%a8-php-%e7%9a%84%e6%a1%86%e6%9e%b6" aria-label="這個段落的連結"></a></h3>
<p><mark>考點：這題其實是想了解求職者的人格特質</mark></p>
<p>這兩個都是為了解決問題的技術，我一開始用 Node.js 的 Express 框架<mark>獨立完成</mark>了幾份專案；但後來有一個<code>需要 Team work</code> 的大型專案，因為當時的組長比較熟悉 PHP 的 Laravel 框架，所以我便藉由這個機會<mark>學習新的技術</mark>；也因為這次的技術轉換，讓我<mark>了解不同框架在部署以及效能各方面的差異</mark>。</p>
<blockquote>
<p><strong>我想透過上面的回答給面試官幾個訊息：</strong></p>
<ul>
<li>我能獨立完成專案，也可以團隊合作。</li>
<li>我願意學習新技術。</li>
<li>學習的同時會分析不同框架的優劣。</li>
</ul>
</blockquote>
<hr>
<h3 class="h-nomark" id="32-使用框架有什麼好處跟壞處">3.2 使用框架有什麼好處跟壞處？<a class="h-anchor" href="#32-%e4%bd%bf%e7%94%a8%e6%a1%86%e6%9e%b6%e6%9c%89%e4%bb%80%e9%ba%bc%e5%a5%bd%e8%99%95%e8%b7%9f%e5%a3%9e%e8%99%95" aria-label="這個段落的連結"></a></h3>
<p><mark>考點：確認求職者對框架的認知</mark></p>
<ul>
<li><strong>好處</strong><br>框架能夠<mark>讓初學者快速入門並開發出有一定水平</mark>的專案，因為框架提供了許多常用的函式，因此可以<mark>大幅縮短專案時程</mark>；在團隊協作上框架優勢更為明顯，能夠讓成員<mark>有一致的開發方式</mark>。</li>
<li><strong>壞處</strong><br>因為框架已經幫開發人員做了太多事情，這會導致<mark>開發人員並不理解許多功能的原理</mark>，這也造成了<mark>一但框架無法滿足功能，初學者的生產力會斷崖式下降</mark>；如果長期使用，也容易<mark>讓自己的開發思維被限制在框架內</mark>。</li>
</ul>
<hr>
<h3 id="筆者碎碎念">筆者碎碎念<a class="h-anchor" href="#%e7%ad%86%e8%80%85%e7%a2%8e%e7%a2%8e%e5%bf%b5" aria-label="這個段落的連結"></a></h3>
<p>希望讀者不要只把我提出來的問題當成面試會出的考題；當面試官會這樣詢問時，通常是因為實務上也會遇到類似的問題。</p>
<p>感謝大家的閱讀，如果喜歡我的文章可以<code>訂閱</code>接收通知；如果有幫助到你，按<code>Like</code>可以讓我更有寫文的動力，我們明天見～</p>
<h3 id="參考資源">參考資源：<a class="h-anchor" href="#%e5%8f%83%e8%80%83%e8%b3%87%e6%ba%90" aria-label="這個段落的連結"></a></h3>
<ol>
<li><a href="https://thomashunter.name/posts/2012-06-21-php-vs-nodejs">PHP + Apache Stack vs Node.js</a></li>
<li><a href="https://web.archive.org/web/20220124190306/https://www.itread01.com/content/1549876684.html" title="原網頁已失效，連到網際網路檔案館的存檔">服務端 I/O 效能大比拼：Node、PHP、Java、Go</a></li>
<li><a href="https://jishuin.proginn.com/p/763bfbd2cab5">簡析 Node.js 特點與應用場景</a></li>
<li><a href="https://www.jianshu.com/p/6d84e5efe99d">詳細版 | 用 Supervisor 守護你的 Node.js 進程</a></li>
<li><a href="https://iter01.com/403097.html">淺談 Node.js 和 PHP 程式管理</a></li>
</ol>
<hr>
<hr>
<blockquote>
<p><img src="https://deanlin.net/blog/202109/fullstack-career-notes-day-13/images/fullstack-career-notes-day-13-01.webp" width="1024" height="233" alt="參考資源：（圖 1）" fetchpriority="high" 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>
    <item>
      <title>SSR、CSR名詞理解 &amp; 應用場景</title>
      <link>https://deanlin.net/blog/202103/ssr-vs-csr/</link>
      <pubDate>Thu, 18 Mar 2021 12:36:01 +0800</pubDate>
      <guid>https://deanlin.net/blog/202103/ssr-vs-csr/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>技術教學</category>
      <description>當老闆或是主管問你為什麼選擇這個技術時，如果支支吾吾打不出來就遜掉了；理解為什麼該這樣做才是對技術的負責。</description>
      <media:content url="https://deanlin.net/blog/202103/ssr-vs-csr/images/ssr-vs-csr-og_hu_e797feeb9e8b0924.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<p>當老闆或是主管問你為什麼選擇這個技術時，如果支支吾吾打不出來就遜掉了；理解為什麼該這樣做才是對技術的負責。</p>
<p><img src="https://deanlin.net/blog/202103/ssr-vs-csr/images/ssr-vs-csr-01.webp" width="1400" height="785" alt="SSR、CSR名詞理解 &amp; 應用場景（圖 1）" fetchpriority="high" decoding="async"></p>
<pre tabindex="0"><code>CSR - Client-Side Rendering（客戶端渲染）
  ➤ 優點
  ➤ 缺點
  ➤ 應用場景
SSR - Server-Side Rendering（伺服器端渲染）
  ➤ 優點
  ➤ 缺點
  ➤ 應用場景
可以思考的問題
  ➤ 現實面遇到的狀況
  ➤ 運用框架結合 CSR 與 SSR 的優點讓網站取得雙贏
</code></pre><h2 id="csr--client-side-rendering客戶端渲染">CSR — Client-Side Rendering（客戶端渲染）<a class="h-anchor" href="#csr--client-side-rendering%e5%ae%a2%e6%88%b6%e7%ab%af%e6%b8%b2%e6%9f%93" aria-label="這個段落的連結"></a></h2>
<p>渲染過程全部交給 client 的瀏覽器去處理，server 不參與任何渲染。一開始的 HTML 是空白的，需要等待 JS 下載並執行後瀏覽器才會顯示畫面。</p>
<h3 id="-優點">優點：<a class="h-anchor" href="#-%e5%84%aa%e9%bb%9e" aria-label="這個段落的連結"></a></h3>
<ul>
<li><strong>減少 server 端的壓力</strong>：因為 JS 及 CSS 在第一次都已經發送到 client 端，之後只需要向 server 端取得相關頁面的 data 即可</li>
<li><strong>頁面切換速度快</strong>：因為 HTML 頁面都是 client 端自己編譯的，所以頁面切換時不需要像 SSR 等待 server 回傳 HTML；而且網頁內容的改變通常都是局部的，這樣就避免了不必要的跳轉及重複渲染。</li>
</ul>
<h3 id="-缺點">缺點：<a class="h-anchor" href="#-%e7%bc%ba%e9%bb%9e" aria-label="這個段落的連結"></a></h3>
<ul>
<li><strong>首屏顯示慢</strong>：明明首頁只有一點內容卻把下載了所有頁面的資源</li>
<li><em>SEO 較差</em>：因一開始的 HTML 是空白的，雖然現在 Google 的爬蟲也會等 javascript 編譯好再爬，但這塊對 SEO 的實際幫助還需要時間驗證</li>
</ul>
<h3 id="-應用場景">應用場景：<a class="h-anchor" href="#-%e6%87%89%e7%94%a8%e5%a0%b4%e6%99%af" aria-label="這個段落的連結"></a></h3>
<ul>
<li><strong>會高頻操作且不需 SEO 的網站</strong>：像是內部管理系統，如果這類型的系統採取 SSR 會造成 server 端很大的負荷。</li>
</ul>
<hr>
<h2 id="ssr--server-side-rendering伺服器端渲染">SSR — Server-Side Rendering（伺服器端渲染）<a class="h-anchor" href="#ssr--server-side-rendering%e4%bc%ba%e6%9c%8d%e5%99%a8%e7%ab%af%e6%b8%b2%e6%9f%93" aria-label="這個段落的連結"></a></h2>
<p>HTML 由 server 編譯出來返回 client 端，所以 client 看到的畫面就是最終版 HTML。</p>
<h3 id="-優點-1">優點：<a class="h-anchor" href="#-%e5%84%aa%e9%bb%9e-1" aria-label="這個段落的連結"></a></h3>
<ul>
<li><strong>SEO 排名更高</strong>：因為 Google 爬蟲可以直接抓到網站的資訊</li>
<li><strong>首屏渲染快</strong>：因為不需要下載一堆 JS 以及 CSS 執行後才看到頁面</li>
<li><strong>減少 client 端的耗電量</strong>：因為編譯的步驟都在 server 端執行</li>
</ul>
<h3 id="-缺點-1">缺點：<a class="h-anchor" href="#-%e7%bc%ba%e9%bb%9e-1" aria-label="這個段落的連結"></a></h3>
<ul>
<li><strong>server 端承受比較大的壓力</strong>：由於頁面都是在 server 端進行編譯，在高併發場景中會消耗相當大的資源</li>
</ul>
<h3 id="-應用場景-1">應用場景：<a class="h-anchor" href="#-%e6%87%89%e7%94%a8%e5%a0%b4%e6%99%af-1" aria-label="這個段落的連結"></a></h3>
<ul>
<li><strong>低頻操作但需要 SEO 優化的網站</strong>：像是媒體類型的網站，因為文章需要被搜尋到，我們看一篇文章也需要一點時間很少高頻的操作這個網站</li>
</ul>
<hr>
<h2 id="可以思考的問題">可以思考的問題<a class="h-anchor" href="#%e5%8f%af%e4%bb%a5%e6%80%9d%e8%80%83%e7%9a%84%e5%95%8f%e9%a1%8c" aria-label="這個段落的連結"></a></h2>
<h3 id="-現實面遇到的狀況">現實面遇到的狀況<a class="h-anchor" href="#-%e7%8f%be%e5%af%a6%e9%9d%a2%e9%81%87%e5%88%b0%e7%9a%84%e7%8b%80%e6%b3%81" aria-label="這個段落的連結"></a></h3>
<p>在 CSR 的狀況下如果某個頁面需要同時存取多個 api，假設 client 端的網速不理想，那使用者的體驗會極差；在這種情況下 SSR 會因為 server 環境相對穩定而獲得相對好的使用者體驗。</p>
<h3 id="-運用框架結合-csr-與-ssr-的優點讓網站取得雙贏">運用框架結合 CSR 與 SSR 的優點讓網站取得雙贏<a class="h-anchor" href="#-%e9%81%8b%e7%94%a8%e6%a1%86%e6%9e%b6%e7%b5%90%e5%90%88-csr-%e8%88%87-ssr-%e7%9a%84%e5%84%aa%e9%bb%9e%e8%ae%93%e7%b6%b2%e7%ab%99%e5%8f%96%e5%be%97%e9%9b%99%e8%b4%8f" aria-label="這個段落的連結"></a></h3>
<p>經由上面的分析，我想大家應該已經感受到 CSR 與 SSR 可以說是性質完全相反的渲染了，所以實際應用上我們通常會讓第一個頁面用 SSR 來爭取更高的 SEO，其他的頁面則採用 CSR 的方式來操作給使用者兩好的體驗。</p>
<p>現有的框架： <code>Nuxt.js</code>（Vue）、<code>Next.js</code>（React）都有很好的解決方案</p>
<hr>
<blockquote class="pullquote"><p>以上是我個人針對 SSR、CSR 技術的理解，如果有理解錯誤的地方希望有大神給予指教，感恩不盡～</p>
</blockquote>
]]></content:encoded>
    </item>
  </channel>
</rss>
