<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[M.W.]]></title><description><![CDATA[The integrity of the upright guides them.
-----------------------------------------
Chính trực sẽ dẫn đường cho những người ngay thẳng.]]></description><link>https://chungdungco.blog</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 23:21:37 GMT</lastBuildDate><atom:link href="https://chungdungco.blog/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[RAM (Random Access Memory)]]></title><description><![CDATA[🧠 1. Tổng quan về RAM trong Embedded Systems
✅ RAM là gì và dùng để làm gì?

RAM (Random Access Memory) là bộ nhớ dễ bay hơi (volatile), dùng trong thời gian chương trình đang chạy để:

Lưu trữ biến tạm thời (local, global, static)

Duy trì stack (c...]]></description><link>https://chungdungco.blog/ram-random-access-memory</link><guid isPermaLink="true">https://chungdungco.blog/ram-random-access-memory</guid><category><![CDATA[ram]]></category><dc:creator><![CDATA[CHUNG CO]]></dc:creator><pubDate>Wed, 23 Apr 2025 21:10:24 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-1-tong-quan-ve-ram-trong-embedded-systems">🧠 <strong>1. Tổng quan về RAM trong Embedded Systems</strong></h2>
<h3 id="heading-ram-la-gi-va-dung-de-lam-gi">✅ RAM là gì và dùng để làm gì?</h3>
<ul>
<li><p><strong>RAM (Random Access Memory)</strong> là bộ nhớ dễ bay hơi (volatile), <strong>dùng trong thời gian chương trình đang chạy</strong> để:</p>
<ul>
<li><p>Lưu trữ biến tạm thời (<code>local</code>, <code>global</code>, <code>static</code>)</p>
</li>
<li><p>Duy trì stack (cho function calls)</p>
</li>
<li><p>Quản lý heap (malloc/free)</p>
</li>
<li><p>Làm buffer, cache, vùng trao đổi dữ liệu.</p>
</li>
</ul>
</li>
</ul>
<h3 id="heading-so-sanh-ram-va-flash">✅ So sánh <strong>RAM</strong> và <strong>Flash</strong></h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Đặc điểm</td><td>RAM (SRAM)</td><td>Flash (ROM)</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Tốc độ</strong></td><td>Rất nhanh (nanosecond level)</td><td>Chậm hơn (microsecond level)</td></tr>
<tr>
<td><strong>Dữ liệu</strong></td><td>Mất khi mất điện (volatile)</td><td>Lưu trữ lâu dài (non-volatile)</td></tr>
<tr>
<td><strong>Sử dụng</strong></td><td>Dùng trong runtime</td><td>Lưu trữ firmware/code/constants</td></tr>
<tr>
<td><strong>Viết/Đọc</strong></td><td>Nhanh, không giới hạn</td><td>Giới hạn số lần ghi</td></tr>
<tr>
<td><strong>Chi phí/Số lượng</strong></td><td>Đắt, giới hạn vài KB – MB</td><td>Rẻ hơn, thường có nhiều hơn</td></tr>
</tbody>
</table>
</div><blockquote>
<p>⚠️ <strong>STM32</strong> có thể chỉ có từ <strong>16KB đến 512KB RAM</strong>, vì RAM tốn silicon và tiêu thụ điện nhiều hơn.</p>
</blockquote>
<hr />
<h2 id="heading-2-phan-tich-tung-vung-nho-trong-ram">🧩 <strong>2. Phân tích từng vùng nhớ trong RAM</strong></h2>
<p>Dưới đây là cấu trúc điển hình khi sử dụng RAM:</p>
<pre><code class="lang-c">sqlSao chépChỉnh sửa+----------------------+ ← <span class="hljs-function">Low <span class="hljs-title">Address</span> <span class="hljs-params">(start of RAM)</span>
| .data / .bss         |  → Static &amp; global variables
|----------------------|
| Heap                 |  → <span class="hljs-built_in">malloc</span>/<span class="hljs-built_in">free</span> allocation
|   ↑ grows upward     |
|----------------------|
|                      |
|      Unused RAM      |
|                      |
|----------------------|
| Stack                |  → Function calls, local vars
|   ↓ grows downward   |
+----------------------+ ← High <span class="hljs-title">Address</span> <span class="hljs-params">(end of RAM)</span></span>
</code></pre>
<hr />
<h2 id="heading-3-chi-tiet-tung-vung-nho">📌 <strong>3. Chi tiết từng vùng nhớ</strong></h2>
<h3 id="heading-stack">🟩 <strong>STACK</strong></h3>
<h4 id="heading-hoat-dong">✅ Hoạt động:</h4>
<ul>
<li><p>Cơ chế <strong>LIFO (Last-In First-Out)</strong>.</p>
</li>
<li><p>Tự động quản lý bởi <strong>CPU và compiler</strong> (developer chỉ cần viết code bình thường).</p>
</li>
<li><p>Mỗi lần gọi hàm → stack frame được tạo.</p>
</li>
</ul>
<h4 id="heading-luu-gi">✅ Lưu gì?</h4>
<ul>
<li><p><strong>Local variables</strong> trong hàm</p>
</li>
<li><p>Địa chỉ return</p>
</li>
<li><p>Context của hàm (thanh ghi...)</p>
</li>
</ul>
<h4 id="heading-nguy-co-stack-overflow">⚠️ Nguy cơ <strong>Stack Overflow</strong>:</h4>
<ul>
<li><p>Khi stack chạm vùng heap hoặc giới hạn RAM → ghi đè dữ liệu.</p>
</li>
<li><p>Nguy hiểm trong hệ thống nhúng vì dễ <strong>crash</strong> hoặc <strong>hành vi không xác định</strong>.</p>
</li>
</ul>
<h4 id="heading-cach-phong-tranh">✅ Cách phòng tránh:</h4>
<ul>
<li><p>Hạn chế <strong>đệ quy</strong>.</p>
</li>
<li><p>Tránh <strong>biến cục bộ lớn</strong>.</p>
</li>
<li><p>Dùng <strong>static</strong> thay vì local nếu cần giữ giá trị.</p>
</li>
<li><p>Trên <strong>RTOS</strong> (FreeRTOS): mỗi task có stack riêng → phân tích kỹ <strong>task stack size</strong>.</p>
</li>
</ul>
<hr />
<h3 id="heading-heap">🟨 <strong>HEAP</strong></h3>
<h4 id="heading-hoat-dong-1">✅ Hoạt động:</h4>
<ul>
<li><p>Dùng cho cấp phát động (<code>malloc</code>, <code>calloc</code>, <code>free</code>).</p>
</li>
<li><p>Không có cơ chế tự động quản lý (developer phải chủ động <code>free()</code>).</p>
</li>
</ul>
<h4 id="heading-rui-ro">✅ Rủi ro:</h4>
<ul>
<li><p><strong>Memory Fragmentation</strong>: nhiều mảng nhỏ rải rác không liền kề.</p>
</li>
<li><p><strong>Memory Leak</strong>: không giải phóng heap → cạn kiệt RAM.</p>
</li>
</ul>
<h4 id="heading-mot-so-he-thong-cam-dung-heap">⚠️ Một số hệ thống <strong>cấm dùng heap</strong>:</h4>
<ul>
<li><p>Vì khó quản lý trong real-time systems.</p>
</li>
<li><p>Gây chậm trễ, không xác định thời gian cấp phát.</p>
</li>
</ul>
<hr />
<h3 id="heading-static-data-section-data-bss">🟦 <strong>STATIC / DATA SECTION (.data, .bss)</strong></h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Loại biến</td><td>Section</td><td>Đặc điểm</td></tr>
</thead>
<tbody>
<tr>
<td><code>int global_var;</code></td><td><code>.bss</code></td><td>Chưa khởi tạo → mặc định là 0</td></tr>
<tr>
<td><code>static int s = 10;</code></td><td><code>.data</code></td><td>Đã khởi tạo → nạp từ Flash vào RAM</td></tr>
<tr>
<td><code>const int val = 5;</code></td><td><code>.rodata</code> (Flash)</td><td>Không nằm trong RAM</td></tr>
</tbody>
</table>
</div><ul>
<li><p><strong>Tồn tại suốt đời chương trình.</strong></p>
</li>
<li><p>Dữ liệu khởi tạo được <strong>copy từ Flash vào RAM khi khởi động</strong>.</p>
</li>
</ul>
<hr />
<h2 id="heading-4-code-minh-hoa-vung-nho">💻 <strong>4. Code minh họa vùng nhớ</strong></h2>
<pre><code class="lang-c">cSao chépChỉnh sửaint global_var;               <span class="hljs-comment">// .bss (chưa khởi tạo)</span>
<span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> static_var = <span class="hljs-number">10</span>;   <span class="hljs-comment">// .data (đã khởi tạo)</span>

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">foo</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">int</span> local_var;            <span class="hljs-comment">// Stack</span>
    <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> local_static;  <span class="hljs-comment">// .bss (.data nếu khởi tạo)</span>
    <span class="hljs-keyword">int</span> *ptr = <span class="hljs-built_in">malloc</span>(<span class="hljs-number">100</span>);   <span class="hljs-comment">// Heap</span>
}
</code></pre>
<hr />
<h2 id="heading-5-map-file-compiler-memory-map">🧾 <strong>5. Map file – Compiler Memory Map</strong></h2>
<p>Dùng <strong>file .map</strong> từ linker để kiểm tra:</p>
<pre><code class="lang-c">textSao chépChỉnh sửa.bss        <span class="hljs-number">0x20000000</span>    <span class="hljs-number">0x400</span>
.data       <span class="hljs-number">0x20000400</span>    <span class="hljs-number">0x200</span>
.<span class="hljs-built_in">stack</span>      <span class="hljs-number">0x20000800</span>    <span class="hljs-number">0x1000</span>
</code></pre>
<p>→ Cho biết bộ nhớ sử dụng ở đâu, vùng nào chiếm bao nhiêu byte.</p>
<hr />
<h2 id="heading-6-toi-uu-bo-nho-trong-embedded-systems">🔧 <strong>6. Tối ưu bộ nhớ trong Embedded Systems</strong></h2>
<h3 id="heading-giam-stack-usage">✅ Giảm stack usage:</h3>
<ul>
<li><p>Dùng biến static nếu không cần reset mỗi lần gọi.</p>
</li>
<li><p>Tránh đệ quy.</p>
</li>
<li><p>Hạn chế truyền struct lớn theo kiểu pass-by-value.</p>
</li>
</ul>
<h3 id="heading-quan-ly-heap">✅ Quản lý heap:</h3>
<ul>
<li><p><strong>Tránh dùng malloc</strong> trong vòng lặp hoặc ISR.</p>
</li>
<li><p>Cân nhắc sử dụng <strong>memory pool</strong> hoặc quản lý thủ công.</p>
</li>
</ul>
<h3 id="heading-tool-ho-tro">✅ Tool hỗ trợ:</h3>
<ul>
<li><p><strong>FreeRTOS</strong>: <code>uxTaskGetStackHighWaterMark()</code></p>
</li>
<li><p><strong>GCC</strong>: kiểm tra <code>.map</code>, <code>-fstack-usage</code>, <code>-Wstack-usage</code></p>
</li>
<li><p><strong>Keil</strong>: Runtime stack overflow detection, Symbol viewer</p>
</li>
</ul>
<hr />
<h2 id="heading-7-goi-y-tai-lieu-doc-them">📘 <strong>7. Gợi ý tài liệu đọc thêm</strong></h2>
<ul>
<li><p>📘 <em>The C Programming Language</em> – Brian W. Kernighan &amp; Dennis M. Ritchie</p>
</li>
<li><p>📘 <em>Embedded Systems in C</em> – Michael Barr</p>
</li>
<li><p>📘 <em>Definitive Guide to ARM Cortex-M</em> – Joseph Yiu</p>
</li>
<li><p>📘 <em>Linker Script &amp; Memory Map in Embedded</em> – STM32 CubeIDE doc + GNU Linker Manual</p>
</li>
</ul>
<hr />
<h2 id="heading-mot-vai-cau-hoi-thuc-chien-thu-vi">❓ Một vài câu hỏi thực chiến thú vị</h2>
<ul>
<li><p><strong>Làm sao để tính stack tối ưu cho task trong FreeRTOS?</strong><br />  → Dùng <code>uxTaskGetStackHighWaterMark()</code> trong thời gian thực để đo mức thấp nhất còn trống.</p>
</li>
<li><p><strong>Tại sao một số hệ thống cấm heap?</strong><br />  → Vì <strong>heap fragmentation</strong> và <strong>không đảm bảo thời gian thực (real-time)</strong>.</p>
</li>
<li><p><strong>Cách debug stack overflow trong Keil?</strong><br />  → Sử dụng:</p>
<ul>
<li><p><code>__stack</code> trong map file</p>
</li>
<li><p>Bật <code>Stack Overflow Checking</code></p>
</li>
<li><p>Quan sát call stack hoặc check HardFault handler.</p>
</li>
</ul>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Lession 1 : The first C programming.]]></title><description><![CDATA[#include stdio.h

int main()
{
    printf("Hello World");

    return 0;
}

According to the C90 and C99 standard main should return int.
#include <stdio.h>

stdio.h : "standard library C". This is written by the technical committee
main.c -> main.i ...]]></description><link>https://chungdungco.blog/lession-1-the-first-c-programming</link><guid isPermaLink="true">https://chungdungco.blog/lession-1-the-first-c-programming</guid><dc:creator><![CDATA[CHUNG CO]]></dc:creator><pubDate>Thu, 30 Nov 2023 15:01:52 GMT</pubDate><content:encoded><![CDATA[<pre><code class="lang-c"><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> stdio.h</span>

