<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>常見錯誤 &#8211; 科技島-掌握科技新聞、科技職場最新資訊</title>
	<atom:link href="https://www.technice.com.tw/tag/%E5%B8%B8%E8%A6%8B%E9%8C%AF%E8%AA%A4/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.technice.com.tw</link>
	<description>專注於科技新聞、科技職場、科技知識相關資訊，包含生成式AI、人工智慧、Web 3.0、區塊鏈、科技職缺百科、生物科技、軟體發展、雲端技術等豐富內容，適合熱衷科技及從事科技專業人事第一手資訊的平台。</description>
	<lastBuildDate>Thu, 07 Jul 2022 08:39:02 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.2</generator>

<image>
	<url>https://www.technice.com.tw/wp-content/uploads/2022/12/cropped-wordpress_512x512-150x150.png</url>
	<title>常見錯誤 &#8211; 科技島-掌握科技新聞、科技職場最新資訊</title>
	<link>https://www.technice.com.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>[前端＆後端]工程師常犯的錯誤</title>
		<link>https://www.technice.com.tw/experience/6594/</link>
					<comments>https://www.technice.com.tw/experience/6594/#respond</comments>
		
		<dc:creator><![CDATA[科編推薦]]></dc:creator>
		<pubDate>Thu, 07 Jul 2022 08:38:58 +0000</pubDate>
				<category><![CDATA[產業]]></category>
		<category><![CDATA[工作甘苦談]]></category>
		<category><![CDATA[工程師]]></category>
		<category><![CDATA[常見錯誤]]></category>
		<category><![CDATA[科技業]]></category>
		<guid isPermaLink="false">https://www.technice.com.tw/?p=6594</guid>

					<description><![CDATA[<p><img width="1400" height="744" src="https://www.technice.com.tw/wp-content/uploads/2022/07/1_kXlVjvXDXteHQCjIcS3s2Q.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="1 kXlVjvXDXteHQCjIcS3s2Q" decoding="async" srcset="https://www.technice.com.tw/wp-content/uploads/2022/07/1_kXlVjvXDXteHQCjIcS3s2Q.png 1400w, https://www.technice.com.tw/wp-content/uploads/2022/07/1_kXlVjvXDXteHQCjIcS3s2Q-300x159.png 300w, https://www.technice.com.tw/wp-content/uploads/2022/07/1_kXlVjvXDXteHQCjIcS3s2Q-1024x544.png 1024w, https://www.technice.com.tw/wp-content/uploads/2022/07/1_kXlVjvXDXteHQCjIcS3s2Q-768x408.png 768w" sizes="(max-width: 1400px) 100vw, 1400px" title="[前端＆後端]工程師常犯的錯誤 1"></p>
<p>筆者跟擔任 Tech Lead 的朋友聊天時，發現在幫新人 Code Review、Code Refactoring、Bug Fixing 時遇到了許多類似的問題，針對這個部分我安排了 3 篇文章做講解，今天這篇文章我挑選了幾個工程師常犯的錯誤來分享。<content><!-- wp:image {"id":6596,"width":768,"height":408,"sizeSlug":"large","linkDestination":"none"} --></p>
<figure class="wp-block-image size-large is-resized"><img src="https://www.technice.com.tw/wp-content/uploads/2022/07/1_kXlVjvXDXteHQCjIcS3s2Q-1024x544.png" alt="" class="wp-image-6596" width="768" height="408" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>文／<a href="https://medium.com/dean-lin/%E5%89%8D%E7%AB%AF-%E5%BE%8C%E7%AB%AF-%E5%B7%A5%E7%A8%8B%E5%B8%AB%E5%B8%B8%E7%8A%AF%E7%9A%84%E9%8C%AF%E8%AA%A4-%E4%B8%8B%E7%8F%AD%E6%9C%89%E7%B4%84%E7%B3%BB%E5%88%97%E6%96%87-80615ca62a0">林鼎淵</a></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>筆者跟擔任 Tech Lead 的朋友聊天時，發現在幫新人 Code Review、Code Refactoring、Bug Fixing 時遇到了許多類似的問題，針對這個部分我安排了 3 篇文章做講解，今天這篇文章我挑選了幾個工程師常犯的錯誤來分享。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2>➤ 保留太多無用的 console.log</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>為了追蹤資料流向，我們會用 console.log 來確認程式是否依照我們的想法在執行；但有不少人只會一直增加新的 console.log，而不把已經不需要的 console.log 給移除。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2>➤ 沒有註明輸出的 console.log 要做什麼事</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>筆者曾在按下 F12 開啟開發人員工具幫人 debug 時，看到 Console 這個分頁下印出一堆 API 回傳的 response data，但命名完全一樣都叫「result」，這樣我完全無法知道這些 result 是由哪個 API 回傳的ＱＱ</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":6611,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full"><img src="https://www.technice.com.tw/wp-content/uploads/2022/07/1_MCryXApCktt5vX8rjTULYw.png" alt="" class="wp-image-6611" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>不然就是很多意義不明只有自己才知道是什麼意思的 console.log（這類型的往往一個月後連本人都不知道在做什麼…）</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":6610,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full"><img src="https://www.technice.com.tw/wp-content/uploads/2022/07/03-1.png" alt="" class="wp-image-6610" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:heading --></p>
<h2>➤ 忽視 Console 吐出的警告、錯誤</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>有些網頁看似運行的很正常，但在按下 F12 開啟開發人員工具後，你會看到一排讓人血壓上升的紅色 Error Message，如果沒有及時處理遲早有一天會業力引爆的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":6609,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full"><img src="https://www.technice.com.tw/wp-content/uploads/2022/07/04-1.png" alt="" class="wp-image-6609" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:heading --></p>
<h2>➤ 不同函式共用「命名相同的全域變數」</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>像是 Vue 框架下用來儲存變數資訊的 「Vuex」，裡面 State 的資訊是可以在多個頁面共同使用，下面舉例幾個不夠謹慎會造成的問題：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul>
<li>如果在 loading 資料前沒有清空先前的 state 資訊，會導致進入頁面時會閃現上一次進入的資料。</li>
<li>如果把第幾頁(page)、分頁筆數(per-page)這些參數在多個頁面共用，那你就會看到有些頁面明明是第一次進入，卻跳轉到其他頁數。</li>
</ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2>➤ 大量存取不必要的 API</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>這裡舉出兩個常見的例子：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul>
<li>登入後就「一次呼叫所有的 API」，但許多 API 回傳的資料可能使用者根本還用不到。</li>
</ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote">
<p>這邊提醒一下，適當的「預載」可以增加使用者體驗，但如果在系統首頁就全部載入，除了會消耗使用者的資源外，一旦大量使用者同時上線，對伺服器端會造成很大的壓力。</p>
</blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:list --></p>
<ul>
<li>有些搜尋功能會隨著使用者填入的文字去呼叫 API 來即時顯示搜尋結果或是建議關鍵字（ex：Google），但如果沒有把呼叫 API 的時間間隔設定好（debounceTime），使用者又不停更改搜尋列文字，那就會呼叫非常多不必要的 API。</li>
</ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2>➤ 將用不到程式碼註解而非刪除</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>在開發階段有時會想到很多的解決方案，因為不確定哪個效能較高，所以就把每個演算法實現出來。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>但有些人在決定使用某個解決方案後，依舊沒把其他的方案刪除，這樣的做法容易造成未來維護的困難度。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2>➤ 沒寫註解，或是寫沒有意義的註解</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>雖然有神人說過：最好的註解就是程式碼本身</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>但我想：「絕大多數的人都難以到達這個境界，所以要乖乖地寫註解ＸＤ」</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":6608,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full"><img src="https://www.technice.com.tw/wp-content/uploads/2022/07/05-1.png" alt="" class="wp-image-6608" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>像是上面這段 Code，我們可以知道 mode 這個變數應該是應用在某個狀態的判斷上；但具體在哪個地方使用、總共有哪些狀態、各自代表什麼意義，在沒有註解的狀態下只能一行一行的閱讀，沒辦法第一時間理解程式。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<h2 class="has-medium-font-size">註解的好處</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol>
<li>交代前因後果：為什麼這樣寫?遇到了什麼困難?解決了什麼問題?</li>
<li>作為文件說明：有些技術是需要被學習後才能夠看得懂的(ex:引入的模組、套件)，你的註解能讓他快速理解這些工具怎麼使用</li>
</ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<h2 class="has-medium-font-size">請不要有註解如下</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol>
<li>毫無意義的牢騷(ex:我好崩潰啊，這段程式我寫了一個禮拜…)</li>
<li>把註解當成版本控制(ex:2020/08/23 完成此函式)</li>
<li>說明這段程式是誰寫的(簽名檔)</li>
<li>把舊的程式碼註解起來怕以後會用到(但通常再也不會用到，而且這個問題用版控就能解決)</li>
</ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2>➤ Copy &amp; Paste 後，Function、Variable 命名沒有改</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>如果寫專案時發現之前做過類似的功能，我們會複製過來再做微調，以此加快開發的速度。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>但請修改 Function、Variable 命名！這不會花你太多時間，但在未來當你需要維護專案時，你會感謝現在的自己。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote">
<p>筆者之前曾在幫忙 Debug 時，於Ａ系統裡面看到一堆Ｂ系統的命名，當下還以為自己開錯專案了…</p>
</blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2>➤ 沒有寫 try catch</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>程式在缺乏 try-catch 的機制下是非常脆弱的，只要發生例外事件就容易崩潰。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>如果你直接假定 API 只會回傳正確的資訊，而沒有撰寫 try-catch 去捕捉可能的 400、500 系列錯誤，就很可能導致系統許多行為錯誤如：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol>
<li>跳轉到無權限的頁面</li>
<li>程式進入無限迴圈</li>
<li>瘋狂 Call 某隻 API 直到變成 429 錯誤（Too Many Requests）</li>
</ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2>➤ 在他人協助下完成功能後，沒有真正了解原理</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>我相信大部分的人都是樂於幫助別人解決問題的，但同時也相信，沒有人希望再次被「相同的問題」打擾。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>我這邊強烈建議請他人協助問題前，先 commit 一版，這樣無論對方成功還是失敗，你都有一個記錄在。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>如果對方成功解決這個問題，一定找時間回到當時 commit 的那版，用自己的邏輯把功能完成；請記住，別人完成的任務不會自動成為你的知識。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2>➤ 沒有做 Refactoring</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>演算法相關的 Refactor 有一定的難度，但有一些很基礎的 Refactor 我認為是有必要的，像是變數命名這一塊。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>我們先來看一個不好的範例：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":6607,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full"><img src="https://www.technice.com.tw/wp-content/uploads/2022/07/06-1.png" alt="" class="wp-image-6607" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>上面這個是要取得回傳的「最後一筆」資料做邏輯處理，但是全部都使用「result[result.length -1]」來表示，相信大家都會看得有點眼花。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>下面我們做個簡單的 Refactor，看起來就會舒服很多：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":6606,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full"><img src="https://www.technice.com.tw/wp-content/uploads/2022/07/07-1.png" alt="" class="wp-image-6606" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:heading --></p>
<h2>➤ 詢問別人前沒有自己嘗試</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>有些人在遇到問題時沒有先從網路找資料，而是遇到問題先問同事、前輩。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>儘管這樣可以最快速得到解答，但卻少了很多自我思考的部分，長期來講對工程師職涯是非常不健康的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2>➤ 詢問的問題不夠精確</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>有時會收到主旨模糊的問題，像是：「這個搜尋功能常常會 fail，可以幫我看看嗎？」</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>如果可以，收到問題的人會希望問題敘述微調一下：「在人資系統中，我如果在職員列表頁面的搜尋條件中加入部門篩選，會發現搜尋出的結果不合預期，有時會找出其他部門的人員，可以幫我看一下是不是資料庫語法錯誤呢？」</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote">
<p>結構為：哪個系統-&gt;哪個頁面-&gt;你調整了哪些參數-&gt;錯誤結果為何-&gt;初步判定錯誤來源</p>
</blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2>➤ 管理者權限與使用者權限混在一起</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>很多系統都會分成前台（一般使用者）以及後台（管理者），有時後端為了增加程式共用率，而讓他們使用同一隻 API 存取資料，如果權限有設計好那沒問題，但如果沒設計好可能就出大包了。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>以人資系統來說，假設有一隻 API 是用來存取個人資訊的，API 格式為：「users/{user}」</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>假使把這隻 API 共用，一般使用者透過修改中間的「user id」就有可能看到其他人的隱私資訊，這在資訊安全上是非常危險的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>因此建議將一般使用者與管理者的 API 切割清楚，避免讓使用者看到權限外的資料。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote">
<p>筆者曾經犯過文章中許多錯誤，沒有人一開始就是強者，但至少要走在變強的道路上。</p>
</blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:pullquote --></p>
<figure class="wp-block-pullquote">
<blockquote>
<p>本文由 <a href="https://dean-lin.medium.com/">林鼎淵</a> 授權轉載，原文<a href="https://medium.com/dean-lin/%E5%89%8D%E7%AB%AF-%E5%BE%8C%E7%AB%AF-%E5%B7%A5%E7%A8%8B%E5%B8%AB%E5%B8%B8%E7%8A%AF%E7%9A%84%E9%8C%AF%E8%AA%A4-%E4%B8%8B%E7%8F%AD%E6%9C%89%E7%B4%84%E7%B3%BB%E5%88%97%E6%96%87-80615ca62a0">連結</a></p>
</blockquote>
</figure>
<p><!-- /wp:pullquote --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></content></p>
<p>這篇文章 <a rel="nofollow" href="https://www.technice.com.tw/experience/6594/">[前端＆後端]工程師常犯的錯誤</a> 最早出現於 <a rel="nofollow" href="https://www.technice.com.tw">科技島-掌握科技新聞、科技職場最新資訊</a>。</p>
]]></description>
		
					<wfw:commentRss>https://www.technice.com.tw/experience/6594/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