<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>
</span>{
    <span class="hljs-built_in">printf</span>(<span class="hljs-string">"Hello World"</span>);

    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code></pre>
<p>According to the C90 and C99 standard main should return int.</p>
<pre><code class="lang-c"><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">&lt;stdio.h&gt;</span></span>
</code></pre>
<p>stdio.h : "standard library C". This is written by the technical committee</p>
<p>main.c -&gt; main.i (open the standard library)(full code from scratch) -&gt; main.s(assembly) -&gt; main.o (machine code)</p>
<pre><code class="lang-c"><span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>
</span>{
    <span class="hljs-built_in">printf</span>(<span class="hljs-string">"Hello World \n"</span>);
    <span class="hljs-built_in">printf</span>(<span class="hljs-string">"Today is a good day"</span>);
}
</code></pre>
<p>\ : it's the escape character</p>
<p>n : it's the new line</p>
<p>\n : it's the escape sequence</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1695822363297/fee8096a-66e1-459c-bef8-f676eb1d5cd7.png" alt class="image--center mx-auto" /></p>
<p>/r : move the curso back to the beginning of the line</p>
<pre><code class="lang-c"><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">&lt;stdio.h&gt;</span></span>
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span> <span class="hljs-params">()</span></span>{
    <span class="hljs-built_in">printf</span>(<span class="hljs-string">"David says , \" Programming is fun !\"\n"</span>);
    <span class="hljs-built_in">printf</span>(<span class="hljs-string">"**Conditions apply , \"Offers valid until tomorrow\"\n"</span>);
    <span class="hljs-built_in">printf</span>(<span class="hljs-string">"C:\\My computer\\My folder\n"</span>);
    <span class="hljs-built_in">printf</span>(<span class="hljs-string">"D:/My documents/My file\n"</span>);
    <span class="hljs-built_in">printf</span>(<span class="hljs-string">"This is a triple quoted string \"\"\" This month has 30 days \"\"\""</span>);
}
</code></pre>
]]></content:encoded></item><item><title><![CDATA[C programming standardization]]></title><description><![CDATA[The C programming language was initially developed in AT&T labs by Professor Brian W. Kernighan and Dennis Ritchie, known as K&R C.
During the year 1970, 'C' programming became very popular but without any serious standardization to the language.
The...]]></description><link>https://chungdungco.blog/c-programming-standardization</link><guid isPermaLink="true">https://chungdungco.blog/c-programming-standardization</guid><category><![CDATA[history c programming]]></category><dc:creator><![CDATA[CHUNG CO]]></dc:creator><pubDate>Wed, 27 Sep 2023 10:59:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/O68LT-zCYFg/upload/b37be661b685990b112fc56b33b1c116.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The C programming language was initially developed in AT&amp;T labs by Professor Brian W. Kernighan and Dennis Ritchie, known as K&amp;R C.</p>
<p>During the year 1970, 'C' programming became very popular but without any serious standardization to the language.</p>
<p>The non-official standard was called K&amp;R C, which led to many ambiguities among different compiler programmers, and that led to non-portable codes.</p>
<p>K&amp;R C was the first non-official 'C' standard.</p>
<p>In 1989 American National Standard Institute designed and approved first official C standard called X3.159-1989, and in 1990 it was approved by ISO as an international for C programming language: ISO/IEC 9899:1990 (This is also called ANSI C or C89 or C90 standard in short)</p>
<p>The language under few more changes (addition of new features, syntaxes, data types, etc, ) and newly updated standard released in 1999 under the ISO tag ISO/IEC 9899:1999 which is also called C99 standard in short</p>
<p>C11 is an informal name for ISO/IEC 9899:2011, which is a new standard approved in December 2011. C11 supersedes the C99 standard.</p>
<p>In this course, we will be using the 'C11' standard with some compiler (GCC) extensions (gnu11). More on this, we will see later</p>
<p>Note that if you have written a code using C90 standard, then it will compile without any issues in -std=C99 compilation(backward compatibility )</p>
<p>If you have written a code using C99 standard specific features, then It may not compile successfully in C90 compilation.</p>
]]></content:encoded></item><item><title><![CDATA[Linear regression : Hồi quy tuyến tính]]></title><description><![CDATA[Thuật toán hồi quy tuyến tính thường được dùng để dự đoán: Ví dụ như dự đoán giá nhà theo diện tích, gần trường học bệnh viện; giá rau củ quả theo màu sắc, độ lớn...
I, Đặt vấn đề
Cho một tập kết quả định giá nhà theo diện tích của một chuyên viên đị...]]></description><link>https://chungdungco.blog/linear-regression-hoi-quy-tuyen-tinh</link><guid isPermaLink="true">https://chungdungco.blog/linear-regression-hoi-quy-tuyen-tinh</guid><category><![CDATA[Deep Learning]]></category><dc:creator><![CDATA[CHUNG CO]]></dc:creator><pubDate>Tue, 24 Jan 2023 12:40:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/4ApmfdVo32Q/upload/892e0060d3c71510e8f130354535c01b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Thuật toán hồi quy tuyến tính thường được dùng để dự đoán: Ví dụ như dự đoán giá nhà theo diện tích, gần trường học bệnh viện; giá rau củ quả theo màu sắc, độ lớn...</p>
<p><strong>I, Đặt vấn đề</strong></p>
<p>Cho một tập kết quả định giá nhà theo diện tích của một chuyên viên định giá nhà. tập kết quả được biểu diễn dưới dạng dữ liệu gồm input( số \(m^2\)) và output( giá nhà) lần lượt được ký hiệu là \(x, y\). Chuyên viên định giá nhà họ dựa vào những kinh nghiệm của bản thân họ trong việc định giá nhà mà họ đã trải qua để định giá một ngôi nhà. Kinh nghiệm ở đây chính là số lượng nhà mà họ đã định giá hay nói cách khác là số lượng tập kết quả mà họ tạo được ra input và output . Câu hỏi đặt ra có cách nào để có thể dùng máy móc dự đoán thay cho chuyên viên định giá kia không?</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Diện tích ( \(m^2\) )</td><td>Giá nhà ( triệu VND )</td></tr>
</thead>
<tbody>
<tr>
<td>30</td><td>448.524</td></tr>
<tr>
<td>32.4138</td><td>509.248</td></tr>
<tr>
<td>34.8276</td><td>535.104</td></tr>
<tr>
<td>37.2414</td><td>551.432</td></tr>
<tr>
<td>39.6552</td><td>623.418</td></tr>
<tr>
<td>...</td><td>...</td></tr>
</tbody>
</table>
</div><p>Và chúng ta có một ý tưởng là sẽ dựa vào những dữ liệu có được để tìm ra một phương trình miêu tả sự biến đổi của giá nhà theo diện tích. Ta biết rằng mọi phương trình đều được biểu diễn bằng hình học.</p>
<p>Với tập dữ liệu \(x,y\) trên ta có thể tìm ra phương trình đường thẳng ta có dạng:</p>
<p>$$y = ax+b$$</p>
<p>Giả sử với hai điểm dữ liệu \(x_1 = 30\); \(y_1 = 448,524\); \(x_2 = 32,4138\); \(y_2 = 509,248\)). Ta tìm được phương trình đường thẳng: \(y = 25.157x - 306.186.\)</p>
<p>Sau đó ta thử dự đoán giá nhà với \(x_3 = 34,8276\) ta được \(\hat{y_3} = 569,972\). Với bảng dữ liệu thực tế ta thấy rằng có sự sai lệch giữa giá trị dự đoán và giá trị thực tế. Ta gọi đó là sai số \(L_3 = |\hat{y_3} - y_3| = |569,972 - 535.104| = 34,868.\)</p>
<p>Tiếp tục ta thử dự đoán giá nhà với \(x_4 = 37.2414\) ta được \(\hat{y_4} = 630,696.\)</p>
<p>Sai số \(L_4 = |\hat{y_4}  - y_4| = |630,696 - 551.432| = 79,264 .\)</p>
<p><mark>Ta ở mỗi điểm dữ liệu lại có một giá trị sai số khác nhau. Từ đó ta có sự sai số của một module dự đoán bẳng trung bình tổng của sai số ở mỗi điểm dữ liệu được gọi là Hàm thất thoát Loss Funcion :</mark></p>
<p>$$\frac{1}{N}\sum_{i=0}^N L_i$$</p>
<p>Ở đây ta nhận thấy vấn đề của việc dự đoán chính là sai số, sai số càng lớn kết quả dự đoán càng tệ và càng không đáng tin. Vậy chúng ta cần làm tăng sự đáng tin bằng cách giảm sai số. Hay nói cách khác tìm giá trị nhỏ nhất của hàm thất thoát \(L\).</p>
<p>Ở bài viết sau tôi sẽ giới thiệu thuật toán để tìm \(min\) của \(L\).</p>
]]></content:encoded></item><item><title><![CDATA[Toàn cảnh thị trường việc làm embedded qua các năm.]]></title><description><![CDATA[Trong bài viết này, mình sẽ trả lời 2 câu hỏi sau:
Mức lương của lập trình viên embedded đứng ở đâu so với những mảng lập trình truyền thống khác như web, application?
Xu hướng thị trường việc làm về embedded trong các năm tiếp theo sẽ như thế nào?
T...]]></description><link>https://chungdungco.blog/toan-canh-thi-truong-viec-lam-embedded-qua-cac-nam</link><guid isPermaLink="true">https://chungdungco.blog/toan-canh-thi-truong-viec-lam-embedded-qua-cac-nam</guid><category><![CDATA[#phuvinalinux]]></category><dc:creator><![CDATA[CHUNG CO]]></dc:creator><pubDate>Wed, 18 Jan 2023 03:51:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/jLwVAUtLOAQ/upload/dde7dc2254f28f215b7075ecae772fa6.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Trong bài viết này, mình sẽ trả lời 2 câu hỏi sau:</p>
<p>Mức lương của lập trình viên embedded đứng ở đâu so với những mảng lập trình truyền thống khác như web, application?</p>
<p>Xu hướng thị trường việc làm về embedded trong các năm tiếp theo sẽ như thế nào?</p>
<p>Trước khi nghiên cứu số liệu để làm bài phân tích này, mình cũng như nhiều bạn khác đều cho rằng lương trung bình của lập trình viên embedded sẽ tương đương với các mảng lập trình truyền thống khác. Tuy nhiên embedded học khó hơn nên ít người biết làm hơn, nên mặc dù số lượng công ty tuyển dụng về embedded ít, nhưng vẫn khó tìm người hơn so với những mảng lập trình phổ biến khác.</p>
<p>Bài viết này của mình sử dụng nguồn tư liệu từ Báo cáo thị trường IT của <a target="_blank" href="http://topdev.vn">topdev.vn</a>. Từ năm 2016, mỗi năm họ đều làm báo cáo 1 lần, các bạn có thể vào link ở dưới phần comment để tải về. Nội dung báo cáo khá hay, họ phân tích cả về độ tuổi trung bình trong ngành phần mềm, xu hướng công nghệ... Nếu bạn nào biết về nguồn báo cáo khác thì có thể chia sẻ thêm với mình.</p>
<p>Đầu tiên về mức lương, embedded đứng ở đâu trong thị trường việc làm. Mình phân tích bằng cách tổng hợp mức lương trong báo cáo theo từng năm. Cách mình tổng hợp và vẽ biểu đồ như sau:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674013107273/aca4e243-8777-441f-8898-058c1e4c4cf4.jpeg" alt class="image--center mx-auto" /></p>
<ol>
<li><p>Đồ thị được vẽ từ năm 2017. Do trong những khảo sát trước năm 2017 không có thông tin rõ ràng về lĩnh vực embedded.</p>
</li>
<li><p>Mình so sánh mức lương của embedded với các lĩnh vực lập trình truyền thống khác như backend, mobile, fullstack development. 1 số báo cáo mình phải làm tròn, ví dụ như mobile = (Android + iOS) / 2. Tương tự với backend development.</p>
</li>
<li><p>Năm 2018 không có số liệu về lương của embedded.</p>
</li>
<li><p>Theo báo cáo thì năm 2021 họ tổng hợp từ cỡ mẫu lên đến hàng trăm nghìn.</p>
</li>
</ol>
<p>Kết quả mình tổng hợp lại ở (hình 1 - lương theo năm). Nhìn vào đây chúng ta có thể thấy lương trung bình của embedded luôn đứng cao nhất trong nhóm ngành lập trình truyền thống.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674013127454/8de8bcad-2779-41a2-a147-6ffd7359d5e8.jpeg" alt class="image--center mx-auto" /></p>
<p>Trong báo cáo lương năm 2021 (hình 2 lương theo chuyên ngành 2021), lương trung bình của embedded là 1715$. Cao gấp 1.31 lần so với backend, 1.08 lần mobile và 1.27 lần với full stack development. Con số 1715 cũng khá khớp với kết quả lần trước mình tự làm khảo sát. Nếu như nhân chia lương trung bình theo năm kinh nghiệm với tỷ lệ % số người ứng với năm kinh nghiệm đó.</p>
<p>Thứ 2 là về xu hướng thị trường việc làm về embedded trong những năm tiếp theo.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674013139038/7fd09f85-2611-4f19-958f-1cd8fe8e121c.jpeg" alt class="image--center mx-auto" /></p>
<ol>
<li><p>Trong báo cáo năm 2017 (hinh 3) có ít hơn 8.8% / 197% số lượng lập trình viên làm về embedded. Kết quả đâu đó khoảng gần 5%. Tuy nhiên trong báo cáo năm 2021 số lượng lập trình viên embedded không xuất hiện trong bảng xếp hạng nữa. Rõ ràng tính theo tỷ lệ % trên tổng số lập trình viên thì tỷ lệ số người làm embedded càng ngày càng giảm.</p>
</li>
<li><p>Mức lương luôn đứng ở top trong nhóm lập trình truyền thống thể hiện rõ ràng về nhu cầu tuyển dụng. Tuy nhiên tỷ lệ lập trình viên ngày càng giảm đi. Có thể do 1 trong 2 nguyên nhân sau: Số lượng người mới tham gia và embedded ít hơn các lĩnh vực khác, nên mặc dù số lượng người có tăng lên nhưng tỷ lệ so với tổng số lập trình viên lại giảm đi. Hoặc có thể do số lượng lập trình viên embedded chuyển sang các ngành khác nhiều hơn số lượng lập trình viên mới vào nghề.</p>
</li>
<li><p>Từ 1 và 2 ta có thể kết luận thị trường việc làm về embedded ngày càng khan hiếm và cạnh tranh nhân sự.</p>
</li>
</ol>
<p>Bài viết khá dài, cuối cùng mình xin được tổng kết lại vào mấy ý như sau:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674013200159/7171b38e-bb61-4eae-92f3-c7d47bca12be.jpeg" alt class="image--center mx-auto" /></p>
<ol>
<li><p>Lương của embedded cao nhất trong nhóm ngành lập trình truyền thống.</p>
</li>
<li><p>Tỷ lệ số người làm về embedded ngày càng giảm.</p>
</li>
<li><p>Lương cao, học khó nên ít người theo.</p>
</li>
</ol>
<p>Bài viết khá dài, cảm ơn mọi người đã đọc.</p>
<p>#Copyright: Phú Vinalinux</p>
]]></content:encoded></item></channel></rss>