<?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[Pham Ngoc Hoang is author of hoangpn blog. This blog write about technology, lifestyle, book review, ...]]></title><description><![CDATA[Pham Ngoc Hoang is author of hoangpn blog. This blog write about technology, lifestyle, book review, ... and many things.
Just make life better.]]></description><link>https://hoangpn.net</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 19:44:26 GMT</lastBuildDate><atom:link href="https://hoangpn.net/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Project Manager 101: Các kiến thức nền tảng]]></title><description><![CDATA[Hiểu rõ về luật chơi

Đây là một sân chơi mới, mà chúng ta là những developer, những người chưa có kinh nghiệm về quản lý dự án đang tập tành bước vào.

Biết "mình", biết "người", vì thế chúng ta cần chuẩn bị sẵn những vũ khí a.k.a nền tảng kiến thức...]]></description><link>https://hoangpn.net/project-manager-101-cac-kien-thuc-nen-tang</link><guid isPermaLink="true">https://hoangpn.net/project-manager-101-cac-kien-thuc-nen-tang</guid><category><![CDATA[basic project manager]]></category><category><![CDATA[PMI]]></category><category><![CDATA[pm]]></category><category><![CDATA[SharingKnoweldge]]></category><category><![CDATA[hoangpn]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Thu, 15 Aug 2024 04:38:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/QeMX24DjuTc/upload/ef165e8ba9ba999cde22a87be0c7f9f4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-hieu-ro-ve-luat-choi"><strong>Hiểu rõ về luật chơi</strong></h1>
<ol>
<li><p>Đây là một sân chơi mới, mà chúng ta là những developer, những người chưa có kinh nghiệm về quản lý dự án đang tập tành bước vào.</p>
</li>
<li><p>Biết "mình", biết "người", vì thế chúng ta cần chuẩn bị sẵn những vũ khí a.k.a nền tảng kiến thức của quản lý dự án. Chứ không phải dựa vào kinh nghiệm làm team leader, làm developer, hoặc những người đi trước để quản lý dự án.</p>
</li>
</ol>
<h1 id="heading-cac-kien-thuc-nen-tang">Các kiến thức nền tảng</h1>
<h3 id="heading-quan-ly-du-an-la-gi">Quản lý dự án là gì?</h3>
<p>Quản lý Dự án là quá trình <strong>lập kế hoạch</strong>, <strong>tổ chức</strong>, <strong>thực hiện</strong> và <strong>kiểm soát</strong> các nguồn lực, thời gian và chi phí để đạt được các mục tiêu cụ thể của dự án.</p>
<p>Một Project Manager cần phải <strong>nắm vững</strong> quy trình quản lý dự án, từ việc khởi tạo, lập kế hoạch, triển khai, giám sát đến kết thúc dự án.</p>
<h3 id="heading-cac-buoc-co-ban-cua-quy-trinh-quan-ly-du-an-bao-gom"><strong>Các bước cơ bản của quy trình quản lý dự án bao gồm:</strong></h3>
<ol>
<li><p>What?</p>
<ol>
<li><p><strong>Khởi tạo</strong>: Xác định mục tiêu, phạm vi và các bên liên quan của dự án.</p>
</li>
<li><p><strong>Lập kế hoạch</strong>: Phát triển kế hoạch dự án chi tiết, bao gồm các mốc thời gian, nguồn lực và ngân sách.</p>
</li>
<li><p><strong>Thực hiện</strong>: Triển khai kế hoạch, phối hợp các nguồn lực và quản lý các hoạt động của dự án.</p>
</li>
<li><p><strong>Giám sát và kiểm soát</strong>: Theo dõi tiến độ dự án, điều chỉnh kế hoạch khi cần thiết và đảm bảo rằng dự án đang đi đúng hướng.</p>
</li>
<li><p><strong>Kết thúc</strong>: Đánh giá kết quả và hoàn tất các thủ tục kết thúc dự án.</p>
</li>
</ol>
</li>
</ol>
<h3 id="heading-ky-nang-quan-ly-thoi-gian-va-nguon-luc"><strong>Kỹ năng quản lý thời gian và nguồn lực</strong></h3>
<ol>
<li><p>What?</p>
</li>
<li><p>Why?</p>
<ol>
<li>Đảm bảo rằng <strong>tất cả</strong> các <strong>nhiệm vụ</strong> được hoàn thành trong khoảng <strong>thời gian đã định</strong>.</li>
</ol>
</li>
<li><p>How?</p>
<ol>
<li><p>Phân bổ nguồn lực đúng lúc, đúng nơi</p>
</li>
<li><p><strong>Kỹ thuật quản lý thời gian</strong>: Áp dụng các kỹ thuật như Pomodoro, Eisenhower Matrix để tối ưu hóa hiệu quả làm việc</p>
</li>
</ol>
</li>
<li><p>Tools?</p>
<ol>
<li><p>Các công cụ như Microsoft Project, Asana, hay Trello giúp Project Manager theo dõi tiến độ công việc, phân bổ nhiệm vụ và quản lý nguồn lực.</p>
</li>
<li><p>Hay đơn giản nhất: Excel!</p>
</li>
</ol>
</li>
</ol>
<h3 id="heading-ky-nang-giao-tiep-va-lam-viec-nhom"><strong>Kỹ năng giao tiếp và làm việc nhóm</strong></h3>
<ol>
<li><p>What?</p>
</li>
<li><p>Why?</p>
<ol>
<li><p>Giao tiếp hiệu quả là chìa khóa để một dự án thành công</p>
</li>
<li><p>Có những thống kê như sau: 90% công việc của PM là communicate</p>
</li>
</ol>
</li>
<li><p>How?</p>
<ol>
<li><p><strong>Lắng nghe chủ động</strong>: Luôn lắng nghe để hiểu rõ các vấn đề và nhu cầu của nhóm</p>
</li>
<li><p><strong>Sử dụng ngôn ngữ rõ ràng</strong>: Tránh các thuật ngữ phức tạp và luôn cố gắng truyền đạt thông tin một cách dễ hiểu nhất</p>
</li>
<li><p><strong>Xây dựng mối quan hệ</strong>: Tạo dựng sự tin tưởng và khuyến khích tinh thần làm việc nhóm trong nhóm dự án</p>
</li>
</ol>
</li>
<li><p>Tools?</p>
</li>
<li><p>Should?</p>
<ol>
<li><p>Project Manager cần biết cách truyền đạt thông tin rõ ràng và hiệu quả giữa các thành viên trong nhóm, các bên liên quan và lãnh đạo</p>
</li>
<li><p>Khả năng lắng nghe, đàm phán và giải quyết xung đột cũng là những kỹ năng quan trọng</p>
</li>
</ol>
</li>
</ol>
<h3 id="heading-hieu-biet-ve-cong-cu-va-phuong-phap-quan-ly-du-an"><strong>Hiểu biết về công cụ và phương pháp quản lý dự án</strong></h3>
<ol>
<li><p>What?</p>
<ol>
<li><p><strong>Agile</strong>: Phù hợp với các dự án yêu cầu sự linh hoạt và thay đổi liên tục</p>
</li>
<li><p><strong>Waterfall</strong>: Một phương pháp truyền thống, thường được áp dụng trong các dự án có yêu cầu nghiêm ngặt về quy trình</p>
</li>
<li><p><strong>Scrum và Kanban</strong>: Hai phương pháp được sử dụng rộng rãi trong quản lý dự án phần mềm, giúp tăng cường khả năng cộng tác và tối ưu hóa quy trình làm việc</p>
</li>
</ol>
</li>
<li><p>Why?</p>
<ol>
<li><p>Tools và phương pháp chính là nòng cốt để PM có thể tracking, flowing dự án hiệu quả</p>
</li>
<li><p>Vì thế, chúng ta cần phải thành thạo các tools và phương pháp quản lý dự án khác nhau</p>
</li>
<li><p>Tùy thuộc vào loại dự án và ngành nghề, các công cụ và phương pháp có thể khác nhau, nhưng những phương pháp phổ biến như Agile, Waterfall, Scrum, hay Kanban đều là những kiến thức nền tảng mà một Project Manager cần phải nắm rõ.</p>
</li>
</ol>
</li>
<li><p>Tools?</p>
</li>
<li><p>How?</p>
</li>
<li><p>Should?</p>
</li>
</ol>
<h3 id="heading-ky-nang-giai-quyet-van-de-va-ra-quyet-dinh"><strong>Kỹ năng giải quyết vấn đề và ra quyết định</strong></h3>
<ol>
<li><p>What?</p>
<ol>
<li><p>Trong quá trình thực hiện dự án, sẽ không tránh khỏi những vấn đề phát sinh. Một Project Manager giỏi cần có khả năng nhận diện, phân tích và giải quyết vấn đề một cách nhanh chóng và hiệu quả</p>
</li>
<li><p>Việc ra quyết định chính xác trong những tình huống khẩn cấp cũng là yếu tố quan trọng quyết định sự thành bại của dự án.</p>
</li>
</ol>
</li>
<li><p>Why?</p>
</li>
<li><p>How?</p>
<ol>
<li><p><strong>Nhận diện vấn đề</strong>: Xác định rõ nguyên nhân gốc rễ của vấn đề (Root Cause Analysis)</p>
</li>
<li><p>Xem xét các lựa chọn và cân nhắc lợi ích cũng như rủi ro của từng giải pháp</p>
</li>
<li><p>Chọn phương án tối ưu và thực hiện quyết định đó</p>
</li>
</ol>
</li>
<li><p>Tools?</p>
<ol>
<li><p>5whys?</p>
</li>
<li><p>fishbone?</p>
</li>
</ol>
</li>
<li><p>Should?</p>
</li>
</ol>
<h1 id="heading-ket-luan"><strong>Kết luận</strong></h1>
<p>Trở thành một Project Manager thành công đòi hỏi sự kết hợp của nhiều kỹ năng và kiến thức. Việc hiểu rõ quy trình quản lý dự án, kỹ năng quản lý thời gian và nguồn lực, khả năng giao tiếp và làm việc nhóm, cùng với việc nắm vững các công cụ và phương pháp quản lý dự án sẽ giúp bạn khởi đầu một cách suôn sẻ trên con đường trở thành một Project Manager chuyên nghiệp.</p>
<p>Hy vọng rằng bài viết này đã cung cấp cho bạn cái nhìn tổng quan và những kiến thức cần thiết để bắt đầu hành trình của mình. Hãy tiếp tục học hỏi và trau dồi kỹ năng, vì quản lý dự án là một lĩnh vực không ngừng phát triển và đổi mới.</p>
<p>Nếu bạn cần thêm thông tin hoặc muốn tìm hiểu chi tiết hơn về bất kỳ phần nào trong bài viết, đừng ngần ngại để lại bình luận.</p>
]]></content:encoded></item><item><title><![CDATA[Project Manager 101: Bước chân đầu tiên]]></title><description><![CDATA[Quan điểm
Để câu chuyện dễ theo dõi hơn, mình sẽ làm rõ một vài quan điểm sau


Project manager (PM) mình đang nhắc đến là trong lĩnh vực IT.

Đây là góc nhìn cá nhân của mình (từ một DEV quèn, đang học, hành làm PM). Nên rất mong các bạn đọc hoan hỉ...]]></description><link>https://hoangpn.net/project-manager-101-buoc-chan-dau-tien</link><guid isPermaLink="true">https://hoangpn.net/project-manager-101-buoc-chan-dau-tien</guid><category><![CDATA[project management]]></category><category><![CDATA[#PMP]]></category><category><![CDATA[Share]]></category><category><![CDATA[hoangpn]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Sun, 16 Apr 2023 09:57:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/5aiRb5f464A/upload/2f196855a56d902b521083d9a1590697.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-quan-diem">Quan điểm</h1>
<p>Để câu chuyện dễ theo dõi hơn, mình sẽ làm rõ một vài quan điểm sau</p>
<blockquote>
<ol>
<li><p>Project manager (PM) mình đang nhắc đến là trong lĩnh vực IT.</p>
</li>
<li><p>Đây là góc nhìn cá nhân của mình (từ một DEV quèn, đang <strong>học</strong>, hành làm PM). Nên rất mong các bạn đọc hoan hỉ, và góp ý để mình cải thiện thêm.</p>
</li>
<li><p>Mình chưa có nhiều kinh nghiệm quản lý dự án (như (2) - mình đang học, và rất may mắn đang được thử sức ở một dự án quan trọng của công ty).</p>
</li>
</ol>
</blockquote>
<h1 id="heading-mo-dau">Mở đầu</h1>
<p>Xuất phát từ câu hỏi muôn thuở (thường là của các lập trình viên a.k.a dev): Sau senior thì mình làm gì tiếp theo, hay sau team leader thì mình làm gì nữa nhỉ?</p>
<p>Câu trả lời cho vấn đề trên là: Tuỳ theo từng tổ chức, sẽ có các chức danh, vai trò, nhiệm vụ khác nhau. Nhưng tựu chung, sẽ thường chia thành 2 hướng chính.</p>
<ol>
<li><p>Theo hướng kỹ thuật: Khi các bạn đi theo hướng kỹ thuật, thì mục tiêu các bạn có thể hướng đến là các Software Architecture, sau đó là Technical Consultant, xa hơn nữa, và thường là đích đến sẽ là Chief Technology Officer (a.k.a CTO)</p>
</li>
<li><p>Theo hướng quản lý: Một hướng khác so với hướng kỹ thuật, sẽ là quản lý. Các mục tiêu (về mặt chức vụ) có thể kể đến như là: Project Manager (quản lý dự án), hoặc có thể là Product Manager, Product Owner, sau đó có thể hướng đến các chức vụ quản lý cấp cao như Division Manager, Director Manager, ... xa hơn là có thể là các cấp quản lý C-level</p>
</li>
</ol>
<p>Và mình - xuất thân từ DEV, đã chọn lựa theo hướng quản lý, và bước đi đầu tiên (phù hợp với tổ chức mình đang làm việc) đó là Project Manager (PM).</p>
<blockquote>
<p>Nếu các bạn thắc mắc, tại sao mình theo hướng quản lý - thì xin gặp lại bạn ở bài viết sau nhé!</p>
</blockquote>
<h1 id="heading-hanh-trinh">Hành trình</h1>
<blockquote>
<p>Cuộc hành trình ngàn dặm đều bắt đầu bằng một bước chân đầu tiên nhỏ bé</p>
</blockquote>
<h2 id="heading-step-1-chuan-bi">Step 1: Chuẩn bị</h2>
<p>Để làm được, hay đạt được một điều gì đó, chúng ta cần phải biết nó là gì? Để trở thành PM cũng thế, chúng ta cần phải biết PM là gì?</p>
<blockquote>
<p>Project Manager là người quản lý dự án, đảm bảo rằng dự án được hoàn thành đúng thời hạn, trong ngân sách và đạt được mục tiêu được đề ra.</p>
</blockquote>
<p>Vậy, làm cách nào để có thể trở thành PM?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1681635172182/dab73a68-d381-4955-b0c1-84cbf9705665.png" alt class="image--center mx-auto" /></p>
<p>Nếu bạn <code>search</code> câu hỏi trên ở google, thì sẽ ra khoảng 600k kết quả ~ 0.54(s). Điều đó đồng nghĩa với việc có không ít cách, hoặc không ít người chỉ cho bạn cách để có thể trở thành một PM. Mình sẽ không nhắc đến nó ở bài viết này. Điều mình muốn nhắc đến ở đây đó chính là <code>Mindset</code> (tư duy).</p>
<ol>
<li><p>Bạn cần chuẩn bị một tư duy phát triển - Grownth Mindset: Nó giúp bạn tập trung vào việc học hỏi, cải thiện và phát triển khả năng của mình, thay vì chỉ tập trung vào việc tránh những thách thức và thất bại</p>
</li>
<li><p>Tư duy tổng thể: Cần nhìn nhận mọi vấn đề, mọi việc dưới góc độ toàn diện. Rất khác so với khi bạn đang làm dev (hoặc tester, BrSE) - nhìn nhận dự án dưới một góc độ nhất định. Việc quan sát tổng thể này sẽ thay đổi rất nhiều khi bạn chuyển sang role PM</p>
</li>
<li><p>Tư duy làm việc từ <code>TÂM</code>: Thực ra không chỉ mỗi PM, mà bất kể vị trí nào cũng cần có tư duy này, làm việc xuất phát từ tâm, từ sự mong muốn của bản thân, sẽ giúp cho công việc của bạn có một kết quả cực kì mãn nhãn. Đồng thời, cũng sẽ giúp cho bạn có trách nhiệm. Đối với PM - người có toàn quyền trong dự án, nếu bạn làm việc hời hợt, đơn thuần chỉ là công việc thì bạn sẽ không thể tận dụng hết quyền - trách nhiệm của mình cho chính dự án mình đang dẫn dắt, và đương nhiên, bạn sẽ không thể trở thành một người PM tuyệt vời!</p>
</li>
</ol>
<h2 id="heading-step-2-hanh-dong">STEP 2: Hành động</h2>
<p>Cách nhanh nhất và tốt nhất để bạn có thể trở thành PM trong tổ chức của chính mình, là nói chuyện với cấp lãnh đạo của bạn. Bạn cần bày tỏ nguyện vọng của bản thân mình với các cấp trên của mình. Và sẽ nhận lại được những lời khuyên, sự support từ phía công ty. Và điều này, mình nghĩa là quan trọng nhất!</p>
<p>Đương nhiên, chúng ta vẫn cần phải đảm bảo đủ một vài điều kiện (cần) trước đó.</p>
<ol>
<li><p>Kinh nghiệm là việc: Nếu bạn là một junior dev, bạn cần phấn đấu lên senior dev. Nếu bạn là một senior, cần phấn đấu lên vị trí TL, ...</p>
</li>
<li><p>Kết quả công việc: Nếu công việc hiện tại của bạn chưa tốt (hoặc xuất sắc) thì trước tiên, bạn cần hoàn thành điều đó. Bạn nghĩ sao khi một DEV code chức năng nhỏ nhỏ, nhưng lại nhiều bug - muốn làm PM?</p>
</li>
<li><p>Ảnh hưởng: Lãnh đạo nói chung, hay quản lý nói riêng suy cho cùng là việc bạn có ảnh hưởng (hoặc có thể ảnh hướng đến các thành viên khác) và hướng dẫn, giúp đỡ họ đạt được các mục tiêu (cá nhân, tổ chức, ...). Vì thế, việc bạn có mức độ ảnh hưởng nhất định trong team, trong phòng, hay thậm chí toàn công ty - cũng là một trong những yếu tố không thể thiếu!</p>
</li>
</ol>
<p>Sau đó là các điều kiện đủ</p>
<ol>
<li><p><strong>Kiến thức</strong>: Tập trung nâng cao kỹ năng, kiến thức. Đảm bảo cover đủ các vùng đó. Output có thể là các chứng chỉ chẳng hạn. Cách tốt nhất là xin lời khuyên của các PM đi trước. Nếu không, thì cần tham khảo các khoá học, tài liệu uy tín.</p>
<ol>
<li><p>Ví du: Như ở tổ chức mình đang làm việc, có các khoá học cho các key-member muốn trở thành PM</p>
</li>
<li><p>PMP - chứng chỉ hành nghề uy tín cho PM. Hiện tại ở VN có khác trung tâm đào tạo để chúng ta có thể đạt được!</p>
</li>
<li><p>...</p>
</li>
</ol>
</li>
<li><p><strong>Môi trường</strong>: Cần có môi trường để chúng ta có thể được học hỏi, và làm! Đây là điều rất quan trọng (đó là lý do vì sao mình đã nói là chúng ta cần sự ủng hộ của tổ chức). Nếu bạn chưa có mội trường, cần tạo ra môi trường đó bằng cách nhờ sự giúp đỡ của PM hiện tại, hoặc trưởng phòng, hoặc thậm chí là Giám đốc của chính tổ chức của bạn.</p>
<blockquote>
<p>Nên ghi nhớ rằng: Tố chức của bạn phải có chức danh PM nhé. Nếu không có thì có 2 hướng: một là tạo ra chức danh PM ở tổ chức hiện tại. Hai là đi tìm tổ chức khác!</p>
</blockquote>
</li>
</ol>
<p>Cuối cùng đó chính là <code>Massive Action!</code></p>
<blockquote>
<p>Massive action là việc thực hiện một lượng công việc lớn trong một khoảng thời gian ngắn nhằm đạt được mục tiêu đặt ra. Thay vì chỉ làm những việc cần thiết để hoàn thành công việc, người thực hiện massive action sẽ làm tất cả những gì có thể để đạt được mục tiêu của họ. Điều này bao gồm việc đưa ra kế hoạch chi tiết, đặt ra các mục tiêu cụ thể, tập trung vào những việc quan trọng và tối ưu hóa thời gian và tài nguyên để đạt được hiệu quả cao nhất.</p>
</blockquote>
<h1 id="heading-nhung-kho-khan-lam-tuong">Những khó khăn, lầm tưởng</h1>
<h2 id="heading-lam-tuong">Lầm tưởng</h2>
<ol>
<li><p>Project manager không cần biết về kỹ thuật: Mình không biết đã nghe câu này bao nhiêu lần rồi nữa, mọi người thường nghĩ việc làm Project mananger (quản lý dự án) chẳng cần phải biết quá nhiều về kỹ thuật. Chỉ cần quản lý tốt là được. Nhưng vấn đề là, quản lý dự án trong lĩnh vực IT là một điều hoàn toàn khác. IT là một ngành, nghề thay đổi theo từng ngày, thậm chí là từng giờ! Việc bạn nắm được kỹ thuật, và có kiến thức tốt về chúng, là một lợi thế rất lớn để giúp bạn là một người PM xuất sắc!</p>
</li>
<li><p>Project manager chỉ làm việc dự án: Trong thực tế, PM là người kết nối dự án với các bên liên quan (stakeholder) nhằm đảm bảo cho dự án diễn ra thuận lợi nhất.</p>
</li>
<li><p>Project manager chỉ là người quản lý dự án: Theo định nghĩa thì đúng, họ chỉ là quản lý dự án. Nhưng trên thực tế, một người PM được cho là xuất sắc thì họ cũng cần phải là người leader giỏi. Họ cần phải thúc đẩy được tiềm năng của các thành viên trong dự án, tạo được môi trường, động lực cho thành viên phát triển tốt nhất có thể.</p>
</li>
</ol>
<h2 id="heading-kho-khan">Khó khăn</h2>
<ol>
<li><p>Bạn là một người hướng nội: Để trở thành PM, bạn cần có một kỹ năng giao tiếp, đàm phán tốt - và điều đó diễn ra hàng ngày. Rất khó khăn nếu bạn cảm thấy việc giao tiếp là khó khăn</p>
</li>
<li><p>Bạn là dev (tester, ...): Như mình, một người làm về kỹ thuật, khi chuyển sang hướng đi PM, bạn không làm việc với các dòng code, các vấn đề kỹ thuật nữa. Thay vào đó là làm việc với con người! Nó sẽ không chỉ đơn giản như việc bạn tìm thấy solution cho một bài toán, bạn áp dụng, nó chỉ có đúng hoặc sai. Nhưng với con người hoàn toàn khác. Mỗi người mỗi tính, mỗi mục tiêu, mỗi cách giao tiếp, trò chuyện khác nhau. Và mình thực sự gặp khá nhiều khó khăn trong vấn đề này!</p>
</li>
</ol>
<h1 id="heading-tong-ket">Tổng kết</h1>
<p>Nhìn chung, việc trở thành PM (theo hướng quản lý) sẽ có vô vàn khó khăn, nhưng bên cạnh đó cũng có rất nhiều sự thú vị. Để tiện cho bạn đọc (lười đọc như mình), mình sẽ tổng kết một vài ý chính như sau</p>
<ol>
<li><p>Sau Team Leader, Senior thì chúng ta sẽ làm gì?</p>
<ol>
<li><p>Tech: Solution Architecture -&gt; Technical Consultant -&gt; CTO</p>
</li>
<li><p>Manager: PM (Project Manager, Product Manager) -&gt; Division Manager -&gt; C-level Manager</p>
</li>
</ol>
</li>
<li><p>Để trở thành PM cần làm (có) gì?</p>
<ol>
<li><p>Tư duy</p>
</li>
<li><p>Kiến thức</p>
</li>
<li><p>Môi trường</p>
</li>
<li><p>Chú ý:</p>
<ul>
<li><p>Cần nói chuyện với lãnh đạo (để có thể support tốt nhất cho bạn)</p>
</li>
<li><p>Cần tìm được môi trường có thể đáp ứng được mong muốn của bạn</p>
</li>
<li><p>Trước đó, cần nhìn nhận lại bản thân xem đã đủ các điều kiện để có thể bước tiếp trở thành PM chưa?</p>
</li>
</ul>
</li>
</ol>
</li>
<li><p>Một vài lầm tưởng, khó khăn</p>
<ol>
<li><p>Lầm tưởng</p>
<ol>
<li><p>PM chỉ quản lý dự án, chỉ làm việc trong dự án</p>
</li>
<li><p>PM không cần biết về kỹ thuật</p>
</li>
</ol>
</li>
<li><p>Khó khăn</p>
<ol>
<li>Làm việc với con người!</li>
</ol>
</li>
</ol>
</li>
</ol>
<p>Cuối cùng, bài viết dự trên quan điểm cá nhân, nên sẽ có sự sai sót. Rất mong các bạn để lại ý kiến, comment cho mình!</p>
]]></content:encoded></item><item><title><![CDATA[[Trải nghiệm] Đơn giản là thư giãn]]></title><description><![CDATA[Chào các bạn, khá lâu rồi chúng ta mới lại có dịp ngồi lại với nhau như thế này.
Hôm nay, chúng ta cùng nhau thảo luận một chút về việc thư giãn của bản thân nhé.

Một thời gian dài, mình có khá nhiều việc cá nhân cản trở việc viết của mình (do lười ...]]></description><link>https://hoangpn.net/trai-nghiem-don-gian-la-thu-gian</link><guid isPermaLink="true">https://hoangpn.net/trai-nghiem-don-gian-la-thu-gian</guid><category><![CDATA[relax]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[lifestyle]]></category><category><![CDATA[non tech ]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Sun, 27 Nov 2022 11:37:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/KVym2PAn1gA/upload/v1669547521341/pszaH-1Nqm.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Chào các bạn, khá lâu rồi chúng ta mới lại có dịp ngồi lại với nhau như thế này.</p>
<p>Hôm nay, chúng ta cùng nhau thảo luận một chút về việc thư giãn của bản thân nhé.</p>
<hr />
<p>Một thời gian dài, mình có khá nhiều việc cá nhân cản trở việc viết của mình (<code>do lười không viết thì có</code>). Thì hôm nay, với một chút coldbrew nhẹ nhàng, yên ả kết hợp với việc tiết trời mát mẻ, đôi lúc se se lạnh, và một chút nắng cuối tuần. Tất các các dư vị công lại đã khiến cho con tim nhẹ nhàng này lại phải thốn thức, đôi tay thô kệch này lại phải gõ phím không nguôi.</p>
<p>Quay trở lại với tiêu đề, thư giãn là gì?</p>
<p>Đôi lúc chúng ta thường lầm tưởng khái niệm này với việc buông thả, hưởng thụ. Để làm rõ, chúng ta cùng đi vào khái niệm của thư giãn.</p>
<blockquote>
<p>Relaxation in psychology is the emotional state of a living being, of low tension, in which there is an absence of arousal, particularly from negative sources such as anger, anxiety, or fear</p>
</blockquote>
<p>Tạm dịch ra theo tiếng việt, nôm na là</p>
<blockquote>
<p>Thư giãn trong tâm lý là trạng thái cảm xúc của một sinh vật (sống), ít căng thẳng, trong đó không có sự kích thích, đặc biệt là từ các nguồn tiêu cực như tức giận, lo lắng hoặc sợ hãi</p>
</blockquote>
<p>Vậy ích lợi của việc thư giãn là gì? Ngay bản thân cụm từ <code>thư giãn</code>, cũng đã khiến cho chúng ta có một mường tượng gì đó rất nhẹ nhàng, thư thả, thoải mái rồi nhỉ. Về ích lợi của nó thì rất nhiều (tạm thời mình sẽ không bàn đến ở đây)</p>
<p>Quay lại với câu nói lúc đầu <code>rất nhiều người nhầm lẫn giữa thư giãn và việc buông thả, hưởng thụ</code>. Hãy hiểu đơn giản rằng, thư giãn không có nghĩa là không kiểm soát bản thân, thư giãn là cách chúng ta nạp lại năng lượng thể chất và tinh thần cho bản thân mình. Chúng ta cần ý thức được việc bản thân chúng ta cần thư giãn. Và chúng ta xứng đáng với điều đó.</p>
<p>Thư giãn, hiểu đơn giản như một trong những trạm sạc năng lượng, để cho chuyến xe hành trình cuộc đời của chúng ta có thể đi một cách tốt nhất, êm ả nhất.</p>
<p>Mình đã từng là một người rất bức bối về việc cần phải phát triển bản thân mạnh mẽ, cần phải phát triển công việc nhanh chóng, cần phải hardwork, etc, ... Nhưng rồi cho đến bây giờ, mình nhận thấy thư giãn là một phần chúng ta không thể thiếu, mình coi đó như một sự trưởng thành trong suy nghĩ, trưởng thành trong cách nhìn nhận bản thân, nhìn nhận cuộc sống.</p>
<hr />
<h1 id="heading-tong-ket">Tổng kết</h1>
<ol>
<li>Thư giãn - theo mình nghĩ là điều cần thiết của mỗi người, chúng ta cần nó, để có thể phát triển được bền vững hơn.</li>
<li>Thư giãn - có nhiều cách khác nhau, cũng tuỳ vào từng người sẽ có các trải nghiệm khác nhau.</li>
<li>Thư giãn, chứ không phải buông thả, hưởng thụ.</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[[Basic knowledge][Internet] DNS là gì?]]></title><description><![CDATA[What is DNS
Trong phần này, chúng mình sẽ điểm qua, và nhắc lại nhanh một vài khái niệm cơ bản trong internet

Network: Một nhóm các máy tính và các thiết bị kết nối với nhau
Internet
Global
Networks của networks


IP: Mỗi thiết bị trong internet sẽ ...]]></description><link>https://hoangpn.net/basic-knowledgeinternet-dns-la-gi</link><guid isPermaLink="true">https://hoangpn.net/basic-knowledgeinternet-dns-la-gi</guid><category><![CDATA[Blogging]]></category><category><![CDATA[dns]]></category><category><![CDATA[Technical writing ]]></category><category><![CDATA[hoangpn]]></category><category><![CDATA[knowledge]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Thu, 06 Oct 2022 10:41:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/ZiQkhI7417A/upload/v1665051922523/tXg6VFNFR.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-what-is-dns">What is DNS</h1>
<p>Trong phần này, chúng mình sẽ điểm qua, và nhắc lại nhanh một vài khái niệm cơ bản trong internet</p>
<ul>
<li>Network: Một nhóm các máy tính và các thiết bị kết nối với nhau</li>
<li>Internet<ul>
<li>Global</li>
<li>Networks của networks</li>
</ul>
</li>
<li><p>IP: Mỗi thiết bị trong internet sẽ có 1 địa chỉ IP khác nhau, và đây cũng chính là cách mà một máy tính (thiết bị) có thể <strong>nói chuyện</strong> với một máy tính (thiết bị) khác</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1665052388445/8uBvRMpWN.png" alt="dns-and-how-it-works-1.png" /></p>
</li>
<li><p>DNS: Domain Name System: là một hệ thống giúp phân giải từ domain name (tên miền), sang địa chỉ IP</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1665052405896/42bdFCkXV.png" alt="dns-and-how-it-works-2.png" /></p>
</li>
</ul>
<h1 id="heading-how-dns-works">How DNS works</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1665052471685/C0_E0xaGZ.png" alt="dns-and-how-it-works-3.png" /></p>
<p>Trên đây là tổng quan về việc tìm kiếm IP từ domain.</p>
<h3 id="heading-tim-kiem-o-may-client">Tìm kiếm ở máy client</h3>
<p>Khi truy cập vào một domain bất kì (mở trình duyệt và nhập đường dẫn). </p>
<ol>
<li>Việc tìm kiếm sẽ được bắt đầu từ <strong>Browser Cache</strong> - nếu trước đó trình duyệt đã truy cập domain đó, thì địa chỉ IP sẽ được trả về ngay. và thực hiện thao tác request tới server tương ứng.</li>
<li>Nếu <strong>Browser Cache</strong> không có dữ liệu tương ứng. Việc tìm kiếm sẽ được đi tiếp sang tầng DNS Cache (lưu ở máy client), và Hosts File (được định nghĩa trong file hosts ở máy client)</li>
<li>Nếu Toàn bộ các phần trên không có. Chúng sẽ bắt đầu tìm kiếm ra ngoài máy client.</li>
</ol>
<h3 id="heading-tim-kiem-o-ngoai-may-client">Tìm kiếm ở ngoài máy client</h3>
<ol>
<li>Nơi đầu tiên được tìm đến là <strong>Recursive DNS Servers</strong> (thường là các ISP - Internet Service Provider, ví dụ như Viettel, FPT, …). Các ISP này <strong>không lưu trữ IP của các domain</strong>, mà nó sẽ có cache - ví dụ một user khác truy cập vào trang web tương tự, thì địa chỉ IP và domain tương ứng sẽ được cache lại.</li>
<li>Và nếu không tìm thấy, từ <strong>Recursive DNS Servers</strong> sẽ gọi đến <strong>Root DNS Servers,</strong> ở đây sẽ lưu trữ Top Level Domains (<strong>TLDs</strong>), ví dụ như <strong>.com, .vn, .net.</strong> Từ đây sẽ trả về địa chỉ IP của <strong>TLD</strong> server tương ứng với domain mà user đang truy cập (ở ví dụ đang là <strong>.com</strong>)</li>
<li><strong>Recursive DNS Servers</strong> sau khi có được địa chỉ IP của <strong>TLD server,</strong> chúng sẽ gọi vào đây để lấy thông tin của authoritative name server (<strong>NS</strong>) -  là nơi lưu trữ lại thông tin chính xác của server chứa thông tin domain.</li>
<li>Sau khi có được địa chỉ IP của Authoritative Name Server, Recursive DNS Servers sẽ gọi vào đây để lấy thông tin của địa chỉ IP tương ứng với domain (ở ví dụ là google). Và thông tin này có thể được cache lại tại Recursive DNS Servers. Sau đó sẽ trả về cho browsers của người dùng (đương nhiên, cũng có thể được browsers cache lại)</li>
</ol>
<h1 id="heading-domain-info">Domain Info</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1665052509006/LplIIMvLA.png" alt="dns-and-how-it-works-4.png" /></p>
<p>Ở phần này, chúng ta cùng tìm hiểu sâu hơn về Domain Info, nơi chứa các DNS records, hoặc Zone files.</p>
<p>DNS records, hoặc Zone files được phân thành các loại như sau</p>
<ol>
<li><p>A record - Address record: là record dùng để trỏ tên miền sang địa chỉ IP tương ứng</p>
<p> Như ở ví dụ bên dưới, giả sử website là <a href="https://hoangpn.com">https://hoangpn.com</a></p>
<p> Chúng ta thấy</p>
<ul>
<li><code>@</code> naked domain, tượng trưng cho <code>hoangpn.com</code> sẽ được trỏ đến IP là <code>76.76.21.21</code></li>
<li><code>app</code> hoặc bất kì tên miền nào khác - sẽ là <strong>sub domain</strong>: <code>app.hoangpn.com</code> được trỏ đến địa chỉ IP là <code>76.76.21.21</code></li>
<li>Note: TTL = Time To Live: đây là khoảng thời gian mà DNS cache lưu trữ tương ứng name tương ứng với địa chỉ IP
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1665052561089/Mw78L9HlR.png" alt="image.png" /></li>
</ul>
</li>
<li><p>CNAME record - Canonical Name record là bản ghi quy định alias cho một domain nào đó, được chỉ đến domain, hoặc sub domain nào đó</p>
<p> Như ví dụ bên dưới, chúng ta alias việc truy cập <code>www.hoangpn.com</code> sẽ trỏ sang domain <code>hoangpn.com</code>. Hoặc có thể truy cập <code>fb.hoangpn.com</code> sẽ được trỏ sang <code>fb.com/hoangpn</code></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1665052625798/VVMdr734g.png" alt="image.png" /></p>
</li>
<li><p>MX record - Mail Exchange record: là record xác định mail server mà email sẽ được gửi tới</p>
<p>Như ví dụ bên dưới, chúng ta có thể thấy được những mail đuôi  <code>@hoangpn.com</code>, ví dụ như <code>admin@hoangpn.com, user_a@hoangpn.com</code> sẽ được gửi về mail server là <code>mail.example.com</code>  <code>mail-2.example.com</code> , với trọng số là 10, và 20 - đây chính là độ ưu tiên xem sẽ ưu tiên gửi vào mail server nào trước.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1665052691106/XxLMPeB-R.png" alt="image.png" /></p>
</li>
<li><p>TXT record - Text record: giúp chứa các thông tin dưới dạng text của 1 tên miền. Chủ yếu dùng cho server bên thứ 3 xác định xem domain có đáng tin cậy hay không.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1665052717868/9N0q8n9zK.png" alt="image.png" /></p>
</li>
<li><p>NS record - Name Server record: giúp xác định thông tin của một tên miền cụ thể được khai báo và quản lý trên máy chủ nào.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1665052749771/G4Q9bapQI.png" alt="image.png" /></p>
</li>
</ol>
<h1 id="heading-tong-ket">Tổng kết</h1>
<p>Qua các phần trình bày bên trên, chúng ta đã nắm được cơ bản về domain name services là gì và cách nó hoạt động ra sao.
Hy vọng các kiến thức trên sẽ giúp ích cho các bạn ít nhiều.</p>
<p>Nhưng mọi khi, tuy đã rà soát lại, nhưng cũng sẽ không tránh khỏi việc có sai sót. Mong các bạn để lại góp ý, và cùng giúp nhau tiến bộ nhé.</p>
]]></content:encoded></item><item><title><![CDATA[[Basic knowledge][Internet] Domain Name là gì?]]></title><description><![CDATA[Domain Name là gì?
Quay trở lại một chút với các kiến thức cơ bản. Chúng ta đã biết được rằng, để các máy tính có thể giao tiếp được với nhau, chúng cần phải biết địa chỉ IP. Việc chúng ta - con người, có thể nhớ được một chuỗi địa chỉ IP dài khác nh...]]></description><link>https://hoangpn.net/domain-name-la-gi</link><guid isPermaLink="true">https://hoangpn.net/domain-name-la-gi</guid><category><![CDATA[hoangpn]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Share]]></category><category><![CDATA[domain]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Tue, 04 Oct 2022 11:54:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1664883691733/CZ2zPhXSw.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-domain-name-la-gi">Domain Name là gì?</h1>
<p>Quay trở lại một chút với các kiến thức cơ bản. Chúng ta đã biết được rằng, để các máy tính có thể giao tiếp được với nhau, chúng cần phải biết địa chỉ IP. Việc chúng ta - con người, có thể nhớ được một chuỗi địa chỉ IP dài khác nhau là điều rất khó khăn. Vậy làm thế nào để khắc phục điều này.</p>
<p>Từ khó khăn đó, Domain Name, hay còn gọi là tên miền ra đời. Chúng thay thế cho việc nhớ các con số (địa chỉ IP), bằng cách nhớ các tên dễ hơn, ví dụ như: <strong>google.com</strong>, <strong>hoangpn.com.</strong></p>
<p>Tóm lại, nôm na chúng ta có thể hiểu <strong>Domain Name = ánh xạ của địa chỉ IP</strong></p>
<h1 id="heading-ai-quan-ly-domain-name">Ai quản lý Domain Name?</h1>
<p>Các domain names được quản lý bởi các công ty đăng ký tên miền - các công ty này được uỷ quyền tạm thời là chủ sở hữu của tên miền. Bất kỳ ai muốn tạo một trang web với tên miền nào đó, có thể đăng ký với các công ty nói trên. Ở việt nam có một vài công ty nổi tiếng như: <strong>Mắt Bão</strong>, <strong>HostVN</strong>, hay một số công ty khác như <strong>godaddy.com</strong></p>
<p>Bạn sẽ cần phải trả phí hàng năm (hoặc hàng tháng) để có thể duy trì tên miền. Ví dụ như <code>hoangpn.com</code> Khi tên miền sắp hết hạn, các công ty quản lý tên miền sẽ có nhiệm vụ thông báo cho các bạn gia hạn tên miền của mình, để đảm bảo rằng bạn sẽ không bị mất đi tên miền của mình vào tay người dùng khác.</p>
<h1 id="heading-cac-thanh-phan-cua-mot-domain-name">Các thành phần của một Domain Name</h1>
<p>Domain names are typically broken up into two or three parts, each separated by a dot. When read right-to-left, the identifiers in domain names go from most general to most specific. The section to the right of the last dot in a domain name is the top-level domain (TLD). These include the ‘generic’ TLDs such as ‘.com’, ‘.net’, and ‘.org’, as well as country-specific TLDs like ‘.uk’ and ‘.jp’.</p>
<p>Domain names thường sẽ được tách thành 2, 3 phần khác nhau, được ngăn cách bởi dấu <code>.</code> </p>
<p>Khi đọc từ phải sang trái, tên được ngăn cách đầu tiên bởi dấu <code>.</code> được gọi là TLD - Top Level Domain, lần lượt các tên tiếp theo được gọi là 2LD, 3LD, … ví dụ như: <code>hoangpn.com</code> ⇒ có TLD là <code>.com</code> , 2LD là <code>hoangpn</code></p>
<h1 id="heading-domain-name-vs-urls">Domain Name vs URLs</h1>
<p>Đôi khi chúng ta thường nhầm lẫn 2 khái niệm này với nhau. Ở phần này, chúng ta sẽ cùng tìm hiểu và so sánh về 2 khái niệm là Domain Name và URL.</p>
<p>Dưới đây là cấu trúc đầy đủ của một URL</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664883226599/Vl0KARMt3.png" alt="what-is-domain-name.png" /></p>
<p>Như chúng ta đã thấy, thì Domain Name chỉ là 1 phần của URL. Chúng ta sẽ cùng đi qua các phần của URL</p>
<ol>
<li>Scheme: đây là phần cho biết giao thức mà trình duyệt sẽ dùng để gửi đi request, thường sẽ là <strong>http</strong>, hoặc <strong>https</strong>. Trong một vài trường hợp có thể là <strong>mailto:</strong> ⇒ dùng để gửi mail.</li>
<li>Domain Name: Phần này chính là tên miền (mà mình vừa trình bày ở phía trên)</li>
<li>Port: Đây là cổng để gói tin (browsers request) có thể đến được đúng nơi mà nó muốn truy cập. Mỗi một ứng dụng khác nhau sẽ có một port tương ứng khác nhau. Một vài port thường gặp như<ol>
<li>80 ⇒ đại điện cho http</li>
<li>443 ⇒ đại diện cho https</li>
<li>3306 ⇒ đại diện cho MySQL database</li>
<li>…</li>
</ol>
</li>
<li>Path to the file: <code>/path/to/myfile.html</code> là đường dẫn đến tài nguyên (resources) trên server.</li>
<li>Parameters: <code>?key1=value1&amp;key2=value2</code> là các tham số bổ sung được truyền lên cho server để xác định các tài nguyên cụ thể hơn. Được biểu hiện là các cặp <code>key-value</code>, được phân tách bằng dấu <code>?</code></li>
<li>Anchor: <code>#SomewhereInTheDocument</code> là phần <strong>neo</strong> đến phần nào đó trong trang web được trả về. Lưu ý rằng phần này sẽ không được gửi lên trên server, mà sẽ chỉ xử lý ở browsers.</li>
</ol>
<h1 id="heading-tong-ket">Tổng kết</h1>
<p>Qua các phần trình bày bên trên, chúng ta đã nắm được cơ bản về domain name là gì, và tránh sự nhầm lẫn giữa domain name với Urls.</p>
<p>Hy vọng các kiến thức trên sẽ giúp ích cho các bạn ít nhiều.</p>
<p>Nhưng mọi khi, tuy đã rà soát lại, nhưng cũng sẽ không tránh khỏi việc có sai sót. Mong các bạn để lại góp ý, và cùng giúp nhau tiến bộ nhé.</p>
]]></content:encoded></item><item><title><![CDATA[[Basic knowledge][Internet] Browsers hoạt động như thế nào?]]></title><description><![CDATA[Internet phát triển qua hàng thập kỉ, bên cạnh nó là sự phát triển không ngừng của các trình duyệt web, hay chúng ta còn thường gọi là browsers.
Các trình duyệt chúng ta có thể điểm qua như

Internet Explorer
Chrome
Firefox
Safari
Opera
…

Đương nhiê...]]></description><link>https://hoangpn.net/browsers-hoat-dong-nhu-the-nao</link><guid isPermaLink="true">https://hoangpn.net/browsers-hoat-dong-nhu-the-nao</guid><category><![CDATA[hoangpn]]></category><category><![CDATA[Browsers]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[Share]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Tue, 04 Oct 2022 08:52:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/JySoEnr-eOg/upload/v1664872351606/QteqsCpt7.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Internet phát triển qua hàng thập kỉ, bên cạnh nó là sự phát triển không ngừng của các trình duyệt web, hay chúng ta còn thường gọi là browsers.</p>
<p>Các trình duyệt chúng ta có thể điểm qua như</p>
<ul>
<li>Internet Explorer</li>
<li>Chrome</li>
<li>Firefox</li>
<li>Safari</li>
<li>Opera</li>
<li>…</li>
</ul>
<p>Đương nhiên, cũng có các trình duyệt khác trên mobile nữa, nhưng tôi sẽ không quá đi sâu vào nó.</p>
<p>Vào cái thời mà IE (Internet Explorer) còn thống trị, làm mưa làm bão thì chúng ta gần như không thể biết được bên trong IE là gì, chúng ta buộc phải coi nó là một “black box”. Nhưng thời thế đã thay đổi IE giờ đã bị khai tử, và thay vào đó là hàng loạt các trình duyệt phát triển dựa trên open source (mã nguồn mở). Và đây là thời điểm để chúng ta đi sâu vào bên trong chúng, để xem thực sự thì bên trong trình duyệt có gì, và cách chúng hoạt động như thế nào??</p>
<h1 id="heading-chuc-nang-chinh-cua-browsers">Chức năng chính của browsers</h1>
<p>Chức năng chính của trình duyệt là hiển thị tài nguyên web bạn truy cập, bằng cách request tài nguyên đó từ server và hiển thị trong cửa sổ trình duyệt. Tài nguyên thường là tài liệu HTML, nhưng cũng có thể là PDF, hình ảnh hoặc một số loại nội dung khác. Vị trí của tài nguyên được chỉ định bởi người dùng bằng cách sử dụng URI (Uniform Resource Identifier - Định danh tài nguyên đồng nhất).</p>
<p>Cách trình duyệt diễn giải và hiển thị các tệp HTML được chỉ định trong thông số kỹ thuật HTML và CSS. Các thông số kỹ thuật này được duy trì bởi tổ chức W3C (World Wide Web Consortium), là tổ chức tiêu chuẩn cho web. Trong nhiều năm, các trình duyệt chỉ tuân theo một phần thông số kỹ thuật và phát triển các tiện ích mở rộng (extensions) của riêng chúng. Điều đó gây khó khăn cho các nhà phát triển web (web developer). Nhưng cho đến thời điểm hiện tại, điều này gần như là không còn.</p>
<p>Browsers tuy có nhiều bên phát triển khác nhau, nhưng nhìn chung, chúng đều có các thành phần sau </p>
<ol>
<li>Nơi gõ địa chỉ web - URI</li>
<li>Các nút Back và forward</li>
<li>Tuỳ chọn bookmarking</li>
<li>Refresh và stop buttons dùng để tải lại, hoặc dừng tải trang.</li>
<li>Home button</li>
<li>…</li>
</ol>
<p>Giao diện của các browsers được hình thành và phát triển qua nhiều năm dựa trên những feedback, đánh giá của người dùng. Các đặc tả HTML chỉ là một phần bên trong, chúng không ảnh hưởng tới các thành phần kể trên.</p>
<h1 id="heading-kien-truc-cua-browsers">Kiến trúc của browsers</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664872459836/lzdnHY708.png" alt="browsers-and-how-they-works1.png" /></p>
<p>Browsers nói chúng, có kiến trúc cơ bản gồm các thành phần sau</p>
<ol>
<li><strong>The user interface</strong>: bao gồm thanh địa chỉ, nút back/forward, bookmarking, v.v.. Mọi phần của browser trừ cửa sổ nơi bạn nhìn thấy trang web được load.</li>
<li><strong>The browser engine</strong>: đây là phần quan trọng nhất của trình duyệt, nó chịu trách nhiệm kết nối, đối ứng các thao tác của người dùng với tầng <strong>rendering engine</strong>.</li>
<li><strong>The rendering engine</strong>: chịu trách nhiệm hiển thị nội dung trang web được truy cập. Ví dụ: nếu nội dụng bạn request là HTML, rendering engine sẽ phân tích HTML và CSS, sau đó sẽ hiển thị nội dung đã được phân tích, xử lý ra ngoài màn hình.</li>
<li><strong>Networking</strong>: chịu trách nhiệm quản lý việc call networks bằng các giao thức tiêu chuẩn như HTTP hoặc FTP. Nó cũng xem xét các vấn đề bảo mật liên quan đến giao tiếp internet.</li>
<li><strong>UI backend</strong>: thành phần này sử dụng các phương pháp giao diện người dùng của hệ điều hành cơ bản. Nó chủ yếu được sử dụng để vẽ các thành phần cơ bản như (window và boxes).</li>
<li><strong>JavaScript interpreter</strong>: chịu trách nhiệm phân tích và thực thi mã <strong>JavaScript</strong></li>
<li><strong>Data storage:</strong> web browser cần lưu trữ nhiều loại dữ liệu khác nhau ở ngay tại trình duyệt, chẳng hạn như cookies. Các trình duyệt cũng hộ trợ việc lưu trữ các dữ liệu khác như localStorage, IndexedDB, WebSQL và FileSystem.</li>
</ol>
<p>NOTE: Các trình duyệt như Chrome chạy nhiều phiên bản của rendering engine: một phiên bản cho mỗi tab, nghĩa là mỗi tab chạy trong một quy trình riêng biệt.</p>
<h1 id="heading-qua-trinh-lay-server-response">Quá trình lấy Server response</h1>
<h3 id="heading-navigation">Navigation</h3>
<p>Người dùng nhập trên trang web muốn truy cập lên trình duyệt, và bấm nút enter, hoặc nút truy cập (tuỳ theo mỗi trình duyệt sẽ có giao diện khác nhau). Sẽ tuỳ vào từng trang web, mà latency (độ trễ) để hiển thị trang web sẽ khác nhau ⇒ đây cũng là một điểm mà các web developer cần chú ý.</p>
<h3 id="heading-dns-lookup">DNS lookup</h3>
<p>Từ tên miền (mà người dùng truy cập). sẽ qua một quá trình gọi là phân giải tiên miền. Mục đích là để tìm được địa chỉ IP của server (muốn truy cập). Qua quá trình này, tên miền, sẽ được phân tích thành địa chỉ IP (của server) tương ứng.</p>
<pre><code class="lang-html">https://hoangpn.com =&gt; 76.76.21.21
</code></pre>
<h3 id="heading-tcp-handshake">TCP Handshake</h3>
<p>Khi browser đã biết được IP của server. Giữa chúng sẽ thực hiện một quá trình để có thể kết nối với nhau được gọi là TCP handshake, hay còn gọi là <strong>bắt tay 3 bước</strong></p>
<p>Cơ chế này được thiết kế để cả 2 bên (server và browser) có thể <strong>thương lượng</strong> các tham số của việc kết nối (thông qua TCP socket) trước khi truyền dữ liệu (gửi và nhận) cho nhau.</p>
<p>Kỹ thuật bắt tay ba bước thường được gọi là "SYN-SYN-ACK" - hay chính xác hơn là SYN, SYN-ACK, ACK. Điều này có nghĩa là có thêm request qua lại giữa browser và server mà request web vẫn chưa được thực hiện.</p>
<h3 id="heading-tls-negotiation">TLS Negotiation</h3>
<p>Đối với các kết nối an toàn được thiết lập thông qua HTTP<strong>S</strong>, cần có một "<strong>handshake</strong>" khác. Sự bắt tay này, hay đúng hơn là TLS negotiation, xác định mật mã nào sẽ được sử dụng để mã hóa giao tiếp, xác minh server và thiết lập kết nối an toàn trước khi bắt đầu truyền dữ liệu thực tế. Điều này yêu cầu thêm 3 request qua lại đến server trước khi request web thực sự được gửi.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664873035695/3R2k5Lk2t.png" alt="browsers-and-how-they-works2.png" /></p>
<p>⇒ Sau 8 request qua lại, thì web request sẽ được thực thi.</p>
<h3 id="heading-response">Response</h3>
<p>Khi web request được gửi đi, server sẽ phẩn hồi bằng cách trả về các response, thường là các file HTML.</p>
<pre><code class="lang-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en-US"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>My simple page<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"styles.css"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"myscript.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"heading"</span>&gt;</span>My Page<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>A paragraph with a <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://example.com/about"</span>&gt;</span>link<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"myimage.jpg"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"image description"</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"anotherscript.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Response cho request ban đầu này chứa <strong>byte dữ liệu đầu tiên</strong> nhận được. Time to First Byte (TTFB) là khoảng thời gian từ khi người dùng đưa ra yêu cầu — chẳng hạn bằng cách nhấp vào liên kết — đến khi nhận được gói (packet) HTML đầu tiên này. Phần gói (packet) đầu tiên thường là <strong>14KB</strong>.</p>
<h3 id="heading-tcp-slow-start-14kb-rule">TCP Slow Start / 14KB rule</h3>
<p>Response đầu tiên sẽ là 14KB. Đây là một phần của <strong>TCP slow start</strong>, một thuật toán cân bằng tốc độ của kết nối mạng (network connection). Khởi động chậm dần dần làm tăng lượng dữ liệu truyền cho đến khi xác định được băng thông tối đa của mạng.</p>
<p>Trong <strong>TCP slow start</strong>, sau khi nhận được gói (packet) ban đầu, server sẽ tăng gấp đôi kích thước của packet tiếp theo lên khoảng 28KB. Các packet tiếp theo sẽ tăng kích thước cho đến khi đạt đến ngưỡng xác định trước hoặc xảy ra hiện tượng tắc nghẽn.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664873050827/hSKlVWWKP.png" alt="browsers-and-how-they-works3.png" /></p>
<h1 id="heading-rendering-basic-flow">Rendering basic flow</h1>
<p>Khi trình duyệt nhận được phần dữ liệu đầu tiên (first chunk) từ server, chúng sẽ không hiển thị ngay lên được trên giao diện web, mà sẽ trải qua một <strong>quá trình</strong> để xử lý dữ liệu (nhận được từ server) đó.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664873066169/NmUkTeO9R.png" alt="browsers-and-how-they-works4.png" /></p>
<p>Các bước cơ bản bao gồm:</p>
<ol>
<li>Trang HTML yêu cầu được rendering engine phân tích cú pháp thành nhiều phần (các chunks), bao gồm các file CSS riêng và trong file HTML. Các phần tử HTML sau đó được chuyển đổi thành các DOM nodes để tạo thành <strong>“content tree”</strong> hoặc <strong>“DOM tree.”</strong></li>
<li>Đồng thời, trình duyệt cũng tạo ra một <strong>render tree</strong>. Render tree này bao gồm cả thông tin tạo kiểu (CSS) cũng như các hướng dẫn trực quan xác định thứ tự mà các phần tử sẽ được hiển thị. Render tree đảm bảo rằng nội dung được hiển thị theo thứ tự mong muốn.</li>
<li>Render tree sẽ phải trải qua quá trình bố trí hiển thị (<strong>layout process)</strong>. Khi render tree được tạo, các giá trị vị trí hoặc kích thước không được gán ngay và render tree, mà phải trải qua một quá trình tính toán các giá trị để đánh giá vị trí mong muốn, quá trình này được gọi là bố trí hiển thị (layout process). Trong quá trình này, mọi node đều được gán tọa độ chính xác. Điều này đảm bảo rằng mọi node đều xuất hiện ở một vị trí chính xác trên màn hình</li>
<li>Bước cuối cùng là <strong>vẽ</strong> lên màn hình, trong đó render tree được duyệt qua toàn bộ và phương thức <strong>paint()</strong> được gọi để vẽ từng node trên màn hình bằng cách sử dụng lớp UI backend layer.</li>
</ol>
<p>NOTE: mỗi trình duyệt đều có rendering engine riêng của nó, và đây chính là điều khó khăn đối với các web developers - sẽ cần phải coding sao cho tương thích với mọi trình duyệt. Đồng thời việc kiểm thử của các tester cũng sẽ cần phải đáp ứng trên nhiều trình duyệt khác nhau. Nhưng nhìn chung, việc này đã đơn giản hơn rất nhiều vào thời điểm hiện tại.</p>
<h3 id="heading-parsing">Parsing</h3>
<p>Parsing -  phân tích cú pháp là bước mà trình duyệt sẽ thực hiện để chuyển đổi dữ liệu nhận được (từ server) thành DOM - <strong>Document Object Model</strong> và CSSOM - <strong>CSS Object Model,</strong> đây là bước đầu tiên để trình duyệt có thể hiển thị dữ liệu lên giao diện người dùng.</p>
<p>DOM cũng được hiển thị và có thể được điều khiển thông qua các API khác nhau trong mã Javascript</p>
<p>Ngay cả khi HTML của trang lớn hơn packet 14KB ban đầu, trình duyệt vẫn sẽ bắt đầu parsing và cố gắng hiển thị trải nghiệm dựa trên dữ liệu mà nó có. ⇒ Đây là một điều cần lưu ý cho các web developers nếu muốn tối ưu hoá hiệu suất của trang web. Nhưng tất cả mọi thứ đó, chúng ta cần ghi nhớ rằng HTML, CSS và JavaScript phải trải qua quá trình phân tích cú pháp (parse).</p>
<h3 id="heading-building-dom-tree">Building DOM tree</h3>
<p>Bước đầu tiên là xử lý HTML markup và xây dựng DOM tree. Phân tích cú pháp HTML liên quan đến mã hóa và xây dựng tree. HTML code bao gồm thẻ bắt đầu và thẻ kết thúc, cũng như tên và các giá trị thuộc tính. Nếu tài liệu được định dạng tốt, việc phân tích cú pháp nó sẽ đơn giản và nhanh hơn.</p>
<p>DOM tree là bản mô tả nội dung của tài liệu. Phần tử <strong></strong> là thẻ đầu tiên và là root node của cây tài liệu. Cây này sẽ phản ánh các mối quan hệ và phân cấp giữa các thẻ khác nhau. Các thẻ được lồng trong các thẻ khác là các node con. Số lượng DOM node càng lớn thì thời gian xây dựng DOM tree càng mất nhiều thời gian.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664873080146/lONlc-2-j.png" alt="browsers-and-how-they-works5.png" /></p>
<p>Khi trình phân tích cú pháp tìm thấy các tài nguyên non-blocking, như hình ảnh, trình duyệt sẽ yêu cầu các tài nguyên đó và tiếp tục phân tích cú pháp. </p>
<p>Việc phân tích cú pháp có thể tiếp tục khi gặp phải file CSS, <code>&lt;script&gt;</code> - đặc biệt là những thẻ không có thuộc tính <strong>async</strong> hoặc <strong>defer</strong> (chặn quá trình hiển thị và tạm dừng phân tích cú pháp HTML). Việc phân tích cú pháp có thể bị dừng lại nếu gặp các thẻ đặc <code>&lt;script&gt;</code>, đặc biệt là các thẻ không có thuộc tính như <strong>async, defer.</strong></p>
<p>Mặc dù trình quét tải trước của trình duyệt đẩy nhanh quá trình này, nhưng quá nhiều tập lệnh vẫn có thể ảnh hưởng tới việc hiển thị trang web.</p>
<h3 id="heading-preload-scanner">Preload scanner</h3>
<p>Preload scanner là một quá trình chạy ngầm (background), chạy độc lập với quá trình browsers xây dựng DOM tree. Preload scanner sẽ phân tích cú pháp thông qua nội dung có sẵn, và sẽ request các tài nguyên có độ ưu tiên cao như CSS, JS, web fonts ⇒ nhằm giảm tốc độ load trang.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"styles.css"</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"myscript.js"</span> <span class="hljs-attr">async</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"myimage.jpg"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"image description"</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"anotherscript.js"</span> <span class="hljs-attr">async</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></pre>
<p> Ở ví dụ trên, trong khi luồng chính đang phân tích cú pháp HTML và CSS, preload scanner sẽ tìm các tập lệnh (scripts) và hình ảnh, đồng thời bắt đầu tải chúng xuống.</p>
<p>Để đảm bảo scripts không block quá trình parsing, hãy thêm thuộc tính <code>async</code> hoặc thuộc tính <code>defer</code> nếu thứ tự thực thi và phân tích cú pháp JavaScript là quan trọng.</p>
<p>Việc chờ để có CSS sẽ không block việc parsing HTML, nhưng nó sẽ block JS vì JS thường được sử dụng để truy vấn tác động của thuộc tính CSS lên các phần tử (Element).</p>
<h3 id="heading-building-the-cssom">Building the CSSOM</h3>
<p>Bước quan trọng tiếp theo trong việc xử lý rendering là xử lý CSS và xây dựng cây CSSOM - <strong>CSS Object Model</strong>. CSSOM tương tự như DOM. DOM và CSSOM đều là tree. Chúng là các cấu trúc dữ liệu độc lập. Trình duyệt chuyển đổi các quy tắc CSS thành một bản đồ các style mà nó có thể hiểu và hoạt động. Trình duyệt duyệt qua từng bộ quy tắc trong CSS, tạo một cây gồm các nodes với các mối quan hệ cha (parent), con (child) và anh chị em (sibling) dựa trên các bộ chọn CSS (selectors).</p>
<p>Giống như với HTML, trình duyệt sẽ phải chuyển đổi các quy tắc CSS thành một thứ mà nó có thể hiểu được. Do đó, nó sẽ lặp đi lặp lại quá trình CSS-to-object.</p>
<p>Việc áp dụng CSS sẽ được xếp chồng (ghi đè lên nhau) từ việc phân tích CSSOM.</p>
<p>Nhìn chung, việc áp dụng, hiển thị CSS sẽ rất nhanh, tổng thời tian để tạo CSSOM thường ít hơn thời gian cần cho một lần phân giải DNS thành IP.</p>
<p>Các web developers có thể trực tiếp chỉnh sửa CSS trên công cụ nhà phát triển (developer tool) trên mỗi trình duyệt tương ứng.</p>
<h3 id="heading-javascript-compilation">JavaScript Compilation</h3>
<p>Trong khi CSS được xử lý phân tích cú pháp và hình thành CSSOM, các nội dung khác, bao gồm các file JavaScript sẽ được tải xuống (nhờ preload scanner). JavaScript được <strong>thông dịch</strong>, <strong>biên dịch</strong>, <strong>phân tích cú pháp</strong> và <strong>thực thi</strong>. Các tập lệnh được phân tích cú pháp thành cây cú pháp trừu tượng (abstract syntax trees). Một số công cụ trình duyệt lấy abstract syntax trees và chuyển toàn bộ vào một trình thông dịch, xuất ra mã bytecode - được thực thi trên luồng chính. Đây được gọi là biên dịch JavaScript.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664873172704/qQLaR84I6.png" alt="browsers-and-how-they-works6.png" /></p>
<h2 id="heading-render">Render</h2>
<p>Rendering là bước bao gồm:</p>
<ul>
<li>style</li>
<li>layout</li>
<li>paint</li>
<li>một số trường hợp sẽ có thêm compositing</li>
</ul>
<p>CSSOM và DOM được tạo trong bước phân tích cú pháp được kết hợp thành một cây kết xuất (render tree). Render tree được sử dụng để tính toán bố cục của mọi phần tử hiển thị, sau đó sẽ <strong>vẽ</strong> chúng lên màn hình. Trong một số trường hợp, nội dung có thể được nâng cấp lên các lớp riêng của chúng và được tổng hợp, cải thiện hiệu suất bằng cách vẽ các phần của màn hình trên GPU thay vì CPU, giải phóng luồng chính.</p>
<h3 id="heading-style">Style</h3>
<p>Sau khi hình thành Render Tree. Browsers sẽ duyệt qua từng node (có thể hiển thị) bắt đầu từ DOM root. Các thẻ sẽ không được hiển thị:</p>
<ul>
<li><code>&lt;head&gt;</code> và các thẻ con của nó</li>
<li>bất kì thẻ nào với thuộc tính <code>display: none</code></li>
<li>nodes với thuộc tính  <code>visibility: hidden</code> ⇒ chú ý là thẻ này vẫn được đưa vào render tree.</li>
</ul>
<p>Mỗi nodes hiển thị có các quy tắc CSSOM được áp dụng cho chúng. Render tree chứa tất cả các nodes hiển thị có nội dung và kiểu được tính toán dựa trên CSS cascade.</p>
<h3 id="heading-layout">Layout</h3>
<p>Layout là quá trình lần đầu tiên kích thước và vị trí của các nodes được xác định. Các lần sau được gọi là Reflow.</p>
<p>Layout là quá trình</p>
<ul>
<li>Xác định chiều rộng</li>
<li>Xác định chiều cao</li>
<li>Xác định vị trí của tất cả các nodes trong Render Tree</li>
<li>Xác định  kích thước và vị trí của từng đối tượng trên trang</li>
</ul>
<p>Reflow là quá trình bất kỳ xác định kích thước và vị trí tiếp theo của phần từ trên trang, hoặc toàn bộ documents.</p>
<p>Khi render tree được xây dựng, quá trình layout sẽ bắt đầu. Render tree sẽ xác định các nodes nào được hiển thị (và nodes không hiển thị) cùng với style của chúng, nhưng sẽ không xác định kích thước, hoặc vị trí của mỗi nodes. Để xác định kích thước và vị trí chính xác của từng nodes, browsers duyệt hết Render Tree, bắt đầu từ  root của nó.</p>
<p>Trên trang web, gần như mọi thứ đều là một box. Các thiết bị (devices) khác nhau sẽ có các định dạng kích thước khác nhau. Các định dạng kích thước này sẽ là cơ sở để quá trình layout diễn ra. </p>
<h3 id="heading-paint">Paint</h3>
<p>Bước cuối cùng trong việc rendering là pain - vẽ các nodes riêng lẻ lên trên màn hình.</p>
<p>Trong giai đoạn này, browsers chuyển đổi từng box ( đã được tính toán ở bước layout) thành các pixel trên màn hình. Mọi nodes sẽ để được chuyển đổi thành pixel tương ứng, bao gồm: text, colors, borders, shadows, và các phần tử khác như buttons, images. Và browsers cần thực hiện việc này một cách nhanh chóng.</p>
<p>Để đảm bảo scrolling và animation một cách mượt mà, mọi thứ sẽ được thực hiện ở luồng chính (main thread), bao gồm cả tính toán style, reflow và paint.</p>
<p>Ví dụ ở màn hình iPad 2048 X 1536, có hơn 3.145.000 pixel được vẽ trên màn hình. Để bước paint, reflow + paint diễn ra một cách nhanh chóng, các bản vẽ sẽ được chia thành nhiều lớp chồng chéo lên nhau ⇒ nếu điều này cần thiết phải thực hiện thì sẽ xuất hiện bước tiếp theo là compositing</p>
<p>Painting có thể chia nhỏ các nodes trong Render tree thành các lớp khác nhau. việc chia các lớp trên GPU (thay vì luồng chính trên CPU) sẽ giúp cải thiện hiệu suất của việc paint và re-paint. Nhưng điểm trừ của nó là sẽ tốn kém khi quản lý memory. Vì vậy chúng ta cần cân nhắn để sử dụng chúng một cách hiệu quả.</p>
<h3 id="heading-compositing">Compositing</h3>
<p>Khi các tài liệu được vẽ ở các layers khác nhau, chúng cần được tổng hợp lại để đảm bảo rằng có thể hiển thị đúng (theo đúng thứ tự + nội dung chính xác)</p>
<p>Khi trang tiếp tục load các nội dung khác (assets), reflows có thể xảy ra, và chúng sẽ tạo ra một quá trình re-paint và re-composite.</p>
<h3 id="heading-interactivity">Interactivity</h3>
<p>Main thread (luồng chính) có thể sẽ phải đợi để xử lý hoàn tất nếu trong trường hợp chúng ta load file JS (sau events <code>onload</code> )</p>
<p><strong>Time to Interactive (TTI)</strong> là thời gian tính từ request đầu tiên, tra cứu DNS và kết nối SSL đến thời điểm trang tương tác (interactive)</p>
<p>Interactive là thời điểm sau lần Painting toàn bộ nội dung đầu tiên - khi trang có responds tương tác của người dùng trong vòng 50ms. Nếu luồng chính bị chiếm dụng để parsing, compiling, và thực thi JavaScript, nó sẽ không khả dụng và do đó không thể đáp ứng các tương tác của người dùng trong thời gian này (dưới 50 mili giây).</p>
<p>Chúng ta cùng xét ví dụ dưới đây.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664873111507/G5CGRHCj_.png" alt="browsers-and-how-they-works7.png" /></p>
<p>Trong ví dụ này, quá trình load nội dung DOM mất hơn 1,5s và luồng chính bị chiếm hoàn toàn trong toàn bộ thời gian đó, không phản hồi với các sự kiện click chuột (hoặc chạm vào màn hình cảm ứng). Chúng ta có thể thấy hình ảnh được tải nhanh, nhưng do file <code>anotherscript.js</code> có dung lượng 2MB và kết nối mạng bị chậm, do đó người dùng có thể nhìn thấy trang cực nhanh, nhưng không thể thao tác mà không bị giật, lag cho đến khi file JS trên được tải xuống, parsing, và executing. Và đương nhiên, đó sẽ không phải là một trải nghiệm người dùng tốt.</p>
<h1 id="heading-tong-ket">Tổng kết</h1>
<p>Qua các phần trình bày bên trên, chúng ta đã nắm được cơ bản về Browsers, và cách chúng hoạt động. Tưởng chừng như đơn giản và hiển nhiên, nhưng việc chúng ta có thể truy cập website như ngày này, đã trải qua rất nhiều công đoạn để có thể giúp cho chúng ta có trải nghiệm <strong>mượt mà</strong></p>
<p>Hy vọng các kiến thức trên sẽ giúp ích cho các bạn ít nhiều.</p>
<p>Nhưng mọi khi, tuy đã rà soát lại, nhưng cũng sẽ không tránh khỏi việc có sai sót. Mong các bạn để lại góp ý, và cùng giúp nhau tiến bộ nhé.</p>
]]></content:encoded></item><item><title><![CDATA[[Basic knowledge][Internet] HTTP là gì?]]></title><description><![CDATA[HTTP Overview
HTTP là một giao thức để tìm nạp các tài nguyên như tài liệu HTML.
Nó là nền tảng của bất kỳ trao đổi dữ liệu nào trên Web và nó là một giao thức máy khách-máy chủ (client - server), có nghĩa là các yêu cầu được khởi tạo bởi người nhận,...]]></description><link>https://hoangpn.net/http-la-gi</link><guid isPermaLink="true">https://hoangpn.net/http-la-gi</guid><category><![CDATA[hoangpn]]></category><category><![CDATA[Technical writing ]]></category><category><![CDATA[http]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Share]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Mon, 03 Oct 2022 05:34:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/tZc3vjPCk-Q/upload/v1664774546986/8OLH53WYg.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-http-overview">HTTP Overview</h1>
<p>HTTP là một giao thức để tìm nạp các tài nguyên như tài liệu <strong>HTML</strong>.</p>
<p>Nó là nền tảng của bất kỳ trao đổi dữ liệu nào trên Web và nó là một giao thức máy khách-máy chủ (client - server), có nghĩa là các yêu cầu được khởi tạo bởi người nhận, thường là trình duyệt Web.</p>
<p>Một tài liệu hoàn chỉnh được tạo lại từ các tài liệu con khác nhau được tìm nạp, chẳng hạn như văn bản, mô tả bố cục, hình ảnh, video, tập lệnh và nhiều thành phần khác nữa</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664774787284/IUClo4sMZ.png" alt="what-is-http1.png" /></p>
<p>Client và server giao tiếp bằng cách trao đổi các thông điệp riêng lẻ (trái ngược với một luồng dữ liệu). Các thông điệp được gửi từ client (thường là một trình duyệt Web), được gọi là yêu cầu (<strong>request</strong>) và các thông báo được gửi bởi server dưới dạng câu trả lời được gọi là phản hồi (<strong>response</strong>).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664774799901/Cul0sCeI3.png" alt="what-is-http2.png" /></p>
<p>Được thiết kế vào đầu những năm 1990, HTTP là một giao thức có thể mở rộng đã phát triển theo thời gian. Nó là một giao thức ở tầng ứng dụng (application layer) được gửi qua TCP hoặc qua kết nối TCP được mã hóa bằng TLS. Mặc dù về mặt lý thuyết, bất kỳ giao thức truyền tải đáng tin cậy nào cũng có thể được sử dụng.</p>
<p>Do khả năng mở rộng của nó, nó được sử dụng để không chỉ tìm nạp các tài liệu siêu văn bản, mà còn cả hình ảnh và video hoặc để đăng nội dung lên servers, ví dụ như các kết quả của HTML form. HTTP cũng có thể được sử dụng để tìm nạp các phần của tài liệu nhằm cập nhật các trang Web theo yêu cầu.</p>
<h1 id="heading-components-of-http-based-systems">Components of HTTP-based systems</h1>
<p>HTTP là một giao thức <strong>client-server</strong>: các yêu cầu được gửi bởi một thực thể, <strong>user-agent</strong> (hoặc một proxy thay mặt cho nó). Hầu hết thời gian user-agent là một trình duyệt Web, nhưng nó có thể là bất cứ thứ gì, ví dụ, một robot thu thập thông tin trên Web để điền và duy trì chỉ mục của công cụ tìm kiếm (search engine index).</p>
<p>Mỗi request riêng lẻ được gửi đến một server, server sẽ xử lý nó và cung cấp một response. Giữa client và server có rất nhiều thực thể, được gọi chung là proxy, thực hiện các hoạt động khác nhau. Ví dụ như gateways, hoặc caches</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664774815110/UGwpW6hzM.png" alt="what-is-http3.png" /></p>
<p>Trong thực tế, có nhiều máy tính hơn giữa trình duyệt và server để xử lý request: có bộ định tuyến (routers), modem, v.v. Nhờ thiết kế phân lớp của Web, chúng được ẩn trong network và các tầng truyền tải (transport layers). HTTP ở trên cùng, ở tầng ứng dụng (application layers). Mặc dù quan trọng đối với việc chẩn đoán các sự cố mạng, nhưng các lớp bên dưới hầu như không liên quan đến thiết kế của HTTP.</p>
<h3 id="heading-client-the-user-agent">Client: the user-agent</h3>
<ul>
<li><strong><em>user-agent</em></strong> là bất kỳ công cụ nào hoạt động thay mặt cho người dùng. Vai trò này chủ yếu được thực hiện bởi trình duyệt Web, nhưng nó cũng có thể được thực hiện bởi các chương trình được các kỹ sư và nhà phát triển Web sử dụng để gỡ lỗi cho các ứng dụng của họ.</li>
<li>Trình duyệt <strong>luôn</strong> là thực thể khởi tạo request. Không bao giờ là server (mặc dù một số cơ chế đã được thêm vào trong nhiều năm để mô phỏng các thông báo do server khởi tạo).</li>
<li>Để hiển thị một trang Web, trình duyệt sẽ gửi một request ban đầu để tìm nạp tài liệu HTML đại diện cho trang đó. Sau đó, nó phân tích cú pháp tệp này, đưa ra các yêu cầu bổ sung tương ứng với các tập lệnh thực thi, thông tin bố cục (<strong>CSS</strong>) để hiển thị và các tài nguyên phụ có trong trang (thường là hình ảnh và video). Sau đó, trình duyệt Web kết hợp các tài nguyên này để trình bày tài liệu hoàn chỉnh, trang Web. Các tập lệnh do trình duyệt thực thi có thể lấy thêm tài nguyên trong các giai đoạn sau và trình duyệt Web sẽ cập nhật trang Web cho phù hợp.</li>
<li>Trang Web là một tài liệu siêu văn bản (<strong>hypertext document</strong>). Điều này có nghĩa là một số phần của nội dung được hiển thị là các liên kết, có thể được kích hoạt (thường bằng cách nhấp chuột) để tìm nạp một trang Web mới, cho phép người dùng điều hướng user-agent của họ và điều hướng qua Web. Trình duyệt chuyển các hướng dẫn này thành các HTTP requests và diễn giải thêm các HTTP responses để cung cấp cho người dùng một response rõ ràng.</li>
</ul>
<h3 id="heading-the-web-server">The Web server</h3>
<ul>
<li>Server phục vụ theo request của client. Một server hầu như chỉ xuất hiện dưới dạng một máy duy nhất; nhưng nó thực sự có thể là một tập hợp các servers chia sẻ tải (cân bằng tải - load balancing) hoặc một phần mềm phức tạp liên kết đến các máy tính khác (như bộ nhớ cache, database server, hoặc e-commerce servers), tạo toàn bộ hoặc một phần tài liệu theo yêu cầu.</li>
<li>Một Server không nhất thiết phải là một máy duy nhất, nhưng một số phiên bản phần mềm máy chủ có thể được lưu trữ trên cùng một máy. Với HTTP / 1.1 và Host header, chúng thậm chí có thể chia sẻ cùng một địa chỉ IP.</li>
</ul>
<h3 id="heading-proxies">Proxies</h3>
<p>Giữa trình duyệt Web và server, có nhiều máy tính tiếp các thông điệp HTTP. Do cấu trúc phân lớp của ngăn xếp Web, hầu hết chúng hoạt động ở tầng transport, tầng network hoặc tầng physical, và trở nên trong suốt ở tầng HTTP, có khả năng có tác động đáng kể đến hiệu suất (performance).</p>
<p>Những gì hoạt động ở các tầng ứng dụng (application layers) thường được gọi là proxy. Chúng có thể minh bạch, chuyển tiếp các request chúng nhận được mà không thay đổi chúng theo bất kỳ cách nào hoặc không minh bạch, trong trường hợp không minh bạch, chúng sẽ thay đổi request theo một cách nào đó trước khi chuyển nó đến server. Proxy có thể thực hiện nhiều chức năng:</p>
<ul>
<li>caching (bộ nhớ cache có thể công khai hoặc private, ví dụ như cache của trình duyệt)</li>
<li>filtering (như chống vi-rut, hoặc các kiểm soát của phụ huynh)</li>
<li>load balancing (cho phép nhiều máy chủ thực hiện các request khác nhau)</li>
<li>authentication (kiểm soát quyền truy cập đến các tài nguyên khác nhau ở server)</li>
<li>logging (cho phép lưu trữ thông tin lịch sử truy cập)</li>
</ul>
<h1 id="heading-basic-aspects-of-http">Basic aspects of HTTP</h1>
<ol>
<li>HTTP rất đơn giản: Việc đơn giản đến từ thiết kế của HTTP (thậm chí cả HTTP/2, HTTP/3), rất dễ dàng tiếp cận cho các lập trình viên mới, hoặc thậm chí là bất kỳ ai</li>
<li>HTTP dễ dàng mở rộng: HTTP headers giúp cho giao thức HTTP dễ dàng được mở rộng, hiện nay đã có các phiên bản HTTP/2, HTTP/3, .v.v..</li>
<li>HTTP là stateless, nhưng không phải sessionless<ol>
<li>stateless: không có kết nối giữa 2 request được thực hiện liên tiếp trên cùng một connection.</li>
<li>không phải sessionless: bản thân HTTP cookies cho phép sử dụng các phiên trạng thái để giúp các HTTPS request chia sẻ cùng một ngữ cảnh, một trạng thái (ví dụ cùng một user đang thao tác)</li>
</ol>
</li>
<li>HTTP và các kết nối:  ⇒ bổ sung</li>
</ol>
<h1 id="heading-what-can-be-controlled-by-http">What can be controlled by HTTP</h1>
<p>Do tính chất có thể mở rộng của HTTP, nên theo thời gian, HTTP được phép kiểm soát nhiều hơn và chức năng của Web được mở rộng. Cache và authentication là các chức năng được xử lý sớm trong lịch sử HTTP. Chúng ta cùng đi qua một vài thứ mà HTTP có thể kiểm soát:</p>
<ul>
<li><strong>Caching</strong>: Cách HTTP lưu trữ response của server tại client, và tái sử dụng cho các request tiếp theo (nếu có thể). Trong thực tế, ngoài HTTP cache (client cache) còn có rất nhiều cách caching khác nhau (tôi sẽ không trình bày thêm ở đây, để tránh đi quá xa khỏi nội dung của chủ đề)</li>
<li>Giảm bớt <strong>origin constraint</strong>: Để ngăn chặn việc theo dõi và các hành vi xâm phạm quyền riêng tư, các trình duyệt Web thực thi sự tách biệt nghiêm ngặt giữa các trang web với nhau. Chỉ các trang từ cùng một nguồn gốc mới có thể truy cập tất cả thông tin của trang web đó (có thể hiểu là cùng <strong>đường dẫn, cùng port</strong>). HTTP header có thể giảm bớt sự phân tách nghiêm ngặt này ở phía server, cho phép một tài liệu trở thành một tập hợp thông tin có nguồn gốc từ các tên miền khác nhau.</li>
<li><strong>Authentication</strong>: Một số trang có thể được bảo vệ để chỉ những người dùng cụ thể mới có thể truy cập chúng. Xác thực cơ bản (basic authentication) có thể được cung cấp bởi HTTP, sử dụng <strong>WWW-Authenticate</strong> và các headers tương tự hoặc bằng cách thiết lập một phiên cụ thể bằng cách sử dụng cookie HTTP.</li>
<li>Proxy và tunneling: Client hoặc Server thường được đặt trên mạng nội bộ và ẩn địa chỉ IP thực của chúng với các máy tính khác. Các HTTP request sau đó đi qua proxy để đến được server (và ngược lại). Không phải tất cả proxy đều là HTTP proxy. Ví dụ, giao thức <strong>SOCKS</strong> hoạt động ở cấp độ thấp hơn. Các giao thức khác như ftp, có thể được xử lý bởi các HTTP proxy.</li>
<li>Sessions: Sử dụng HTTP cookie cho phép bạn liên kết các requests với trạng thái của server. Điều này tạo ra các phiên (sessions), mặc dù HTTP cơ bản là một giao thức <strong>state-less</strong>.</li>
</ul>
<h1 id="heading-http-flow">HTTP flow</h1>
<p>Khi client giao tiếp với server, hoặc ngay cả với một proxy trung gian, nhìn chung nó sẽ thực hiện các bước sau:</p>
<ol>
<li><strong>Mở kết nối TCP</strong>: Kết nối TCP được sử dụng để gửi một hoặc nhiều request và nhận lại response. Client có thể mở một kết nối mới, sử dụng lại kết nối hiện có, hoặc mở một số kết nối TCP tới các servers khác.</li>
<li><p><strong>Gửi HTTP message</strong>: Các HTTP messages (trước HTTP/2) chưa được đóng gói, nghĩa là chúng ta có thể nhìn thấy và đọc được các messages này. Từ HTTP/2 trở đi, các tin nhắn được đóng gói trong các khung (frames) ⇒ khiến cho chúng ta không thể đọc trực tiếp, nhưng các nguyên tắc gửi và nhận thì vẫn như cũ.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664774892760/R47IEjm0L.png" alt="what-is-http4.png" /></p>
</li>
<li><p><strong>Nhận và đọc response</strong> từ server
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664774901661/vwdZo684i.png" alt="what-is-http5.png" /></p>
</li>
<li><strong>Đóng, hoặc sử dụng lại</strong> các connection cho các request khác.</li>
</ol>
<h1 id="heading-http-messages">HTTP messages</h1>
<p>HTTP messages, từ phiên bản HTTP/1.1 trở về trước chưa được đóng gói, và chúng ta có thể đọc được một cách dễ dàng</p>
<p>Từ HTTP/2 trở lên, những thông điệp này được nhúng vào một cấu trúc nhị phân (binary structure), một khung (frame), cho phép tối ưu hóa như nén header và multiplexing. Ngay cả khi chỉ một phần của thông báo HTTP ban đầu được gửi trong phiên bản HTTP này, ngữ nghĩa của mỗi thông báo là không thay đổi và server sẽ dịch lại (gần như toàn bộ) sang định dạng của HTTP/1.1. </p>
<p>Có 2 loại HTTP messages: requests và responses. mỗi loại sẽ có từng định dạng khác nhau.</p>
<h2 id="heading-http-request">HTTP request</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664774915881/VnE0zK_hA.png" alt="what-is-http6.png" /></p>
<p>Request bao gồm các thành phần sau</p>
<ol>
<li>HTTP methods, thường là một động từ như GET, POST hoặc một danh từ như OPTIONS hoặc HEAD xác định hoạt động mà ứng dụng client muốn thực hiện. Thông thường, client đơn giản muốn lấy thông tin trang web (sử dụng GET), hoặc gửi biểu mẫu thông tin (form) lên server (sử dụng POST). Trong thực tế, bên cạnh POST và GET sẽ có các phương thức khác nữa như PUT/PATCH (chúng ta sẽ tìm hiểu sau)</li>
<li>Đường dẫn của tài nguyên để truy cập tới server. Một đường dẫn sẽ bao gồm các thông tin như protocol (http, https), hay TCP port (như 80, hoặc 443), nhưng chúng thường sẽ được lược bỏ (sử dụng default) ví dụ như: <strong><a target="_blank" href="https://hoangpn.com">hoangpn.com</a></strong></li>
<li>Phiên bản HTTP đang sử dụng (ở hình là HTTP/1.1).</li>
<li>Phần mở rộng Headers: để truyền tải thông tin cho server, giúp lấy thông tin chính xác để hoàn thiện trang web</li>
<li>Body, đối với một số phương thức như POST, bao gồm các tài nguyên được gửi đi</li>
</ol>
<h2 id="heading-http-response">HTTP response</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664774925244/ndsrKi82f.png" alt="what-is-http7.png" /></p>
<p>Response thường bao gồm các thành phần sau</p>
<ol>
<li>Phiên bản HTTP đang sử dụng (ở hình là HTTP/1.1).</li>
<li>Status code: chỉ ra request có thành công hay không?</li>
<li>Status message: thông báo mô tả ngắn gọn về trạng thái của request</li>
<li>HTTP headers (giống như request)</li>
<li>Tuỳ chọn khác: ví dụ như body trả về (chứa thông tin và client mong muốn nhận được từ server)</li>
</ol>
<h1 id="heading-basic-http3-vs-http2-vs-http11-comparison">Basic HTTP/3 vs HTTP/2 vs HTTP/1.1 comparison</h1>
<p>Hiện tại đang có 3 version chính của HTTP đó là</p>
<ol>
<li>HTTP/1.1</li>
<li>HTTP/2</li>
<li>HTTP/3</li>
</ol>
<p>Tôi sẽ không đi quá sâu vào phần này, đồng thời giải thích chi tiết các khái niệm, liên quan. Nhưng sẽ có một vài lưu ý như sau</p>
<ul>
<li>HTTP/2 đã cải tiến được việc thông tin được truyền đi sẽ biến đổi thành các binary, đóng gói thông tin (HPACK, server push). Một phần nào đó giúp cải tiến tốc độ truy cập, và tính bảo mật của thông tin</li>
<li>Sang đến HTTP/3, chúng ta đã thay thế TCP thành UDP + QUIC, thay thế HPACK thành QPACK, giúp cho tốc độ truyền tải nhanh hơn cũ rất nhiều lần.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664774685662/_oUktnBIh.png" alt="what-is-http.png" /></p>
<h1 id="heading-tong-ket">Tổng kết</h1>
<p>Qua các phần trình bày bên trên, chúng ta đã nắm được cơ bản về HTTP, và một vài khái niệm, kiến thức đằng sau nó. Hy vọng các kiến thức trên sẽ giúp ích cho các bạn ít nhiều.</p>
<p>Nhưng mọi khi, tuy đã rà soát lại, nhưng cũng sẽ không tránh khỏi việc có sai sót. Mong các bạn để lại góp ý, và cùng giúp nhau tiến bộ nhé.</p>
]]></content:encoded></item><item><title><![CDATA[[Basic knowledge][Internet] Internet hoạt động như thế nào?]]></title><description><![CDATA[Trong bài viết này chúng ta cùng tìm hiểu xem thực hư mấy bọn máy tính làm thế nào để "nói chuyện" với nhau qua internet.
What is IP - the Internet Addresses

Chúng ta có thể hiểu, IP như là địa chỉ "nhà" của chúng ta vậy, để đến được nhà ai đó, thì ...]]></description><link>https://hoangpn.net/internet-hoat-dong-nhu-the-nao</link><guid isPermaLink="true">https://hoangpn.net/internet-hoat-dong-nhu-the-nao</guid><category><![CDATA[hoangpn]]></category><category><![CDATA[internet]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[Technical writing ]]></category><category><![CDATA[technology]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Wed, 28 Sep 2022 05:15:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/NqOInJ-ttqM/upload/v1664341159371/wgPH-FyRR.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Trong bài viết này chúng ta cùng tìm hiểu xem thực hư mấy bọn máy tính làm thế nào để "<strong>nói chuyện</strong>" với nhau qua internet.</p>
<h1 id="heading-what-is-ip-the-internet-addresses">What is IP - the Internet Addresses</h1>
<ul>
<li>Chúng ta có thể hiểu, IP như là địa chỉ "nhà" của chúng ta vậy, để đến được nhà ai đó, thì chúng ta cần biết địa chỉ của họ, tương tự như vậy, để có thể "nói chuyện" với một máy tính nào đó, chúng ta cần biết địa chỉ IP của máy tính đó</li>
<li>Vì Internet là một mạng toàn cầu gồm các máy tính nên mỗi máy tính được kết nối với Internet phải có <strong>một địa chỉ duy nhất</strong></li>
<li>Địa chỉ này có dạng <strong>xxx.xxx.xxx.xxx</strong> trong đó <strong>xxx</strong> phải là một số từ <strong>0 - 255</strong>. Địa chỉ này được gọi là địa chỉ IP</li>
<li>IP = Internet Protocol</li>
</ul>
<p>Hình bên dưới minh họa hai máy tính được kết nối Internet; máy tính của bạn có địa chỉ IP <strong>1.2.3.4</strong> và một máy tính khác có địa chỉ IP <strong>5.6.7.8</strong>. Internet được biểu diễn như một đối tượng trừu tượng ở giữa.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664341538063/fVklu5brf.png" alt="how-internet-work-1.png" /></p>
<p>Nếu bạn kết nối với Internet thông qua Nhà cung cấp dịch vụ Internet (<strong>ISP</strong>), ví dụ như Vietel, FPT, …, bạn thường được chỉ định một địa chỉ <strong>IP tạm thời trong suốt phiên</strong> truy cập của mình. Nếu bạn kết nối Internet từ mạng cục bộ (<strong>LAN</strong>), máy tính của bạn có thể có <strong>địa chỉ IP cố định</strong> hoặc <strong>có thể lấy địa chỉ IP tạm thời</strong> từ máy chủ <strong>DHCP (Giao thức cấu hình máy chủ động)</strong>. Trong mọi trường hợp, nếu bạn được kết nối với Internet, máy tính của bạn có <strong>một địa chỉ IP duy nhất</strong>.</p>
<h1 id="heading-protocol-stacks-and-packets-ngan-xep-giao-thuc-va-goi"><strong>Protocol Stacks and Packets - Ngăn xếp giao thức và gói</strong></h1>
<p>Làm thế nào để nó '<strong>nói chuyện</strong>' với các máy tính khác được kết nối Internet?</p>
<p>Chúng ta cùng đi vào ví dụ cụ thể: </p>
<ul>
<li>Giả sử địa chỉ IP của bạn là 1.2.3.4 và bạn muốn gửi tin nhắn đến máy tính 5.6.7.8.
Thông báo bạn muốn gửi là "Xin chào máy tính 5.6.7.8!".</li>
<li>Rõ ràng, thông điệp phải được truyền qua bất kỳ loại dây nào kết nối máy tính của bạn với Internet.</li>
<li>Giả sử bạn đã gọi đến <strong>ISP</strong> của mình từ nhà và tin nhắn phải được truyền qua đường dây điện thoại.</li>
<li>Do đó, thông điệp phải được <strong>dịch từ văn bản chữ cái thành tín hiệu điện tử,</strong> truyền qua Internet, sau đó <strong>dịch ngược lại thành văn bản chữ cái</strong>.</li>
<li>Làm thế nào điều này được hoàn thành? Thông qua việc sử dụng một ngăn xếp giao thức (<strong>protocol stack</strong>). Mỗi máy tính cần một giao thức để giao tiếp trên Internet và nó thường được tích hợp sẵn trong <strong>hệ điều hành</strong> của máy tính (tức là Windows, Unix, v.v.).
Ngăn xếp giao thức (<strong>protocol stack)</strong> được sử dụng trên Internet được gọi là ngăn xếp giao thức <strong>TCP / IP</strong> vì hai giao thức truyền thông chính được sử dụng.</li>
<li>Giao thức TCP/IP được miêu tả như sau</li>
</ul>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Protocol Layer</td><td>Comments</td></tr>
</thead>
<tbody>
<tr>
<td>Application Protocols Layer</td><td>Protocols specific to applications such as WWW, e-mail, FTP, etc.  - Các giao thức dành riêng cho các ứng dụng như WWW, e-mail, FTP, v.v.</td></tr>
<tr>
<td>Transmission Control Protocol Layer</td><td>TCP directs packets to a specific application on a computer using a port number. - TCP chuyển hướng các gói tin đến một ứng dụng cụ thể trên máy tính bằng cách sử dụng số cổng (port number).</td></tr>
<tr>
<td>Internet Protocol Layer</td><td>IP directs packets to a specific computer using an IP address. - IP chuyển hướng các gói đến một máy tính cụ thể bằng địa chỉ IP.</td></tr>
<tr>
<td>Hardware Layer</td><td>Converts binary packet data to network signals and back.(E.g. ethernet network card, modem for phone lines, etc.) - Chuyển đổi dữ liệu gói nhị phân thành tín hiệu mạng và ngược lại.</td></tr>
</tbody>
</table>
</div><ul>
<li>Như vậy thông báo "Xin chào máy tính 5.6.7.8!" lấy từ máy tính của chúng ta đến máy tính có địa chỉ IP 5.6.7.8, nó sẽ xảy ra một như sau:</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664341702964/_RiQQ6CqI.png" alt="how-internet-work-2.png" /></p>
<ol>
<li>Thông báo sẽ bắt đầu ở đầu ngăn xếp giao thức trên máy tính của bạn và hoạt động theo chiều hướng xuống dưới.</li>
<li>Nếu tin nhắn được gửi dài, mỗi lớp ngăn xếp mà tin nhắn đi qua có thể chia tin nhắn thành những phần dữ liệu nhỏ hơn. Điều này là do dữ liệu được gửi qua Internet (và hầu hết các mạng máy tính) được gửi theo các phần có thể quản lý được. Trên Internet, những phần dữ liệu này được gọi là <strong>packets</strong>.</li>
<li>Các <strong>packets</strong> sẽ đi qua Application Layer và tiếp tục đến TCP layer. Mỗi <strong>packets</strong> được gán một <strong>port number</strong>. Các <strong>ports</strong> sẽ được giải thích sau, nhưng đủ để nói rằng nhiều chương trình có thể đang sử dụng TCP/IP stack và gửi thông báo. Chúng ta cần biết chương trình nào trên máy tính đích cần nhận thông báo,  vì nó sẽ <strong>lắng nghe</strong> trên một <strong>port (cổng) cụ thể</strong>.</li>
<li>Sau khi đi qua TCP layer, các packets tiến tới IP layer. Đây là nơi mỗi packet nhận được địa chỉ đích của nó, 5.6.7.8.</li>
<li>Bây giờ các packets (gói tin nhắn) của chúng ta đã có số cổng và địa chỉ IP, chúng đã sẵn sàng để gửi qua Internet. Hardware layer đảm nhận việc chuyển các gói tin chứa văn bản chữ trong tin nhắn của chúng ta thành các tín hiệu điện tử và truyền chúng qua đường dây mạng.</li>
<li>Ở đầu bên kia của đường dây mạng ISP của bạn có kết nối trực tiếp với Internet. ISPs <strong>router (bộ định tuyến)</strong> kiểm tra địa chỉ đích trong mỗi gói và xác định nơi gửi nó. Thông thường, điểm dừng tiếp theo của gói tin là một bộ định tuyến khác. (Chúng ta sẽ nói về router ở phần sau)</li>
<li>Cuối cùng, các gói tin đến được máy tính có địa chỉ IP là 5.6.7.8. Tại đây, các gói bắt đầu ở cuối TCP/IP stack của máy tính đích và đi lên.</li>
<li>Khi các gói tin đi lên trên qua ngăn xếp, tất cả dữ liệu định tuyến mà ngăn xếp của máy tính gửi được thêm vào (chẳng hạn như địa chỉ IP và port number) sẽ bị loại bỏ khỏi các gói.</li>
<li>Khi dữ liệu lên đến đỉnh của ngăn xếp, các gói tin đã được tập hợp lại thành dạng ban đầu, "Xin chào máy tính 5.6.7.8!”</li>
</ol>
<h1 id="heading-networking-infrastructure-co-so-ha-tang-mang"><strong>Networking Infrastructure - Cơ sở hạ tầng mạng</strong></h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664341795319/FvZCxie3Z.png" alt="how-internet-work-3.png" />
Sơ đồ bên trên là chi tiết của sở đồ ban đầu, chúng ta đã thấy từng thành phần rõ ràng hơn. Dưới đây là một số giải thích chi tiết hơn cho sơ đồ trên</p>
<ul>
<li>ISP duy trì các <strong>modems</strong> cho khách hàng trong quá trình kết nối của họ. Điều này được quản lý bởi một số dạng máy tính (thường là máy tính chuyên dụng) điều khiển luồng dữ liệu từ modem pool đến đường trục (backbone) hoặc bộ định tuyến (router) đường truyền chuyên dụng. Thiết lập này có thể được coi là một <strong>port máy chủ</strong>, vì nó <strong>phục vụ</strong> quyền truy cập vào mạng. Thông tin thanh toán và sử dụng cũng thường được thu thập ở đây.</li>
<li>Sau khi các gói của bạn truyền qua mạng và thiết bị cục bộ của ISP, chúng được chuyển đến đường trục (backbone) của ISP hoặc đường trục mà ISP mua băng thông. Từ đây, các gói thường sẽ di chuyển qua một số bộ định tuyến và qua một số đường trục, đường dây chuyên dụng và các mạng khác cho đến khi chúng tìm thấy đích của chúng, máy tính có địa chỉ 5.6.7.8. Và trong thực tế có nhiều cách để có thể kiểm tra đường di chuyển của các gói tin qua các ứng dụng đặc thù.</li>
</ul>
<h1 id="heading-internet-infrastructure-co-so-ha-tang-cua-internet"><strong>Internet Infrastructure - Cơ sở hạ tầng của Internet</strong></h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664341924693/Y4v3LKF9N.png" alt="how-internet-work-4.png" /></p>
<ul>
<li>Đường trục Internet được tạo thành từ nhiều mạng lớn kết nối với nhau.</li>
<li>Các mạng lớn này được gọi là Nhà cung cấp dịch vụ mạng - <strong>Network Service Providers (NSP)</strong>. Một số NSP lớn là UUNet, CerfNet, IBM, BBN Planet, SprintNet, PSINet, cũng như các NSP khác.</li>
<li>Các mạng này ngang hàng với nhau để trao đổi lưu lượng packet. Mỗi NSP được yêu cầu kết nối với ba Điểm truy cập mạng - <strong>Network Access Points(NAP).</strong> Tại các NAP, lưu lượng gói có thể nhảy từ đường trục của NSP này sang đường trục của NSP khác. Các NSP cũng kết nối với nhau tại các <strong>Metropolitan Area Exchanges (MAEs)</strong>.</li>
<li>MAE phục vụ cùng mục đích như NAP nhưng thuộc sở hữu tư nhân. NAP là điểm kết nối Internet ban đầu. Cả NAP và MAE đều được gọi là Điểm trao đổi Internet hoặc <strong>IXs</strong>. NSP cũng bán băng thông cho các mạng nhỏ hơn, chẳng hạn như ISP và các nhà cung cấp băng thông nhỏ hơn</li>
</ul>
<p>Sơ đồ bên trên không phải là sự trình bày thực sự của một phần thực tế của Internet. Sơ đồ trên chỉ nhằm chứng minh cách các <strong>NSP có thể kết nối với nhau và các ISP</strong> nhỏ hơn.</p>
<p>Không có thành phần mạng vật lý nào được thể hiện trong sơ đồ trên. Điều này là do cơ sở hạ tầng đường trục (backbone) của một NSP đơn lẻ là một bản vẽ phức tạp. Hầu hết các NSP xuất bản bản đồ về cơ sở hạ tầng mạng của họ trên các trang web của họ và có thể được tìm thấy dễ dàng. Để vẽ một bản đồ thực tế của Internet gần như không thể do kích thước, độ phức tạp và cấu trúc luôn thay đổi của nó.</p>
<h1 id="heading-the-internet-routing-hierarchy-he-thong-phan-cap-dinh-tuyen-internet"><strong>The Internet Routing Hierarchy - Hệ thống phân cấp định tuyến internet</strong></h1>
<p>Vậy làm thế nào để các gói tin tìm đường qua Internet? Mỗi máy tính kết nối Internet có biết các máy tính khác đang ở đâu không? Các gói tin có đơn giản được <strong>'phát sóng' (broadcast)</strong> tới mọi máy tính trên Internet không? Câu trả lời cho cả hai câu hỏi trước là <strong>'không'.</strong> Không máy tính nào biết bất kỳ máy tính nào khác đang ở đâu và các gói tin không được gửi đến mọi máy tính. Thông tin được sử dụng để đưa các gói đến đích của chúng được chứa trong các bảng định tuyến được giữ bởi mỗi bộ định tuyến kết nối với Internet.</p>
<p><strong>Routers are packet switches -</strong> Bộ định tuyến là bộ chuyển mạch gói. Một bộ định tuyến thường được kết nối giữa các mạng để định tuyến các packets giữa chúng. Mỗi bộ định tuyến biết về các mạng con của nó và địa chỉ IP nào chúng sử dụng. Bộ định tuyến thường không biết địa chỉ IP nào nằm trên nó.</p>
<p>Nhìn hình bên dưới, chúng ta có thể thấy các hộp đen kết nối các đường trục (backbone) là các bộ định tuyến. Các đường trục (backbone) NSP lớn hơn ở trên cùng được kết nối với một NAP. Dưới chúng là một số mạng con và bên dưới chúng là nhiều mạng con hơn. Ở dưới cùng là hai mạng cục bộ có gắn máy tính.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664341841877/dYCPUPJso.png" alt="how-internet-work-5.png" /></p>
<p>Khi một gói tin đến một bộ định tuyến, bộ định tuyến sẽ kiểm tra địa chỉ IP được đặt ở đó bởi IP protocol layer trên máy tính gốc.</p>
<p>Bộ định tuyến sẽ kiểm tra bảng định tuyến của nó. Nếu mạng chứa địa chỉ IP được tìm thấy, gói tin sẽ được gửi đến mạng đó. Nếu mạng chứa địa chỉ IP không được tìm thấy, thì bộ định tuyến sẽ gửi gói tin trên một tuyến đường mặc định, thường là theo hệ thống phân cấp đường trục (backbone) đến bộ định tuyến tiếp theo.</p>
<p>Hy vọng rằng bộ định tuyến tiếp theo sẽ biết nơi để gửi gói tin. Nếu không, gói tin lại được chuyển hướng lên trên cho đến khi nó đến đường trục (backbone) NSP. Các bộ định tuyến được kết nối với đường trục (backbone) NSP giữ các bảng định tuyến lớn nhất và tại đây gói tin sẽ được chuyển đến đường trục (backbone) chính xác, nơi nó sẽ bắt đầu hành trình <strong>'đi xuống'</strong> qua các mạng nhỏ hơn và nhỏ hơn cho đến khi nó tìm thấy điểm đến.</p>
<h1 id="heading-domain-names-and-address-resolution-ten-mien-va-cach-phan-giai-dia-chi"><strong>Domain Names and Address Resolution - Tên miền và cách phân giải địa chỉ</strong></h1>
<p>Nhưng điều gì sẽ xảy ra nếu bạn không biết địa chỉ IP của máy tính bạn muốn kết nối? Điều gì xảy ra nếu bạn cần truy cập vào một máy chủ web được gọi là <a target="_blank" href="https://hoangpn.com/">https://hoangpn.com/</a> Làm thế nào để trình duyệt web của bạn biết máy tính này <strong>sống</strong> ở đâu trên Internet? Câu trả lời cho tất cả những câu hỏi này là <strong>Domain Name Service - DNS</strong>. <strong>DNS là một cơ sở dữ liệu phân tán theo dõi tên máy tính và địa chỉ IP tương ứng của chúng trên Internet</strong></p>
<p>Nhiều máy tính được kết nối với Internet lưu trữ một phần cơ sở dữ liệu của DNS và phần mềm cho phép người khác truy cập nó. Những máy tính này được gọi là <strong>máy chủ DNS</strong>. Không có máy chủ DNS nào chứa toàn bộ cơ sở dữ liệu; chúng chỉ chứa một tập hợp con của nó. Nếu máy chủ DNS không chứa tên miền được yêu cầu bởi máy tính khác, máy chủ DNS sẽ <strong>chuyển hướng</strong> máy tính yêu cầu đến máy chủ DNS khác.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664341868879/ITSd4VgMe.png" alt="how-internet-work-6.png" /></p>
<p>Dịch vụ tên miền được cấu trúc dưới dạng phân cấp tương tự như phân cấp định tuyến IP. Máy tính yêu cầu phân giải tên sẽ được chuyển hướng <strong>'lên'</strong> hệ thống phân cấp cho đến khi tìm thấy máy chủ DNS có thể phân giải tên miền trong yêu cầu.</p>
<p>Ở hình trên, minh họa một phần của hệ thống phân cấp. Ở ngọn cây là các <strong>domain roots</strong>. Một số tên miền cũ hơn, phổ biến hơn được nhìn thấy ở gần đầu. Ngoài ra con có vô số máy chủ DNS trên khắp thế giới tạo thành phần còn lại của hệ thống phân cấp - những tên miền khác ví dụ như <strong>xyz, dev</strong>, ….</p>
<p>Khi kết nối Internet được thiết lập (ví dụ: đối với mạng LAN hoặc Mạng Dial-Up trong Windows), một máy chủ DNS chính và một (hoặc nhiều) máy chủ DNS phụ thường được chỉ định như một phần của quá trình cài đặt.</p>
<p>Bằng cách này, bất kỳ ứng dụng Internet nào cần phân giải tên miền sẽ có thể hoạt động chính xác. Ví dụ: khi bạn nhập địa chỉ web vào trình duyệt web của mình, trước tiên trình duyệt sẽ kết nối với máy chủ DNS chính của bạn. Sau khi có được địa chỉ IP cho tên miền bạn đã nhập, trình duyệt sẽ kết nối với máy tính mục tiêu và yêu cầu trang web bạn muốn.</p>
<h1 id="heading-application-protocols-http-and-the-world-wide-web"><strong>Application Protocols: HTTP and the World Wide Web</strong></h1>
<ul>
<li>Một trong những dịch vụ được sử dụng phổ biến nhất trên Internet là <strong>World Wide Web (WWW)</strong>.</li>
<li>Giao thức ứng dụng làm cho web hoạt động là Giao thức truyền siêu văn bản - <strong>Hypertext Transfer Protocol(HTTP)</strong>.</li>
<li>Đừng nhầm lẫn điều này với Ngôn ngữ đánh dấu siêu văn bản (HTML). HTML là ngôn ngữ được sử dụng để viết các trang web. HTTP là giao thức mà trình duyệt web và máy chủ web sử dụng để giao tiếp với nhau qua Internet.</li>
<li>Nó là một giao thức ở tầng ứng dụng vì nó nằm trên TCP layer trong ngăn xếp giao thức và được sử dụng bởi các ứng dụng cụ thể để giao tiếp với nhau. Trong trường hợp này, các ứng dụng là trình duyệt web và máy chủ web (web browsers and web servers)</li>
<li>HTTP là <strong>một giao thức dựa trên văn bản không kết nối (connectionless).</strong> Máy khách (trình duyệt web) gửi yêu cầu đến máy chủ web cho các phần tử web như trang web và hình ảnh. Sau khi yêu cầu được phục vụ bởi máy chủ, kết nối giữa máy khách và máy chủ trên Internet sẽ bị ngắt kết nối. Một kết nối mới phải được thực hiện cho mỗi yêu cầu. Hầu hết các giao thức được định hướng kết nối. Điều này có nghĩa là hai máy tính giao tiếp với nhau giữ cho kết nối mở qua Internet. <strong>HTTP thì không</strong>.</li>
</ul>
<p>Khi bạn truy cập một URL trên trình duyệt web: </p>
<ol>
<li>Nếu URL chứa tên miền, trước tiên trình duyệt kết nối với <strong>DNS</strong> và truy xuất địa chỉ IP tương ứng cho máy chủ web.</li>
<li>Trình duyệt web kết nối với máy chủ web và gửi một request HTTP (thông qua ngăn xếp giao thức) cho trang web mong muốn.</li>
<li>Máy chủ web nhận yêu cầu và kiểm tra trang web muốn truy cập. Nếu trang tồn tại, máy chủ web sẽ trả về tương ứng dữ liệu. Nếu máy chủ không thể tìm thấy trang được yêu cầu, nó sẽ gửi thông báo lỗi HTTP 404. (404 có nghĩa là 'Không tìm thấy trang' như bất kỳ ai đã lướt web có thể biết.)</li>
<li>Trình duyệt web hiển thị trang web tương ứng, và kết nối bị đóng.</li>
<li>Sau đó, trình duyệt web phân tích cú pháp qua trang web và tìm kiếm các phần tử trang web khác mà nó cần để hoàn thành. Chúng thường bao gồm hình ảnh, text, v.v.</li>
<li>Đối với mỗi phần tử cần thiết, trình duyệt tạo kết nối bổ sung và các request HTTP đến máy chủ cho mỗi phần tử.</li>
<li>Khi trình duyệt tải xong tất cả hình ảnh, text, v.v., trang web sẽ được hiển thị hoàn toàn trong cửa sổ trình duyệt.</li>
</ol>
<p>Hầu hết các giao thức Internet được chỉ định bởi các tài liệu Internet được gọi là Yêu cầu Nhận xét - <strong>Request For Comments (RFC)</strong>. RFC có thể được tìm thấy ở một số địa điểm trên Internet. </p>
<p>HTTP version 1.0 được chỉ định bởi RFC 1945.</p>
<h1 id="heading-application-protocols-smtp-and-electronic-mail"><strong>Application Protocols: SMTP and Electronic Mail</strong></h1>
<p>Một dịch vụ Internet thường được sử dụng khác là thư điện tử. Thư điện tử sử dụng một giao thức cấp ứng dụng được gọi là Giao thức truyền thư đơn giản  - <strong>Simple Mail Transfer Protocol (SMTP). SMTP</strong> cũng là một giao thức dựa trên văn bản, nhưng không giống như <strong>HTTP</strong>, SMTP là định hướng kết nối. SMTP cũng phức tạp hơn HTTP. Có nhiều lệnh và quy tắc trong SMTP hơn trong HTTP.</p>
<p>Khi bạn mở ứng dụng email khách (mail client) để đọc e-mail, đây là điều thường xảy ra:</p>
<ol>
<li>Ứng dụng email khách (Netscape Mail, Lotus Notes, Microsoft Outlook, v.v.) mở một kết nối với mail server mặc định của nó. Địa chỉ IP hoặc tên miền của mail server thường được thiết lập khi ứng dụng email khách được cài đặt.</li>
<li>Mail server sẽ luôn truyền thông điệp đầu tiên để nhận dạng chính nó.</li>
<li>Máy khách sẽ gửi một lệnh <strong>SMTP</strong> HELO mà máy chủ sẽ trả lời bằng một thông báo <strong>250 OK</strong>.</li>
<li>Tùy thuộc vào việc máy khách đang kiểm tra mail, gửi mail,… mà các lệnh SMTP thích hợp sẽ được gửi đến máy chủ, các lệnh này sẽ được phản hồi tương ứng.</li>
<li>Các request/response này sẽ tiếp tục cho đến khi khách hàng gửi lệnh SMTP QUIT. Sau đó kết nối sẽ bị đóng.</li>
</ol>
<p>Chúng ta cùng tìm hiểu một ví dụ sau để hiểu rõ hơn: Một <strong>cuộc trò chuyện</strong> đơn giản giữa máy khách SMTP và máy chủ SMTP được hiển thị bên dưới. R: biểu thị các thông điệp được gửi bởi máy chủ (người nhận). S: biểu thị các thông điệp được gửi bởi máy khách (người gửi).</p>
<pre><code>Ví dụ về SMTP này hiển thị thư <span class="hljs-keyword">do</span> Smith gửi tại máy chủ USC-ISIF, tới
Jones, Green và Brown tại máy chủ BBN-UNIX. Ở đây chúng tôi giả định rằng
máy chủ USC-ISIF trực tiếp lưu trữ BBN-UNIX. Green - không có hộp thư tại máy chủ BBN-UNIX.
-------------------------------------------------------------

R: <span class="hljs-number">220</span> BBN-UNIX.ARPA Simple Mail Transfer Service Ready
<span class="hljs-attr">S</span>: HELO USC-ISIF.ARPA
<span class="hljs-attr">R</span>: <span class="hljs-number">250</span> BBN-UNIX.ARPA

<span class="hljs-attr">S</span>: MAIL FROM:&lt;Smith@USC-ISIF.ARPA&gt;
R: 250 OK

S: RCPT TO:&lt;Jones@BBN-UNIX.ARPA&gt;
R: 250 OK

S: RCPT TO:&lt;Green@BBN-UNIX.ARPA&gt;
R: 550 No such user here

S: RCPT TO:&lt;Brown@BBN-UNIX.ARPA&gt;
R: 250 OK

S: DATA
R: 354 Start mail input; end with &lt;CRLF&gt;.&lt;CRLF&gt;
S: Blah blah blah...
S: ...etc. etc. etc.
S: .
R: 250 OK

S: QUIT
R: 221 BBN-UNIX.ARPA Service closing transmission channel
</code></pre><p>SMTP được chỉ định bởi RFC 821</p>
<h1 id="heading-transmission-control-protocol-giao-thuc-dieu-khien-truyen-dan"><strong>Transmission Control Protocol - Giao thức điều khiển truyền dẫn</strong></h1>
<ul>
<li>Dưới Application Layer trong ngăn xếp giao thức là TCP layer.</li>
<li>Khi các ứng dụng mở kết nối với một máy tính khác trên Internet, các thông điệp mà chúng gửi đi (sử dụng một giao thức ở application layer cụ thể) sẽ được chuyển xuống ngăn xếp đến TCP layer.</li>
<li>TCP layer chịu trách nhiệm định tuyến các giao thức ứng dụng đến đúng ứng dụng trên máy tính đích. Để thực hiện điều này, số cổng (port number) được sử dụng.</li>
<li>Các cổng (ports) có thể được coi là các kênh riêng biệt trên mỗi máy tính. Ví dụ, bạn có thể lướt web trong khi đọc e-mail. Điều này là do hai ứng dụng này (trình duyệt web và ứng dụng mail) đã sử dụng số cổng khác nhau. Khi một gói tin đến máy tính và đi lên ngăn xếp giao thức, TCP layer sẽ quyết định ứng dụng nào nhận gói tin dựa trên số cổng.</li>
</ul>
<p>TCP hoạt động (định tuyến dữ liệu qua các layer trong ngăn xếp giao thức đến đúng ứng dụng) như sau:</p>
<ul>
<li>Khi TCP layer nhận được dữ liệu từ application layer, nó phân đoạn nó thành các <strong>đoạn (chunks)</strong> có thể quản lý được và sau đó thêm <strong>TCP header</strong> với thông tin TCP cụ thể vào từng <strong>đoạn</strong>. Thông tin có trong TCP header bao gồm số cổng của ứng dụng mà dữ liệu cần được gửi đến.</li>
<li>Khi TCP layer nhận được một gói từ IP layer (bên dưới nó), TCP layer sẽ tách dữ liệu <strong>TCP header</strong> khỏi gói đó, thực hiện một số cấu trúc lại dữ liệu nếu cần và sau đó gửi dữ liệu đến ứng dụng chính xác bằng cách sử dụng số cổng lấy từ TCP header.</li>
</ul>
<p>TCP <strong>không phải là một giao thức dạng văn bản.</strong> <strong>TCP là một dịch vụ luồng byte, định hướng kết nối, đáng tin cậy</strong>. Hướng kết nối có nghĩa là hai ứng dụng sử dụng TCP trước tiên phải thiết lập kết nối trước khi trao đổi dữ liệu. TCP đáng tin cậy vì đối với mỗi gói nhận được, một xác nhận được gửi đến người gửi để xác nhận việc gửi. TCP cũng bao gồm một tổng kiểm tra trong header của nó để kiểm tra lỗi dữ liệu đã nhận. TCP header chi tiết như sau:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664341877221/z3DIc9-yE.png" alt="how-internet-work-7.png" /></p>
<p>Lưu ý rằng không có chỗ cho địa chỉ IP trong TCP header. Điều này là do TCP không biết gì về địa chỉ IP. Công việc của TCP là lấy dữ liệu ở application layer từ ứng dụng này sang ứng dụng khác một cách đáng tin cậy. Nhiệm vụ lấy dữ liệu từ máy tính sang máy tính là công việc của IP.</p>
<h1 id="heading-internet-protocol-giao-thuc-internet"><strong>Internet Protocol - Giao thức internet</strong></h1>
<p>Không giống như TCP, IP là một giao thức không có kết nối, không đáng tin cậy. IP không quan tâm liệu một gói có đến đích hay không. IP cũng không biết về các kết nối và số cổng. Công việc của IP là gửi và định tuyến các gói đến các máy tính khác. Các gói IP là các thực thể độc lập và có thể đến không đúng thứ tự hoặc không đến. Công việc của TCP là đảm bảo các gói tin đến và theo đúng thứ tự. Về điểm chung duy nhất IP với TCP là cách nó nhận dữ liệu và thêm thông tin  IP header của chính nó vào dữ liệu TCP. IP header chi tiết như sau:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664341984053/J6lTC2QdN.png" alt="how-internet-work-8.png" /></p>
<p>Ở trên chúng ta thấy địa chỉ IP của máy tính gửi và nhận trong IP header. Dưới đây là một gói tin trông như thế nào sau khi đi qua Application layer, TCP layer, và IP layer. Dữ liệu ở  Application layer được phân đoạn trong TCP layer, TCP header được thêm vào, gói tin tiếp tục đến IP layer, IP layer được thêm vào và sau đó gói tin được truyền trên Internet.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664341993059/mcN8T9i6d.png" alt="how-internet-work-9.png" /></p>
<h1 id="heading-tong-ket">Tổng kết</h1>
<p>Ở tất cả phần trên, tôi đã trình bày cách internet hoạt động. Sẽ chẳng thể nói trước được điều gì, liệu rằng trong tương lai internet sẽ phát triển ra sao, nhưng chúng ta cần công nhận lợi ích của internet là vô cùng lớn. Để bạn chắc chắn về các kiến thức, tôi sẽ note lại một vài phần chúng ta cần chú ý dưới đây</p>
<ol>
<li>What is IP</li>
<li>Protocol Stacks and Packets</li>
<li>Networking Infrastructure</li>
<li>Internet Infrastructure</li>
<li>The Internet Routing Hierarchy</li>
<li>Domain Names and Address Resolution</li>
<li>Application Protocols<ol>
<li>HTTP and the World Wide Web</li>
<li>SMTP and Electronic Mail</li>
</ol>
</li>
<li>Transmission Control Protocol (TCP)</li>
<li>Internet Protocol (IP)</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[[Basic knowledge][Internet] Lịch sử của internet]]></title><description><![CDATA[Đây là bài viết đầu tiên của chuỗi seri mình nghiêm túc viết lại về Technical - kỹ thuật. Và lựa chọn đầu tiên của mình đáng nhẽ là về computer - máy tính. Nhưng bất chợt từ câu hỏi của một cậu em cùng team mình liên quan đến internet, và đó chính là...]]></description><link>https://hoangpn.net/lich-su-cua-internet</link><guid isPermaLink="true">https://hoangpn.net/lich-su-cua-internet</guid><category><![CDATA[internet]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[technology]]></category><category><![CDATA[Technical writing ]]></category><category><![CDATA[hoangpn]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Mon, 26 Sep 2022 05:53:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/8bghKxNU1j0/upload/v1664169328554/corXN4v1r.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Đây là bài viết đầu tiên của chuỗi seri mình nghiêm túc viết lại về Technical - kỹ thuật. Và lựa chọn đầu tiên của mình đáng nhẽ là về computer - máy tính. Nhưng bất chợt từ câu hỏi của một cậu em cùng team mình liên quan đến internet, và đó chính là lý do mình chuyển hướng, quay xe, và viết về nó - the <strong>Internet</strong>.</p>
<p>Vậy để cho dễ nắm bắt được hơn, chúng ta sẽ cùng đi vào tìm hiểu một số câu hỏi cơ bản sau đây?</p>
<ol>
<li>Internet là gì?</li>
<li>Ai tạo ra internet?</li>
<li>Ai điều hành, quản lý internet?</li>
<li>Tổng kết.</li>
</ol>
<h1 id="heading-internet-la-gi">Internet là gì?</h1>
<p>The Internet, dịch sang tiếng việt hiểu đơn giản là <strong>"mạng máy tính"</strong>. Chúng ta cùng đi sâu hơn một chút vào các khái niệm.</p>
<ul>
<li>Internet là một mạng toàn cầu gồm các <strong>máy tính được kết nối </strong>với nhau giao tiếp thông qua <strong>một tập hợp các giao thức được tiêu chuẩn hóa</strong>. Nó bắt đầu như một dự án nghiên cứu hàn lâm vào năm 1969, và trở thành một mạng lưới thương mại toàn cầu vào những năm 1990. Ngày nay nó được sử dụng rộng rãi bởi gần như toàn bộ người dân trên thế giới.</li>
<li>Internet đáng chú ý vì tính <strong>phi tập trung </strong>của nó. Không ai sở hữu Internet hoặc kiểm soát những người có thể kết nối với nó. Thay vào đó, hàng nghìn tổ chức khác nhau vận hành mạng lưới của riêng họ và thương lượng các thỏa thuận kết nối tự nguyện.</li>
<li>Phần lớn mọi người truy cập internet bằng browsers (trình duyệt web) ⇒ nhưng đây chỉ là một phần nhỏ của internet, bên cạnh nó còn có các ứng dụng khác như mail, …</li>
</ul>
<p>Không phải như mọi người lầm tưởng nó là một thứ gì đó như một <strong>đám mây internet</strong>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664170022830/01RUNT548.png" alt="cloud-internet.png" />
Mà trên thực tế, chúng ta có thể hiểu đơn giản, internet là một DÂY CÁP (một chuỗi kết hợp các dây cáp), kết nối các máy tính với nhau (như hình dưới). Và các dây cáp này, nếu kết nối xa, sẽ thường được đi dưới lòng đất, thậm chí là đi qua biển. Vậy nên mới xuất hiện hiện tượng là <strong>cá mập cắn cáp quang </strong>=&gt; dẫn đến mạng internet bị chậm 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1664170558221/hEF4LRj_5.png" alt="Submarine-cables-linking-Bangladesh-to-the-Internet-backbone-19.png" /></p>
<h1 id="heading-ai-tao-ra-internet">Ai tạo ra internet?</h1>
<ul>
<li>Internet bắt đầu với tên gọi <strong>ARPANET</strong>, một mạng lưới nghiên cứu học thuật được tài trợ bởi Cơ quan Dự án Nghiên cứu Tiên tiến của quân đội (ARPA, nay là DARPA). Dự án được dẫn dắt bởi <strong>Bob Taylor</strong>, một quản trị viên ARPA, và mạng được xây dựng bởi công ty tư vấn của Bolt, Beranek và Newman. Nó bắt đầu hoạt động vào năm <strong>1969</strong>.</li>
<li><strong>Năm 1973</strong>, các kỹ sư phần mềm <strong>Vint Cerf</strong> và <strong>Bob Kahn</strong> bắt đầu nghiên cứu thế hệ tiêu chuẩn mạng tiếp theo cho <strong>ARPANET</strong>. Các tiêu chuẩn này, được gọi là <strong>TCP / IP</strong>, đã trở thành nền tảng của Internet hiện đại. ARPANET chuyển sang sử dụng TCP / IP vào ngày 1 tháng 1 năm 1983.</li>
<li>Trong những năm 1980, nguồn tài trợ cho Internet chuyển từ quân đội sang Quỹ Khoa học Quốc gia (National Science Foundation - NSF). NSF tài trợ cho các mạng đường dài đóng vai trò là đường trục (backbone) của internet từ năm 1981 đến năm 1994. Năm 1994, Chính quyền Clinton đã chuyển quyền kiểm soát đường trục internet cho khu vực tư nhân. Nó đã được tư nhân vận hành và tài trợ kể từ đó.</li>
</ul>
<p>Vậy tóm gọn lại chúng ta có thể hiểu cơ bản, internet bắt đầu là một dự án phục vụ cho quân đội Mỹ, sau đó <strong>Vint Cerf</strong> và <strong>Bob Kahn</strong> bắt đầu nghiên cứu và phát triển thế hệ tiêu chuẩn mạng (<strong>TCP / IP</strong>) =&gt; và chúng ta công nhận 2 kỹ sư trên chính là <strong>cha đẻ của internet</strong></p>
<h1 id="heading-ai-dieu-hanh-quan-ly-internet">Ai điều hành, quản lý internet?</h1>
<ul>
<li>Không ai điều hành Internet.</li>
<li>Nó được tổ chức như một mạng lưới phi tập trung.</li>
<li>Hàng nghìn công ty, trường đại học, chính phủ và các tổ chức khác vận hành mạng riêng của họ và trao đổi lưu lượng truy cập với nhau dựa trên các thỏa thuận kết nối tự nguyện.</li>
<li>The Internet Corporation for Assigned Names and Numbers (<strong>ICANN</strong>) đôi khi được mô tả là chịu trách nhiệm quản lý internet. Đúng như tên gọi của nó, ICANN phụ trách phân phối tên miền (như <strong>https://hoangpn.com</strong>) và địa chỉ IP. Nhưng ICANN không kiểm soát ai có thể kết nối với Internet hoặc loại thông tin nào có thể được gửi qua đó.</li>
<li>Chúng ta nên lưu ý rằng, ở mỗi quốc gia, chúng ta sẽ chịu sự kiểm soát của luật định ở các quốc gia đó, và cũng có các luật định về việc sử dụng internet tương ứng. Tuy rằng <strong>ICANN không kiểm soát</strong> ai có thể kết nối với Internet hoặc loại thông tin nào có thể được gửi qua đó, nhưng chúng ta cũng cần tuân thủ theo luật định hiện hữu.</li>
</ul>
<h1 id="heading-tong-ket">Tổng kết</h1>
<p>Vậy chúng ta đã cũng nhau đi qua một chút lịch sử về internet, và giải đáp một số hiểu lầm thường thấy.
Cho đến ngày nay, chúng ta không thể phủ nhận được tầm quan trọng của internet. Thử hỏi một ngày không có internet, chúng ta sẽ sống và làm việc ra sao?</p>
<hr />
<p>#bettereveryday #hoangpn</p>
]]></content:encoded></item><item><title><![CDATA[[Work]  Người tuyển dụng muốn gì từ bạn?]]></title><description><![CDATA[Chào mọi người, lại là mình, Hoàng đây 😎
Hôm nay mình muốn chia sẻ một vấn đề theo mình là khá cần thiết cho các bạn trẻ, cũng như các bạn già như mình khi đi phỏng vấn.
Và dưới đây là Những điều ít ỏi mà tôi biết đến từ sự ngu dốt của tôi.
Phù hợp
...]]></description><link>https://hoangpn.net/work-nguoi-tuyen-dung-muon-gi-tu-ban</link><guid isPermaLink="true">https://hoangpn.net/work-nguoi-tuyen-dung-muon-gi-tu-ban</guid><category><![CDATA[Blogging]]></category><category><![CDATA[life]]></category><category><![CDATA[hoangpn]]></category><category><![CDATA[interview]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Fri, 26 Aug 2022 10:14:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/KdeqA3aTnBY/upload/v1661498236812/tg8U0sr6-.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Chào mọi người, lại là mình, Hoàng đây 😎</p>
<p>Hôm nay mình muốn chia sẻ một vấn đề theo mình là khá cần thiết cho các bạn trẻ, cũng như các bạn <code>già</code> như mình khi đi phỏng vấn.</p>
<p>Và dưới đây là <code>Những điều ít ỏi mà tôi biết đến từ sự ngu dốt của tôi.</code></p>
<h2 id="heading-phu-hop">Phù hợp</h2>
<p>Người phỏng vấn sẽ tìm người phù hợp với môi trường, không phải người giỏi nhất, không phải người chăm chỉ nhất, mà là người phù hợp với môi trường công việc hiện tại. Mình xin nhắc lại một lần nữa,  đó là <code>phù hợp</code>.</p>
<p>Đã bao giờ các bạn thắc mắc rằng:</p>
<ul>
<li>Bạn mình học kém hơn mình, không giỏi bằng mình, mọi thứ mình có trội hơn hẳn bạn mình. Nhưng tại sao cùng phỏng vấn, bạn không được nhận. Và bạn của bạn thì lại là người được nhận.</li>
<li>Hay, nếu cả 2 bạn cùng được nhận, nhưng mức offer của bạn mình lại cao hơn mình ???</li>
<li>... rất nhiều vấn đề khác nữa</li>
</ul>
<p>Cái mình muốn nhắc đến ở đây chính là sự <code>phù hợp</code>, đương nhiên, qua 1h, 2h phỏng vấn không nói lên được liệu rằng bạn có phù hợp với công ty thật hay không. Nhưng cũng đã đủ dữ kiện để đánh giá tương đối. Việc phù hợp ở đây được thể hiện ở nhiều điều, nhưng theo bản thân mình nhận thấy thì có một số mục sau:</p>
<ol>
<li><p><strong>Kiến thức, kinh nghiệm</strong> của bạn cho vị trí hiện tại bạn muốn phỏng vấn.</p>
<ul>
<li><strong>Kiến thức</strong> Bạn hãy lưu ý tới vị trí hướng tới, và rà soát, hệ thống lại các kiến thức mình có để có thể đảm nhận được vị trí đó. Bạn không thể mang kiến thức của việc đi làm <code>sale</code>, để phỏng vấn vị trí của một <code>luật sư</code> được. Đương nhiên thực tế thì sẽ không có như ví dụ trên. Nhưng mình mong muốn các bạn hiểu rằng, hãy tập trung kiến thức vào vị trí ứng tuyển.</li>
<li><strong>Kinh nghiệm</strong> Để ý rằng kinh nghiệm, không phải là số năm bạn làm việc trong lĩnh vực đó. <code>Đừng lầm tưởng</code>. Đối với mình khi đi phỏng vấn, mình sẽ không thường quan tâm tới số năm kinh nghiệm ghi trên CV, mà mình nhìn vào các dự án bạn đã làm, bạn đã trải qua, kể cả đó có thể là các dự án bạn thất bại.</li>
</ul>
</li>
<li><p><strong>Định hướng</strong> của bạn đối với môi trường công ty hiện tại đang có, hoặc sẽ có hướng phát triển.</p>
<ul>
<li>Nếu bạn chủ động đi phỏng vấn ở bất kỳ môi trường nào, hãy dành chút thời gian để tìm hiểu định hướng của công ty sắp phỏng vấn. Điều này sẽ là điểm cộng trong mắt các nhà tuyển dụng.</li>
<li>Đương nhiên, cũng cần nhìn nhận lại xem định hướng của bản thân có phù hợp với công ty hay không, và ngược lại. Điều này sẽ giúp các bạn có cơ hội phát triển tốt nhất.</li>
</ul>
</li>
<li><p><strong>Mindset (tư duy), tính cách</strong> của bạn đối với môi trường công ty hiện tại =&gt; Đây là một phần khá quan trọng, mà nhiều bạn không chú ý đến khi đi phỏng vấn. Bản thân mình khi phỏng vấn rất coi trọng vấn đề này.</p>
<ul>
<li>Đối với mình, đây có lẽ là điều quan trọng nhất của một ứng viên khi mình đi phỏng vấn. Mindset nhìn chung nó rất rộng. Tựu chung mình mong muốn nhìn thấy ở các bạn một <code>growth mindset</code>.</li>
<li>Kinh nghiệm, kiến thức thiếu, có thể học, nhưng tư duy không có, hoặc không đầy đủ, sẽ rất khó để thay đổi. Hãy nghiêm túc nhìn nhận lại tư duy đang có của mình.</li>
</ul>
</li>
<li><p><strong>Quyền lợi bạn mong muốn</strong> có phù hợp đối với môi trường hiện tại.</p>
<ul>
<li>Đương nhiên, đối với các bạn đi phỏng vấn, phần lớn là chúng ta bán thời gian, chất xám của mình để đổi lấy quyền lợi. Nên chúng ta cũng cần phải có quyền lợi xứng đáng, mà chúng ta có thể chấp nhận được trong môi trường mới.</li>
<li>Theo mình, quyền lợi nên được sắp xếp theo thứ tự như sau (Đương nhiên, mỗi người sẽ có những mong muốn, góc nhìn khác nhau)<ol>
<li>Môi trường của công ty có phù hợp với bản thân, có giúp ích cho <code>sự học hỏi, thăng tiến</code> của bản thân hay không?</li>
<li>Lương</li>
<li>Các đãi ngộ khác như chăm sóc bản thân, du lịch, khám sức khoẻ, ...</li>
</ol>
</li>
<li>Mình luôn đề cao các bạn có sự mong muốn phát triển bản thân, vì theo mình: bản thân bạn phát triển, thì tiền và các lợi ích khác chắc chắn sẽ đi theo sau. Mình thấy khá nhiều bạn nhảy công ty chỉ vì <code>lương thấp</code>. Hoặc đơn giản bạn muốn lương cao hơn, và thấy các công ty khác có vị trí phù hợp với mức lương cao hơn hiện tại. Ý kiến của mình rằng bạn nên nhìn ra xa hơn một chút. Đừng vì vài đồng lương thay đổi trước mắt mà có thể bỏ lỡ đi cơ hội của mình.</li>
</ul>
</li>
</ol>
<h2 id="heading-tiem-nang">Tiềm năng</h2>
<p>Các nhà tuyển dụng, người phỏng vấn các bạn sẽ nhìn vào thêm một khía cạnh khác của các bạn nữa. Đó chính là tiềm năng của các bạn nữa.</p>
<p>Tuyển dụng nhân sự, như một cuộc đầu tư vậy. Mà đầu tư thì sẽ đồng nghĩa với việc <code>rủi ro càng lớn, lợi ích càng cao</code>. Tuyển dụng, chính là đầu tư vào nhân sự phỏng vấn. Liệu rằng tương lai nhân sự này có thể mang lại lợi ích to lớn cho công ty không? Đó cũng là một câu hỏi mà các bạn phải tìm cách để giải đáp, chứng minh mình với các nhà tuyển dụng.</p>
<h2 id="heading-mot-vai-luu-y">Một vài lưu ý</h2>
<p>Phần dưới đây là một vài lưu ý mà mình nghĩ các bạn nên chuẩn bị trước khi đi phỏng vấn ở bất kì nơi nào.</p>
<ol>
<li><strong>Hãy chuẩn bị thật kỹ về hệ thống kiến</strong> thức mình đang có cho vị trí phỏng vấn.</li>
<li><strong>Hãy tìm hiểu</strong> thật kỹ <strong>về vị trí, công ty</strong> mình đang muốn vào làm việc. =&gt; Việc này không tốn quá nhiều thời gian nhưng sẽ thể hiện cho nhà tuyển dụng rằng bạn nghiêm túc với công việc này. Và mình thấy gần như không có ai làm được điều này khi phỏng vấn.</li>
<li>Hãy <strong>tham khảo thị trường</strong> về mức đãi ngộ tương ứng =&gt; Để có thể có được quyền lợi tốt nhất.</li>
<li>Cuối cùng là: hãy ăn mặc chỉnh tề và đến đúng giờ đã hẹn.</li>
</ol>
<hr />
<h2 id="heading-goodluck">Goodluck! 🍀🍀</h2>
<p>Đương nhiên, tất cả những chia sẻ dưới đây</p>
<ul>
<li>Đều là ý kiến cá nhân, kinh nghiệm của mình tích luỹ được khi tham gia phỏng vấn các ứng viên.</li>
<li>Được tham khảo từ nhiều nguồn như<ul>
<li>Sách</li>
<li>Những người có kinh nghiệm hơn</li>
<li>...</li>
</ul>
</li>
</ul>
<p>Cho nên tóm lại nó vẫn là ý kiến từ bản thân mình, nên rất mong các bạn để lại comment góp ý, để chúng ta cùng có những góc nhìn khác, và có thể cùng nhau phát triển.</p>
]]></content:encoded></item><item><title><![CDATA[Nhà Lãnh Đạo Không Chức Danh]]></title><description><![CDATA[📚 Tóm tắt sách
Suốt hơn 15 năm, Robin Sharma đã thầm lặng chia sẻ với những công ty trong danh sách Fortune 500 và nhiều người siêu giàu khác một công thức thành công đã giúp ông trở thành một trong những nhà cố vấn lãnh đạo được theo đuổi nhiều nhấ...]]></description><link>https://hoangpn.net/nha-lanh-dao-khong-chuc-danh</link><guid isPermaLink="true">https://hoangpn.net/nha-lanh-dao-khong-chuc-danh</guid><category><![CDATA[books]]></category><category><![CDATA[#BookReview]]></category><category><![CDATA[life]]></category><category><![CDATA[non tech ]]></category><category><![CDATA[hoangpn]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Wed, 03 Aug 2022 12:35:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1659527067906/hqrasjXkP.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-tom-tat-sach">📚 Tóm tắt sách</h1>
<p>Suốt hơn 15 năm, <code>Robin Sharma</code> đã thầm lặng chia sẻ với những công ty trong danh sách Fortune 500 và nhiều người siêu giàu khác một công thức thành công đã giúp ông trở thành một trong những nhà cố vấn lãnh đạo được theo đuổi nhiều nhất thế giới.</p>
<p>Đây là lần đầu tiên Sharma công bố công thức độc quyền này với bạn, để bạn có thể đạt được những gì tốt nhất, đồng thời giúp tổ chức của bạn có thể có những bước đột phá đến một cấp độ thành công mới trong thời đại thiên biến vạn hóa như hiện nay.</p>
<p><a target="_blank" href="https://hoangpn.notion.site/Nh-l-nh-o-kh-ng-ch-c-danh-ec819056372d498ca1b2d3ac914b2b70">Notion - Nhà lãnh đạo không chức danh</a> </p>
<h1 id="heading-y-kien-cam-nghi-cua-ban-than-minh-ve-sach">🤔 Ý kiến, cảm nghĩ của bản thân mình về sách</h1>
<p>Cuốn sách mang đến cho mình cái nhìn khá mới mẻ về việc lãnh đạo.
Mình cứ nghĩ lãnh đạo là một cái gì đó cao siêu, nhưng mình đã nhầm. Việc cung cấp cái nhìn nhiều góc cạnh, từ những điều nhỏ nhất đã mở ra cho mình rất nhiều câu hỏi tự vấn về bản thân trong suốt thời gian vừa rồi.</p>
<p>Bên cạnh đó, việc lãnh đạo cũng có nghĩa cho chính bản thân mình. Từ những việc như suy nghĩ, cho đến các hành động. Một bước chuyển biến không phải là quá lớn đối với mình (vì cơ bản mình đã đặt bản thân vào các quy tắc, thói quen tốt trước đó), nhưng mình nghĩ rằng với các bạn - nó sẽ là một bước chuyển biến lớn.</p>
<p>Tuy nhiên, có một điểm trừ mà mình không thích. Đó chính là cách truyền đạt xuyên suốt quyển sách của tác giả. Bằng việc kể một câu chuyện như cổ tích - mình hiểu tác giả có ý muốn truyền đạt một cách <code>thân thiện</code> nhất có thể, nhưng đối với mình dường như điều đó phản tác dụng.</p>
<h1 id="heading-tong-ket">✴️ Tổng kết</h1>
<p><code>NHÀ LÃNH ĐẠO KHÔNG CHỨC DANH</code> là một quyển sách đáng để các bạn thử một lần đọc hết nó. Theo bản thân mình nghĩ nó sẽ phù hợp với mọi đối tượng, từ các bạn học sinh, sinh viên cho đến các bạn đã đi làm như mình. Hãy cảm nhận nó, và quay lại đây để chúng ta cùng thảo luận nhé!</p>
]]></content:encoded></item><item><title><![CDATA[Bạn viết vì điều gì?]]></title><description><![CDATA[Một ngày đẹp trời tôi viết
Đầu tiên tôi phải thú nhận rằng, trong mọi việc làm của mình, nó đều mang một mục đích gì đó. Dù ít, dù nhiều, dù tốt, dù không tốt - nó đều chứa đọng trong mỗi việc tôi làm, từ những việc nhỏ nhất, tới những việc giúp tôi ...]]></description><link>https://hoangpn.net/ban-viet-vi-dieu-gi</link><guid isPermaLink="true">https://hoangpn.net/ban-viet-vi-dieu-gi</guid><category><![CDATA[TIL]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[non tech ]]></category><category><![CDATA[writing]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Tue, 12 Jul 2022 06:58:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/V5vqWC9gyEU/upload/v1657592327444/fh3cTc5Oo.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-mot-ngay-dep-troi-toi-viet">Một ngày đẹp trời tôi viết</h2>
<p>Đầu tiên tôi phải thú nhận rằng, trong mọi việc làm của mình, nó đều mang một mục đích gì đó. Dù ít, dù nhiều, dù tốt, dù không tốt - nó đều chứa đọng trong mỗi việc tôi làm, từ những việc nhỏ nhất, tới những việc giúp tôi có được miếng cơm để ăn, manh áo để mặc.</p>
<p>Việc viết - blog cũng vậy. Nhưng trước khi đi vào mục đích của việc viết, thì tôi xin trình bày một vài khó khăn của chính bản thân mình trước đã nhé</p>
<h2 id="heading-kho-khan-cua-ban-than">Khó khăn của bản thân</h2>
<ol>
<li>Tôi tự nhận thấy mình không có năng khiếu với văn học nói chung, viết lách nói riêng. Thể hiện cụ thể nhất là từ hồi còn đi học, tôi luôn luôn không qua nổi 6.5 điểm (một điểm số khá tệ) <code>Văn</code></li>
<li>Lời ăn, tiếng nói cũng không trau truốt, mượt mà như những gì mọi người biết về tôi ở thời điểm</li>
<li>Thói quen từ thời còn nhỏ là rất ít đọc sách + với việc chỉ chăm chú vào các con số <code>khô khan</code> toán học =&gt; Khiến tôi càng <code>ghét</code> việc viết lách hơn rất nhiều</li>
</ol>
<h2 id="heading-muc-dich">Mục đích</h2>
<p>Vậy, với xuất phát điểm đó, làm thế nào để tôi có thể viết được... Tôi cũng chẳng biết nữa, việc khó khăn nhất của làm bất kì một việc gì đó luôn là bước đi đầu tiên. Và may thay, tôi đã bước được bước đó, cho dù nó có rất tệ hại đi chẳng nữa.</p>
<p>Quay lại với mục đích của việc viết, thì có vài đầu dòng sau đây, mà tôi nghĩ nó đúng với hiện tại (tương lai - chưa biết)</p>
<ol>
<li>Viết cho bản thân mình<ul>
<li>Đầu tiên, tôi là dân kỹ thuật, tôi viết, chỉ đơn giản là lưu lại các bài học cho chính bản thân mình sau này. Lưu lại những kiến thức mà mình đã tích góp được qua một thời gian làm việc</li>
<li>Sau đó, tôi nhận ra rằng, viết - cũng là một cách để giảm tải stress, chia sẻ cảm xúc của chính mình</li>
<li>Cuối cùng, tôi chỉ đơn giản là muốn viết, muốn có một thói quen hàng tuần, thậm chí là hàng ngày. Viết cho thoả nỗi niềm</li>
<li>Đôi khi, viết - cũng là một cách tôi <code>tâm sự với chính bản thân mình</code>. Nó giúp tôi nhìn lại được quãng đường đã đi qua, và lý trí hơn cho quãng đường sắp tới.</li>
</ul>
</li>
<li>Viết cho mọi người<ul>
<li>Chẳng dám nhận là người tài giỏi, vì thật sự, tôi khá kém trong đám bạn của mình. Nhưng tôi nghĩ, những kiến thức, kinh nghiệm của mình, sẽ thật tốt nếu có thể giúp ích gì cho người khác</li>
<li>Gần đây, nếu các bạn có theo dõi bài viết của tôi, thì nó mang hơi hướng về life-style nhiều hơn là về công nghệ. Tôi muốn truyền chút động lực, chút cách sống tích cực của mình cho mọi người. Và thật vui khi tôi nhận được những lời quan tâm từ đồng nghiệp của mình về chiếc blog nhỏ nhắn của tôi.</li>
</ul>
</li>
</ol>
<h2 id="heading-ket">Kết</h2>
<p>Chẳng rõ từ bao giờ, việc viết lách đã khá quen tay cho dù tôi không chuyên như các tác giả, nhà văn, nhà báo, ... Còn rất nhiều điều thiếu sót - tôi hiểu nó. Nhưng có sao đâu nhỉ, hãy học từ những điều đó, thua ở đâu, đứng lên ở đó (không phải <code>gấp đôi ở đó</code>). </p>
<blockquote>
<p>Hãy học từ chính thất bại của mình.</p>
</blockquote>
<p>PS: Để cải thiện được, rất mong nhận được sự góp ý, bình luận của các bạn ❤️</p>
]]></content:encoded></item><item><title><![CDATA[80/20 và cách nhìn nhận mọi việc]]></title><description><![CDATA[1. 80/20 là gì?
Mình biết là nhiều bạn không thích phần này, vì nó khá nhiều chữ nghĩa, vì thế, mình sẽ cố gắng viết đơn giản nhất nhé.
Chúng ta cùng đi qua lịch sử một chút

Vào thế kỷ 19, một nhà kinh tế người Ý tên là Vilfredo Pareto đã quan sát t...]]></description><link>https://hoangpn.net/8020-va-cach-nhin-nhan-moi-viec</link><guid isPermaLink="true">https://hoangpn.net/8020-va-cach-nhin-nhan-moi-viec</guid><category><![CDATA[non tech ]]></category><category><![CDATA[life]]></category><category><![CDATA[blog]]></category><category><![CDATA[80/20]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Mon, 04 Jul 2022 16:18:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1656911842600/amyApzTSy.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-1-8020-la-gi">1. 80/20 là gì?</h2>
<p>Mình biết là nhiều bạn không thích phần này, vì nó khá nhiều chữ nghĩa, vì thế, mình sẽ cố gắng viết đơn giản nhất nhé.</p>
<p>Chúng ta cùng đi qua lịch sử một chút</p>
<blockquote>
<p>Vào thế kỷ 19, một nhà kinh tế <strong>người Ý</strong> tên là <strong>Vilfredo Pareto</strong> đã quan sát thấy hàng năm, khoảng 20% số cây đậu Hà Lan ông trồng trong vườn nhà cho ra đến 80% hạt đậu thu hoạch được. Cùng thời điểm đó, khi nghiên cứu về kinh tế vĩ mô, Pareto lại phát hiện ra rằng 80% của cải và thu nhập của nước Ý được kiểm soát chỉ  bởi 20% dân số. Nhận ra sự đặc biệt của <strong>tỷ lệ 80/20</strong>, Pareto cùng với hàng loạt nhà nghiên cứu sau đó đã lục tìm các số liệu trong kinh doanh, sản xuất kinh tế, xã hội và kết quả đều cho ra một những con số <strong>xấp xỉ với tỷ lệ 80/20</strong></p>
</blockquote>
<p>Đó, về cơ bản là ông ý nhận định thấy điều đó thông qua thực tế, hoàn toàn là số liệu, và từ đó đưa ra được cái quy luật gọi là 80/20. Về cơ bản thì</p>
<blockquote>
<p><strong>80% output</strong> (đầu ra/kết quả) được tạo bởi <strong>20% input</strong>  (đầu vào/hành động)</p>
</blockquote>
<h2 id="heading-2-cach-toi-nhin-nhan-ve-8020-trong-cuoc-song">2. Cách tôi nhìn nhận về 80/20 trong cuộc sống</h2>
<p>Trên thực tế, gần như hành động, sự việc nào cũng có thể áp dụng được quy luật này, đối với tôi, có vài ý chính như sau, và nó đã giúp tôi khá nhiều trong cuộc sống</p>
<h3 id="heading-21-cong-viec-hoc-tap">2.1 Công việc, học tập</h3>
<p>Tôi là một người khá tryhard trong công việc, nên hiển nhiên, nó sẽ được đề cập đầu tiên rồi. Đối với tôi thì</p>
<ul>
<li><strong>80% kết quả</strong> của một ngày làm việc tốt, được làm trong <strong>20% thời gian trong ngày</strong> đó. Thật vậy, việc bạn plan công việc cho một ngày, việc bạn chọn lọc công việc nào quan trọng cần dành thời gian, việc nào không quan trọng, để xuống cuối, hoặc thậm chí không cần làm là rất quan trọng. Hãy tập cách bỏ bớt các việc không quan trọng, ưu tiên cho việc quan trọng của bạn. Đương nhiên, mỗi người sẽ có một hoàn cảnh khác nhau. Ý tôi ở đây là bạn cần điều chỉnh nó sao cho phù hợp với bản thân mình.</li>
<li>Vậy học tập thì sao? Đương nhiên, để làm tốt một việc, bạn cần lên plan, chuẩn bị cho nó, và việc học cũng thế, chẳng khác gì cả. Cách bạn plan, chuẩn bị, và dành thời gian suy nghĩ xem mình học gì, học như thế nào, sẽ quyết định output đầu ra của bạn là tốt hay không tốt. Hiển nhiên rằng, bạn cần phải học, chứ không chỉ lên plan, nhưng ý tôi muốn nói ở đây rằng việc lên plan tốn bao nhiêu thời gian của bạn nhỉ 👀 - <strong>20%</strong></li>
</ul>
<h3 id="heading-22-ban-be-dong-nghiep">2.2 Bạn bè, đồng nghiệp</h3>
<p>Cuộc sống sẽ nhàm chán biết bao nếu thiếu đi mối tương tác với bạn bè, đồng nghiệp của mình nhỉ? Vậy cách tôi áp dụng <strong>80/20</strong> vào khía cạnh này như thế nào?</p>
<ul>
<li>Đương nhiên rằng trong một môi trường văn phòng, hoặc đại học, lớp học, việc bạn phải giao tiếp với các <em>"đồng nghiệp"</em> xung quanh là điều không thể tránh khỏi được. Nhưng hãy để ý rằng, chỉ có <strong>20% số đồng nghiệp</strong> thực sự quan tâm bạn hơn <strong>80% những người còn lại</strong>, vì thế, hãy chọn cho mình những người đồng nghiệp tốt, và dành thời gian cho họ nhé</li>
<li>Đến bạn bè thì sao nhỉ. Trước khi đi vào sâu hơn, bạn giúp tôi trả lời một câu hỏi nhỏ nhé. <strong>Bạn có bao nhiêu bạn thân tất cả?</strong> ... Đối với tôi, tôi có không nhiều, chắc chỉ vài người trên đầu ngón tay (maybe cả chân nữa 😂😂). Nhưng tựu chung lại khá ít. Và họ chính là <strong>20% số người bạn</strong> mà bạn nên dành thời gian cho họ, không phải <strong>80% số bè còn lại</strong> nhỉ.</li>
</ul>
<h3 id="heading-23-khac">2.3 Khác</h3>
<p>Thực ra ngoài 2 góc nhìn trên, thì còn rất rất nhiều góc nhìn khác mà mình muốn chia sẻ với bạn. Nhưng, bài cũng đã quá dài rồi, thiết nghĩ, nên để bạn nhìn nhận vấn đề này vào chính cuộc sống của bạn, thì nó sẽ có ý nghĩa hơn rất nhiều...</p>
<h2 id="heading-tum-vay-lai">Túm váy lại</h2>
<p>Nhắc lại một lần nữa</p>
<blockquote>
<p><strong>80% output</strong> (đầu ra/kết quả) được tạo bởi <strong>20% input</strong>  (đầu vào/hành động)</p>
</blockquote>
<p>Lời khuyên của bản thân mình là: <strong>Try it</strong>, hãy thử nó xem, bạn sẽ thấy có hiệu quả bất ngờ - cuộc sống của bạn sẽ chất lượng hơn rất nhiều...</p>
<p>P/S 1: Mình đã dọn dẹp lại phòng, và bỏ đi khá nhiều quần áo mình không còn dùng đến nữa =&gt; Thực sự giúp cho mình khá nhiều, vì phòng mình bé, và số lượng quần áo thì ngày một tăng lên. Và hi vọng rằng số quần áo mình bỏ đi đó, có thể giúp ích cho người khác</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656951408335/kfncyNSW8.jpg" alt="291097568_2164437410398532_3641908132586866557_n.jpg" /></p>
]]></content:encoded></item><item><title><![CDATA[Cách tôi tận dụng thời gian rảnh!]]></title><description><![CDATA[Bản thân tôi tìm hiểu và nhận thấy rằng để làm được một việc gì đó cần phải một khoảng thời gian hợp lý vừa đủ. Đối với tôi hiện tại, thời gian để làm việc bao gồm:

Chuẩn bị đầy đủ tài liệu cho công việc mình cần làm
Chuẩn bị không gian, môi trường ...]]></description><link>https://hoangpn.net/cach-toi-tan-dung-thoi-gian-ranh</link><guid isPermaLink="true">https://hoangpn.net/cach-toi-tan-dung-thoi-gian-ranh</guid><category><![CDATA[TIL]]></category><category><![CDATA[today i learn ]]></category><category><![CDATA[learning]]></category><category><![CDATA[free time]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Tue, 28 Jun 2022 11:25:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1656415455835/NQB2ZlIOf.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Bản thân tôi tìm hiểu và nhận thấy rằng để làm được một việc gì đó cần phải một khoảng thời gian hợp lý vừa đủ. Đối với tôi hiện tại, thời gian để làm việc bao gồm:</p>
<ol>
<li>Chuẩn bị đầy đủ tài liệu cho công việc mình cần làm</li>
<li>Chuẩn bị không gian, môi trường làm việc phù hợp</li>
<li>Cần thời gian để não bộ có thể khởi động làm quen với công việc của mình, ví dụ như: để giải toán =&gt; cần thời gian để hiểu đề toán, ...</li>
<li>Thời gian thực sự bạn sẽ làm việc tập trung</li>
<li>Kết thúc. Đôi khi đây chưa phải là lúc bạn finish công việc, mà chỉ đơn giản là kết thúc một phần nào đó của công việc mà thôi.</li>
</ol>
<p>Vậy với một mớ hỗn độn các thứ như bên trên, thì chúng ta cần một khoảng thời gian liên tục để có thể hoàn thành một công việc nào đó. Vậy sẽ thế nào nếu chúng ta có khoảng thời gian khoảng 10, 15 phút ?</p>
<p>Để tận dụng khoảng thời gian đó, chúng ta cần chuẩn bị tốt ở bước (1), hoặc thậm chí là bước (3). Thật vậy, đã bao giờ bạn đi đường mà cứ nghĩ mãi về một vấn đề nào đó, đã bao giờ bạn ăn cơm mà cứ ngẩn ngơ về công việc của mình?</p>
<p>Đối với tôi, tôi thường dùng khoảng thời gian đó để</p>
<ol>
<li>Draft ý tưởng cho các bài viết của mình</li>
<li>Học tiếng anh, có thể là vocab, hoặc 1 cụm từ nào đó, ...</li>
<li>Đọc sách ngắn, những mẩu truyện ngắn</li>
</ol>
<p>Chính bài post này được hình thành vào khoảng thời gian khoảng 10, 15 phút. Vì là <code>#TIL</code> nên tôi sẽ không trau truốt nó quá nhiều. Chỉ đơn giản là note lại.</p>
<blockquote>
<p>Give it try, don't be shy!</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Vấn đề tăng CPU ở prod]]></title><description><![CDATA[Mọi vấn đề đều xuất phát từ những thứ đơn giản nhất
Vấn đề gặp phải
Tại 1 web (giấu tên), prod báo về là bị CPU nhảy do chạy job => Điều tra nguyên nhân + hướng khắc phục
Các dữ kiện được cung cấp

Về việc phát sinh nhảy CPU là sau ngày x, trước ngày...]]></description><link>https://hoangpn.net/van-de-tang-cpu-o-prod</link><guid isPermaLink="true">https://hoangpn.net/van-de-tang-cpu-o-prod</guid><category><![CDATA[Technical writing ]]></category><category><![CDATA[technical]]></category><category><![CDATA[Databases]]></category><category><![CDATA[optimization]]></category><category><![CDATA[today i learn ]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Mon, 27 Jun 2022 16:45:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1656348174781/0TcKsqJ2N.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Mọi vấn đề đều xuất phát từ những thứ đơn giản nhất</p>
<h2 id="heading-van-de-gap-phai">Vấn đề gặp phải</h2>
<p>Tại 1 web (giấu tên), prod báo về là bị CPU nhảy do chạy job =&gt; Điều tra nguyên nhân + hướng khắc phục</p>
<h2 id="heading-cac-du-kien-duoc-cung-cap">Các dữ kiện được cung cấp</h2>
<ol>
<li>Về việc phát sinh nhảy CPU là sau ngày x, trước ngày x các tác vụ vẫn bình thường</li>
<li>Phân tích log cho thấy slow-query ở 1 câu query Y =&gt; nhưng khi xử lý chạy câu query ở môi trường local không vấn đề gì cả</li>
<li>Khi job của mình chạy, thì có các job khác cũng chạy đồng thời</li>
</ol>
<h2 id="heading-giai-quyet-van-de">Giải quyết vấn đề</h2>
<p><strong>Dự đoán ban đầu</strong>:
Việc tăng CPU khả năng cao là do việc query vào database lâu =&gt; từ đó dẫn đến CPU tăng đột ngột, nhưng tại sao, lại chỉ sau ngày x mới bị hiện tượng này, mà không phải bị từ đầu??</p>
<h2 id="heading-dieu-tra">Điều tra</h2>
<ol>
<li><p>Từ (3) =&gt; thử cô lập tắt job của mình đi, xem còn có hiện tượng tăng CPU không =&gt; kết quả không còn tăng. Tương tự, thử tắc các job khác đi, giữ nguyên job của mình =&gt; thấy CPU vẫn tăng. Từ đó rút ra kết luận =&gt; Vấn đề xuất phát từ job của bên mình</p>
</li>
<li><p>Kiểm tra coding tương ứng (xem có thay đổi gì không), thì chỉ có 1 sự thay đổi: Bỏ 1 chiếc index ở bảng xử lý (nhưng index đó đã không dùng nữa) =&gt; không có sự phát sinh coding ảnh hưởng tới phần logic, query mình xử lý ở job</p>
<pre><code class="lang-sql"><span class="hljs-comment"># (1, 2, 3, 4, 5) là dynamic, phụ thuộc vào một vài điều kiện khác - truy vấn lấy id ở bảng khác theo thời gian phù hợp</span>
 ...
 a INNER  JOIN b
   where b.column1 IN (1, 2, 3, 4, 5)
 ...
</code></pre>
</li>
<li><p>Từ (1), (2) =&gt; Lấy lại câu query gây slow =&gt; để kiểm tra chi tiết</p>
<ul>
<li><p>Explain =&gt; thì thấy bảng b đang sử dụng partrition =&gt; khả năng dẫn đến chậm =&gt; nhưng vì nếu chậm thì phải chậm từ đầu =&gt; nên khả năng này bỏ ra khỏi nguyên nhân chính</p>
</li>
<li><p>Debug từng dòng, từng <code>column1  IN</code> =&gt; thì thấy phát sinh hiện tượng, rất lâu ở 1 <code>ID</code>, nhưng ngoài <code>ID</code> đó thì chạy vẫn bình thường =&gt; dự đoán khả năng là do phát sinh vấn đề ở đây</p>
</li>
</ul>
</li>
<li><p>Kiểm tra lại điều kiện sinh ra <code>(1, 2, 3, 4, 5)</code> thì thấy phát sinh 1 bản ghi (bị chậm) mới được thay đổi điều kiện để có thể chạy job (tức là xuất hiện ở trong tệp <code>column1  IN</code>)</p>
<p>=&gt; Kết luận: Bản thân câu query đã chậm rồi, nhưng vì việc lấy dữ liệu ban đầu chưa gặp phải <code>column1 IN</code> nào có dữ liệu lớn =&gt; do đó chưa phát sinh vấn đề, nhưng nếu có dữ liệu lớn vào =&gt; slow query ngay lập tức</p>
</li>
<li><p>Kiểm tra lại kết luận, thật vậy, thử update lại điều kiện để không sinh ra <code>ID</code> lớn trong <code>column1 IN</code> =&gt; thì thấy job chạy bình thường, CPU không nhảy đột biến.</p>
</li>
</ol>
<p>Kết: Chúng ta cần phải khoanh vùng vấn đề, sau đó từ từ loại bỏ các dữ kiện không hợp lý =&gt; Sau đó cuối cùng, chúng ta cần confirm lại kết quả điều tra 1 lượt, để khẳng định tính đúng đắn. (Cách khắc phục update sau)</p>
]]></content:encoded></item><item><title><![CDATA[[Review code] Trách nhiệm đến từ hai phía (P2)]]></title><description><![CDATA[Hi các bạn, cũng lâu rồi mới ngoi lên đây viết vài dòng tâm sự chia sẻ chuyện đời, chuyện dev. Không biết bác nào giống mình không, càng già càng ngại viết lách :smiley: 
Đây ra seri bài viết xung quanh vấn đề review code, rất mong các bạn đón đọc. N...]]></description><link>https://hoangpn.net/review-code-trach-nhiem-den-tu-hai-phia-p2</link><guid isPermaLink="true">https://hoangpn.net/review-code-trach-nhiem-den-tu-hai-phia-p2</guid><category><![CDATA[code review]]></category><category><![CDATA[review]]></category><category><![CDATA[tech ]]></category><category><![CDATA[Technical writing ]]></category><category><![CDATA[technical]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Tue, 17 Aug 2021 16:08:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1656346000848/ofKgoOjTB.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656346068695/Rwqff86g7.webp" alt="review-the-code.webp" /></p>
<p>Hi các bạn, cũng lâu rồi mới ngoi lên đây viết vài dòng tâm sự chia sẻ chuyện đời, chuyện dev. Không biết bác nào giống mình không, càng già càng ngại viết lách :smiley: </p>
<p>Đây ra seri bài viết xung quanh vấn đề review code, rất mong các bạn đón đọc. Nói là seri, nhưng cũng chẳng có thứ tự, hãy tận hưởng nhé</p>
<ul>
<li>Phần 1: <a target="_blank" href="https://hoangpn.com/review-code-trach-nhiem-den-tu-hai-phia-p1">Trách nhiệm đến từ hai phía (P1)</a></li>
<li>Phần 2: <a target="_blank" href="https://hoangpn.com/review-code-trach-nhiem-den-tu-hai-phia-p2">Trách nhiệm đến từ hai phía (P2)</a></li>
</ul>
<p>Tiếp theo phần trước, chúng ta tiếp tục bàn về trách nhiệm của PR author's</p>
<h2 id="heading-trach-nhiem-cua-pr-authors">Trách nhiệm của PR author’s</h2>
<p>Như đã trình bày ở trên với các bạn, trách nhiệm đến từ 2 phía, vậy PR author's cần làm điều gì để giúp ích cho việc review code diễn ra thuận lợi hơn.</p>
<h3 id="heading-can-co-mot-description-tot">Cần có một description tốt</h3>
<p>=&gt; Hãy đọc nội dung này ở phần 1 nhé :hand: </p>
<h3 id="heading-cac-pr-nho-thi-tot-hon">Các PR nhỏ thì tốt hơn</h3>
<p><img src="https://images.viblo.asia/9b5c9b50-19f0-4889-a468-85674c2e9f07.jpg" alt="small-code-review-please.jpg" /></p>
<h4 id="heading-tai-sao-pr-can-nho">Tại sao PR cần nhỏ?</h4>
<ul>
<li><strong>Review sẽ nhanh hơn</strong>: Reviewer sẽ dễ dàng dành 5, 10 phút review nếu PR nhỏ thì dễ hơn là 30 phút cho một PR lớn.</li>
<li><strong>Xem xét PR kĩ lưỡng hơn</strong>: Với những thay đổi lớn, reviewer và authors thường sẽ có xu hướng cảm thấy nản vì các comment chi tiết chuyên qua chuyển lại. Đôi khi các điểm quan trọng sẽ bị bỏ sót</li>
<li><strong>Ít khả năng xảy ra bugs</strong>: Vì bạn đang thực hiện ít thay đổi hơn, nên bạn và reviewer sẽ dễ dàng suy luận một cách hiệu quả về tác động của PR và xem liệu có thể xảy ra bugs hay không một cách tốt hơn.</li>
<li><strong>Đỡ tốn effort hơn nếu PR bị reject</strong>: Nếu bạn tạo 1 PR lớn, sau đó bị reject vì đang sai hướng đi, sẽ rất tốn công sức để làm lại</li>
<li><strong>Dễ dàng merge hơn</strong>: Làm việc trên một PR lớn tốn rất nhiều thời gian, vì vậy bạn sẽ có nhiều conflict khi merge code, và bạn sẽ phải fix conflict nhiều hơn.</li>
<li><strong>Không cần phải chờ đợi review quá lâu để có thể xử  lý tiếp</strong>: Đôi lúc, 1 task của bạn rất lớn, và tách ra làm nhiều phần khác nhau. Bạn thử nghĩ xem, nếu phần PR bạn nhờ review to =&gt; tổn thời gian để chờ. Và bạn lại cần merge gấp để có thể start việc coding của mình. Quả thật là toanggg.</li>
<li><strong>Dễ dàng quay lại fix nếu có comments</strong>: Đôi lúc, bạn đang code task 3, 4 mà cần phải quay lại để fix review của task 1. Nếu PR quá lớn, sẽ rất mất thời gian để bạn nắm lại spec cũng như check lại tính đúng đắn của PR.</li>
</ul>
<p>Chú ý rằng, reviewer có quyền reject hoàn toàn PR của bạn vì lý do duy nhất là PR quá lớn. Thông thường, vì lịch sự, họ sẽ cảm ơn đóng góp của bạn, nhưng yêu cầu bạn bằng cách nào đó tách nó thành các PR nhỏ hơn. Đương nhiên, có thể nó sẽ tốn nhiều thời gian và công sức. Vậy nên tốt nhất là hãy tách các PR đủ nhỏ ngay từ đầu.</p>
<h4 id="heading-the-nao-la-pr-nho">Thế nào là PR nhỏ</h4>
<p>Nhìn chung, PR vừa đủ để tiện cho việc review thường là sẽ thực hiện một chức năng duy nhất, riêng biệt. Điều đó có nghĩa là:</p>
<ul>
<li>PR thực hiện một chức năng duy nhất. Đây thường chỉ là một phần của một task thay vì toàn bộ task đó. Nếu có thể, hãy làm việc với reviewer trước để có thể đi đến thống nhất.</li>
<li>PR nên bao gồm cả UnitTest</li>
<li>Mọi thứ mà reviewer cần để hiểu về PR của bạn như description, codebase hiện tại, hoặc các PR khác tương tự, ...</li>
<li>Các PR cũng không nên quá nhỏ, khi đó nó sẽ rất khó hiểu. Nếu được, bạn hãy đính kèm documents để tiện cho việc review.</li>
</ul>
<p>Thực sự thì không có quy tắc cố định nào quy định về việc một PR thế nào là đủ nhỏ. hoặc quá lớn. Nhưng có một vài số liệu chung như</p>
<ul>
<li>100 lines change thường là kích thước hợp lý</li>
<li>1000 lines change thường là kích thước quá lớn.</li>
<li>200 lines change trong một file thường không sao, nhưng nếu có nhiều files như vậy thì sẽ là quá lớn.</li>
</ul>
<h4 id="heading-khi-nao-pr-to-co-the-duoc-chap-nhan">Khi nào PR to có thể được chấp nhận</h4>
<p>Trong một vài trường hợp, PR to có thể chấp nhận được như</p>
<ul>
<li>Bạn có thể coi rằng việc xóa files nào đó là 1 line change, vì thường thì reviewer sẽ không mất nhiều thời gian để xem xét chúng</li>
<li>Đôi khi, bạn có các PR về việc refactoring code mà được xử lý tự động bằng 1 vài tools có thể tin tưởng được. Mặc dù là PR lớn, nhưng chúng ta có thể chấp nhận điều này, đương nhiên, cho dù vậy, chúng ta vẫn cần các bước y hệt 1 PR bình thường như testing.</li>
</ul>
<h4 id="heading-refactoring-nen-la-1-pr-rieng-biet">Refactoring nên là 1 PR riêng biệt</h4>
<p>Thông thường, chúng ta nên tách riêng PR cho việc xử lý spec mới, và refactoring nếu chúng đủ to để tách. Đừng nên quá cứng nhắc trong việc này. Ví du như các bước bỏ như sửa tên biến trong phạm vi nhỏ,  hay chính sửa logic cũ cần thiết để có thể đáp ứng được spec thì cũng không cần thiết phải tách ra. Đừng để việc refactoring ảnh hưởng tới tiến độ của task.</p>
<h4 id="heading-pr-nen-co-day-du-ca-unittest">PR nên có đẩy đủ cả UnitTest</h4>
<p>Hãy nhớ rằng, PR nhỏ ở đây có nghĩa là nên tập trung vào một hoặc vài chức năng liên quan được chấp thuận, chứ không phải chỉ là vài dòng thay đổi thì được gọi là nhỏ.</p>
<p>Hãy luôn bảo đảm rằng code của mình đã có UnitTest, cho dù đó là thay đổi nhỏ nhất.</p>
<h4 id="heading-phai-lam-gi-neu-khong-the-tach-nho-pr">Phải làm gì nếu không thể tách nhỏ PR?</h4>
<p>Đôi khi bạn gặp phải một vài tính huống dẫn đễn việc PR bắt buộc phải lớn. Điều này rất hiếm khi xảy ra. Các developer hầu như luôn có thể tìm ra cách để tách nhỏ các PR</p>
<p>Trước khi xử lý một PR lớn. hãy xem xét đến việc refactoring trước có giúp cho việc triển khai PR tốt hơn không? Hoặc đơn giản hơn là nói chuyện trao đổi với reviewer hoặc đồng nghiệp của bạn để tìm giải pháp</p>
<p>Nếu tất cả những điều trên không thể thực hiện, thì ít nhất hãy thông báo cho reviewer của bạn để có được sự đồng ý từ họ, cũng như giúp cho họ chuẩn bị đễ review 1 PR lớn. Nếu điều này xảy ra, hãy hiểu rằng, PR của bạn sẽ được review trong một thời gian dài.</p>
<h3 id="heading-xu-ly-feedback-comments-cua-reviewer">Xử lý feedback, comments của reviewer</h3>
<p>Đương nhiên, đã review thì thường sẽ có comment, mà đã có comment thì sẽ phải giải quyết. Dưới đây là một số điều hữu ích cần biết về việc xử lý comments của reviewer</p>
<h4 id="heading-dung-coi-viec-review-la-cong-kich-ca-nhan">Đừng coi việc review là công kích cá nhân.</h4>
<p><img src="https://images.viblo.asia/c447afe8-996a-462e-a960-79ecd8ff1e9a.jpeg" alt="1_Ypd0z4OhOmegm-WHyGHgxg.jpeg" />
Nên nhớ rằng, mục tiêu của việc review code là làm cho codebase tốt lên. Khi reviewer review và đưa ra comments về code của bạn. Hãy hiểu rằng đó hoàn toàn là vấn đề công việc. Không có ý công kích cá nhân gì ở đây cả. Hãy hạ cái tôi của mình xuống, luôn đón nhận với tâm thế học hỏi.</p>
<p><strong>Đừng bao giờ trả lời, hay phản ứng review code một cách tức giận !
</strong></p>
<h4 id="heading-fix-the-code">Fix the Code</h4>
<p>Đương nhiên, phần lớn chúng ta đều phải fix comments code. Không ai tránh khỏi việc này. Nên hãy chắc chắn rằng</p>
<ol>
<li>Đừng bao giờ lặp lại lỗi tương tự như vậy nữa.</li>
<li>Hãy cố gắng làm code của bạn dễ hiểu nhất đối với reviewer =&gt; Vì chúng ta cần hiểu rằng, code của chúng ta sẽ sử dụng lại vào thời điểm sau này bởi bất kì ai.</li>
<li>Hãy chắc chắn rằng mình chạy lại UnitTest, hay self-test, hoặc check lại PR ít nhất 1 lần trước khi gửi lại cho reviewer.</li>
<li>Hãy nhớ rằng, không phải tất cả các comment cần phải fix, hay kiểm chứng lại, hoặc hỏi lại reviewer của mình để cùng đưa ra hướng đi tốt nhất.</li>
</ol>
<h3 id="heading-tong-ket">Tổng kết</h3>
<p>Qua bài viết này chúng ta rút ra được những điều gì?</p>
<ol>
<li>Tách nhỏ các PR nếu có thể, tránh để PR quá to và nhờ người khác review.</li>
<li>Hãy mang tâm thế học hỏi, đừng coi việc comment code là công kích cá nhân.</li>
<li>Đừng trả lời comment trong khi tức giận.</li>
</ol>
<p>Thực sự thì, việc review code là một cách tốt nhất để <strong>học hỏi kinh nghiệm từ ai đó</strong>. Bạn nên mang trong mình tâm thế học hỏi khi nhờ người khác review, và có comment lại, cho dù đó là người có level cao hơn hay thấp hơn mình.</p>
<p>Hãy chờ đón phần tiếp theo nhé. Nêu có bất kì thắc mắc gì cần giải đáp, hoặc góp ý cho mình, thì hãy comment ở dưới nhé. Cảm ơn các bạn đã đọc bài viết đến đây.</p>
<hr />
<p><a target="_blank" href="https://hoangpn.com">@hoangpn - Better every day!</a></p>
]]></content:encoded></item><item><title><![CDATA[[Review code] Trách nhiệm đến từ hai phía (P1)]]></title><description><![CDATA[Hi các bạn, cũng lâu rồi mới ngoi lên đây viết vài dòng tâm sự chia sẻ chuyện đời, chuyện dev. Không biết bác nào giống mình không, càng già càng ngại viết lách :smiley: 
Đây ra seri bài viết xung quanh vấn đề review code, rất mong các bạn đón đọc. N...]]></description><link>https://hoangpn.net/review-code-trach-nhiem-den-tu-hai-phia-p1-1</link><guid isPermaLink="true">https://hoangpn.net/review-code-trach-nhiem-den-tu-hai-phia-p1-1</guid><category><![CDATA[code review]]></category><category><![CDATA[review]]></category><category><![CDATA[tech ]]></category><category><![CDATA[Technical writing ]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Mon, 09 Aug 2021 15:49:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1656344921313/3AC_ISVGP.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656344753261/LrwmuwpIh.webp" alt="21d2fcc6-849c-4a6c-9bcb-cac479a2ef68.webp" /></p>
<p>Hi các bạn, cũng lâu rồi mới ngoi lên đây viết vài dòng tâm sự chia sẻ chuyện đời, chuyện dev. Không biết bác nào giống mình không, càng già càng ngại viết lách :smiley: </p>
<p>Đây ra seri bài viết xung quanh vấn đề review code, rất mong các bạn đón đọc. Nói là seri, nhưng cũng chẳng có thứ tự, hãy tận hưởng nhé</p>
<ul>
<li>Phần 1: <a target="_blank" href="https://hoangpn.com/review-code-trach-nhiem-den-tu-hai-phia-p1">Trách nhiệm đến từ hai phía (P1)</a></li>
<li>Phần 2: <a target="_blank" href="https://hoangpn.com/review-code-trach-nhiem-den-tu-hai-phia-p2">Trách nhiệm đến từ hai phía (P2)</a></li>
</ul>
<p>Xuất phát từ tâm lý chung, mà phần lớn các dev đều có suy nghĩ là, thôi cứ code xong, đẩy PR cho ông senior nào đấy review, ổng comment, mình sửa, ezz game. Miễn sao mà code cho chạy đúng là được.</p>
<p>Chuẩn không cần chỉnh, mà chỉnh càng chuẩn. Nói chứ mình cũng 1 thời mang suy nghĩ như thế, chắc do là dev lâu nên tính xấu tích tụ, suy bụng ta ra bụng người. Không biết có bác nào như mình không? :sweat_smile: </p>
<p>Thực tế thì, trách nhiệm cần đến từ 2 phía, cả từ tạo PR, và cả người review. Tại sao lại thế? Trước khi đi vào câu hỏi trên, hãy cũng mình ôn lại 1 số khái niệm cơ bản nhé.</p>
<h2 id="heading-tong-quan-ve-review-code">Tổng quan về review code</h2>
<p>Đầu tiên, các bạn cũng mình lướt qua 1 vài khái niệm chính nhé</p>
<h3 id="heading-review-code-la-gi">Review code là gì?</h3>
<p><img src="https://images.viblo.asia/ef0f10f6-b1d2-4cc1-950f-18f0f9719356.jpg" alt="meme1.jpg" /></p>
<ul>
<li>Là quá trình mà các lập trình viên xem xét và đánh giá code của một thành viên khác trong nhóm</li>
<li>Đồng thời cũng là quá trình thảo luận, đưa ra những góp ý nhằm giúp các đoạn code thêm chất lượng hơn.</li>
</ul>
<p>Đương nhiên rồi, qua 2 gạch đầu dòng nhỏ bên trên (hoặc chẳng cần :cry: ) Chúng ta có thể hiểu rằng, review code là 1 bước trong quá trình phát triển phần mềm, mà ở đó, chúng ta cùng xem xét 1 đoạn code, và làm cho nó tốt lên.</p>
<p>Vậy câu hỏi đặt ra ở đây, tại sao chúng ta lại thường xuyên mất thời gian vào đó?</p>
<h3 id="heading-loi-ich-cua-review-code">Lợi ích của review code</h3>
<p>Review code có rất nhiều lợi ích, mình chỉ tóm gọn lại vài ý chính như sau:</p>
<p><strong>Về cá nhân:</strong></p>
<ol>
<li>Nâng cao trình độ bản thân của mỗi cá nhân</li>
<li>Học cách truyền đạt và góp ý cho người khác, cũng như kiểm chứng lại kiến thức của chính mình.</li>
</ol>
<p><strong>Về dự án:</strong></p>
<ol>
<li>Các member nắm bắt được những gì diễn ra trong dự án</li>
<li>Là một bước quan trọng để giảm thiểu lỗi phát sinh</li>
<li>Đương nhiên, giúp cho <strong>chất lượng của code</strong> tốt lên =&gt; làm cho codebase tốt lên, chất lương dự án tốt hơn</li>
</ol>
<h2 id="heading-trach-nhiem-cua-pr-authors">Trách nhiệm của PR author’s</h2>
<p>Như đã trình bày ở trên với các bạn, trách nhiệm đến từ 2 phía, vậy PR author's cần làm điều gì để giúp ích cho việc review code diễn ra thuận lợi hơn.</p>
<h3 id="heading-can-co-mot-description-tot">Cần có một description tốt</h3>
<p>Đầu tiên, chúng ta cần hiểu rằng, PR cần được mô tả về những gì nó làm, và tại sao nó lại làm như thế. Nó sẽ được lưu lại, và sẽ được hàng trăm developer khác xem sau đó.</p>
<p>Các bạn nên nhớ và có ý niệm về việc mình không chỉ code cho 1 mình mình, không chỉ code cho 1 mình ông reviewer, mà là code cho các developer sau đó nữa - người mà có khi bạn còn chẳng biết là ai. Nên hãy hiểu rằng, từng PR, từng description sẽ là thông tin rất quan trọng để thông báo cho họ rằng, PR của mình làm cho spec A, B, C, ...</p>
<h4 id="heading-first-line">First Line</h4>
<ul>
<li>Tóm tắt ngắn gọn về những gì đang thực hiện</li>
<li>Câu hoàn chỉnh, được viết như một khẳng định</li>
<li>Dưới nó nên là một break line</li>
</ul>
<p>Dòng đầu tiên của PR nên là một bản tóm gọn lại những gì PR đnag thực hiện, nên có một break line ngay sau đó, giúp cho người đọc có thể nắm được ý chính nhanh nhất có thể</p>
<p>Cố gắng giữ cho dòng đầu tiên ngắn gọn, tập trung đi vào trọng tâm. Tránh dài dòng, vòng vo, hoặc quá tối nghĩa.</p>
<p>Ví du:</p>
<pre><code><span class="hljs-comment"># Bad</span>
Deleting filter in users

<span class="hljs-comment"># Good</span>
<span class="hljs-keyword">Delete</span> filter <span class="hljs-keyword">in</span> <span class="hljs-keyword">users</span>
</code></pre><h4 id="heading-body-is-informative">Body is Informative</h4>
<p>Trái ngược với <strong>first line</strong> - ngắn gọn súc tích. Thì phần nội dung còn lại của description cần phải mô tả thông tin chi tiết và bao gồm bất ký thông tin bổ sung nào mà người đọc cần để hiểu tổng thể về PR.</p>
<p>Nó có thể bao gồm một mô tả ngắn gọn về vấn đề đang được giải quyết và lý do tại sao đây là cách tiếp cận tốt nhất. Nếu có bất ký thiếu sót vào đối với cách tiếp cận của bạn thì chúng cần được đề cập tới. Nếu được hãy note thêm các trạng thái trước đó như số bugs, kết quả benchmark, và link đến design documents.</p>
<p>Nếu bạn có đính kèm các link bên ngoài, hãy cân nhắc rằng chúng có thể không hiển thị với người đọc trong tương lai do nhiều lý do. Nếu có thể hãy cố gắng trình bày sao cho người đọc sau có thể hiểu được.</p>
<p>Cần chú trọng điều này ngay cả cho các PR nhỏ</p>
<h4 id="heading-bad-pr-descriptions">Bad PR Descriptions</h4>
<p>Dưới đây là một vài ví dụ về bad descriptions</p>
<blockquote>
<p>“Fix build.”</p>
<p>“Add patch.”</p>
<p>“Moving code from A to B."</p>
<p>“Phase 1.”</p>
<p>“Add convenience functions.”</p>
<p>“kill weird URLs.”</p>
<h4 id="heading-good-pr-descriptions">Good PR Descriptions</h4>
<p>Dưới đây là một vài ví dụ về good descriptions</p>
</blockquote>
<p><strong>Functionality change</strong></p>
<blockquote>
<p>rpc: remove size limit on RPC server message freelist.</p>
<p>Servers like FizzBuzz have very large messages and would benefit from reuse. Make the freelist larger, and add a goroutine that frees the freelist entries slowly over time, so that idle servers eventually release all freelist entries.</p>
</blockquote>
<p><strong>Refactoring</strong></p>
<blockquote>
<p>Construct a Task with a TimeKeeper to use its TimeStr and Now methods.</p>
<p>Add a Now method to Task, so the borglet() getter method can be removed (which was only used by OOMCandidate to call borglet’s Now method). This replaces the methods on Borglet that delegate to a TimeKeeper.</p>
<p>Allowing Tasks to supply Now is a step toward eliminating the dependency on Borglet. Eventually, collaborators that depend on getting Now from the Task should be changed to use a TimeKeeper directly, but this has been an accommodation to refactoring in small steps.</p>
<p>Continuing the long-range goal of refactoring the Borglet Hierarchy.</p>
</blockquote>
<p><strong>Small PR cũng cần có description hoàn chỉnh</strong></p>
<blockquote>
<p>Create a Python3 build rule for status.py.</p>
<p>This allows consumers who are already using this as in Python3 to depend on a rule that is next to the original status build rule instead of somewhere in their own tree. It encourages new consumers to use Python3 if they can, instead of Python2, and significantly simplifies some automated build file refactoring tools being worked on currently.</p>
</blockquote>
<h4 id="heading-generated-pr-descriptions">Generated PR descriptions</h4>
<p>Hẫy cân nhắc đến việc generate tự động các description bằng cách sử dụng các tools. Bằng cách nào cũng nên tuân thủ các quy tắc ở bên trên.</p>
<h4 id="heading-review-the-description-before-submitting-the-pr">Review the description before submitting the PR</h4>
<p>Các PR có thể thay đổi đáng kể qua quá trình review, fix bug, ... Vì vậy, bạn nên xem lại description một lần trước khi submit PR, hoặc có bất kì commit gì đó thay đổi. Mục đích để đảm bảo rằng description mô tả đúng những gì PR thực hiện</p>
<h3 id="heading-tong-ket">Tổng kết</h3>
<p>Qua bài viết này chúng ta rút ra được những điều gì?</p>
<ol>
<li>Trách nhiệm của PR đến từ cả 2 phía, đừng phụ thuộc, ỉ lại quá nhiều vào reviewer.</li>
<li>Mục đích chung của Review code là giúp cho codebase tốt hơn (đương nhiên là sẽ đi theo PR phải thực hiện đúng chức năng mong muốn)</li>
<li>Hãy có một description tốt.</li>
</ol>
<p>Hãy chờ đón phần tiếp theo nhé. Nêu có bất kì thắc mắc gì cần giải đáp, hoặc góp ý cho mình, thì hãy comment ở dưới nhé. Cảm ơn các bạn đã đọc bài viết đến đây.</p>
<hr />
<p><a target="_blank" href="https://hoangpn.com">@hoangpn - Better every day!</a></p>
]]></content:encoded></item><item><title><![CDATA[Xây dựng blog cá nhân đảm bảo RẺ-ĐẸP-NHANH-BỀN.👍]]></title><description><![CDATA[Hi các bạn, mình là Hoàng đây, vẫn là mình sau 1 thời gian ăn no ngủ kĩ sau tết. Giờ ngoi lên xem công nghệ thế giới chuyển biến thế nào rồi
Chẳng là, mình có 1 con blog viết bằng Rails, nhưng vì nghèo, nên không có tiền chạy vps => Đã đến lúc phải l...]]></description><link>https://hoangpn.net/xay-dung-blog-ca-nhan-dam-bao-re-dep-nhanh-ben</link><guid isPermaLink="true">https://hoangpn.net/xay-dung-blog-ca-nhan-dam-bao-re-dep-nhanh-ben</guid><category><![CDATA[blog]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[Vue.js]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Fri, 28 May 2021 08:39:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1656309677738/UIYhgIW1b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656309802189/y-oYbo9NC.png" alt="600x600.png" /></p>
<p>Hi các bạn, mình là Hoàng đây, vẫn là mình sau 1 thời gian ăn no ngủ kĩ sau tết. Giờ ngoi lên xem công nghệ thế giới chuyển biến thế nào rồi</p>
<p>Chẳng là, mình có 1 con blog viết bằng Rails, nhưng vì nghèo, nên không có tiền chạy vps =&gt; Đã đến lúc phải làm điều gì đó cho đứa con tinh thần của mình rồi
Okay, let start :grinning::grinning:</p>
<p>Đầu tiên, đối với mình hiện tại, thì tiêu chí của mình đối với 1 con blog là</p>
<ol>
<li>Chi phí chạy nó rẻ nhất có thể(dành cho bác nào nghèo như mình)</li>
<li>Tốc độ truy cập trang nhanh</li>
<li>Viết thêm một bài mới đơn giản</li>
</ol>
<p>Ý nghĩ đầu tiên lóe lên trong đầu mình là <strong>github pages</strong>, vâng, github pages - Cái thứ mà ít nhất mỗi dev đều thử nó một lần, thấy được một cái trang web của mình làm ra nhanh chóng, tiện lợi thì đều rất thích thú mà :heart_eyes::heart_eyes:</p>
<p>Đối với thằng github pages thì thậm chí bạn chẳng phải mất tiền thuê vps hay hosting nữa, trang github pages của bạn sẽ bất tử(cho đến khi nào github bỏ tính năng này thì thôi :) )</p>
<p>Ok đã xong được thằng <strong>tiêu chí 1</strong> rồi. Khổ nỗi, mình lại là thằng chúa lười(may mà vẫn có người yêu). Giờ nghĩ, lại code lại như con rails blog trước thì thôi cũng quá tôi =&gt; Nhanh trí nghĩ ngay ra dùng các theme mà github pages hỗ trợ. Việt Nam nói là làm, nhanh tay lấy cuộn giấy bàn phím gõ gõ vào việc ngay. Sau 1 hồi tìm kiếm thì thấy thằng github pages nó chỉ support luôn <strong>Jekyll</strong> thôi, mà mấy cái template của thằng này lại xấu xí quá trong khi đó tính mình yêu cái đẹp, thích màu hồng nên phải đi đường khác rồi.</p>
<p><img src="https://images.viblo.asia/9cf35a73-ccde-429a-97ef-e9def1efeb30.png" alt /></p>
<p>Tiếp tục công cuộc tìm với tiêu chí 2. Mình nghĩ ngay đến mấy cái static pages đang thịnh hành cho việc viết blog đơn giản. Nhanh tay, tìm ngay vài thằng cộm cán như sau</p>
<ol>
<li><a target="_blank" href="https://gohugo.io/">HUGO</a></li>
<li><a target="_blank" href="https://www.gatsbyjs.com/">GatsbyJS</a></li>
<li><a target="_blank" href="https://vuepress.vuejs.org/">Vuepress</a> </li>
</ol>
<p>Còn vài thanh niên nữa nhưng nổi lên nhất là 3 cháu này, xịn xò, theme thì không thiếu. Nhưng cá nhân mình lại là con nghiện của VueJS thế mới chết, nên đành ngậm ngùi chia tay 2 em <em>HUGO</em> và <em>Gastby</em> mà chọn <strong>Vuepress</strong> thôi. Nói thật ra là quen tay dùng VueJS nên có gì còn có thể kịp trở tay được :). </p>
<p><em>Note: Bạn nào quen dùng react thì nên dùng <a target="_blank" href="https://www.gatsbyjs.com/">GatsbyJS</a>. Thằng này cũng khá xịn xò tay to các thứ các thứ đấy</em></p>
<p>Qua quá trình tìm kiếm qua thằng bạn thân <strong>google</strong>, thì mình chốt được 2 cái</p>
<ol>
<li>Dùng github pages</li>
<li>Dùng Vuepress</li>
</ol>
<p>Loanh quanh 1 hồi thì đúng là vuepress không làm mình thất vọng, template của thằng này thì nói thật không thiếu, bạn chỉ cần chọn cái thích hợp với mình thôi. Việc còn lại để vuepress lo :joy::joy:</p>
<p><em>Note: Các bạn có thể tham khảo thêm các</em> <a target="_blank" href="https://github.com/vuepress/awesome-vuepress#community-themes"><em>theme của vuepress ở đây nhé</em></a> </p>
<p>Thêm nữa là việc viết 1 bài mới đối với những thằng kể trên là dùng <strong>markdown</strong> nhé, rất quen thuộc với mọi dev, và có thể tha hồ đăng bài ở các diễn đàn khác nhau(vì cơ bản giờ toàn dùng md để viết mà). Đối với bản thân mình thì khá dễ sử dụng :heart_eyes::heart_eyes:</p>
<p>Okay, bắt tay vào xây dưng blog của mình thoai nào(Sau khi đã chọn đươc vuepress làm điểm tựa :) )</p>
<ol>
<li>Instal Vuepress</li>
<li>Chọn theme</li>
<li>Kiểm tra thành quả</li>
<li>Deploy to Github Pages</li>
<li>Setup Auto build</li>
<li>Các vấn đề khác</li>
</ol>
<h2 id="heading-instal-vuepress">Instal Vuepress</h2>
<p>Các bạn cứ tham khảo <a target="_blank" href="https://vuepress.vuejs.org/guide/#how-it-works">trang chủ</a> của nó là ra ngay ý mà </p>
<pre><code class="lang-js"><span class="hljs-comment">// https://vuepress.vuejs.org/guide/getting-started.html#prerequisites</span>

yarn create vuepress-site
</code></pre>
<p><img src="https://images.viblo.asia/d3477cf6-4268-44c6-970d-c71f04c0b859.png" alt /></p>
<p>OK chạy thử phát xem nó dư nào nào</p>
<pre><code class="lang-js">yarn install
yarn run dev
</code></pre>
<p><img src="https://images.viblo.asia/264c0bfb-e9ac-4350-8702-a0ce16d2b5b6.png" alt />
<img src="https://images.viblo.asia/fd0c3afe-aa7f-4b3e-a000-0e15a45be45a.png" alt /></p>
<p>Kết quả luôn</p>
<p><img src="https://images.viblo.asia/2c7c6bf2-b3c4-4b63-ba43-c6b115c03028.png" alt /></p>
<p>Ra luôn, vâng ra luôn, rất nhanh ae ạ, nói chung là hịn hò</p>
<h2 id="heading-chon-theme">Chọn theme</h2>
<p>Mình là người yêu cái đẹp thích màu hồng, mình không hài lòng với cái theme mặc định này lắm, nghĩ bụng, phải làm sao để cho nó đẹp hơn thôi, chứ cứ thế này không được.</p>
<p>Mình là người Việt Nam, mà Việt Nam nói là làm, không chần chừ lên ngày <a target="_blank" href="https://github.com/vuepress/awesome-vuepress#community-themes">awesome-vuepress</a> để kiếm theme cho em nó. Sau nhiều hồi lựa chọn giữa các em với nhau, mình đã chọn được 1 em khá vừa lòng là em <a target="_blank" href="https://github.com/ttskch/vuepress-theme-blog-vuetify/">này </a>  - Và chính nó cũng thành blog của mình luôn :heart_eyes::heart_eyes::heart_eyes:</p>
<p><img src="https://images.viblo.asia/a1d38ad6-b393-44b6-9efb-18eda9bdbbe4.png" alt /></p>
<p>Chọn được rồi thì cài đặt thôi nhể :)
https://github.com/ttskch/vuepress-theme-blog-vuetify/</p>
<pre><code class="lang-js">$ yarn add --dev vuepress-theme-blog-vuetify

# or
$ npm install -D vuepress-theme-blog-vuetify
</code></pre>
<p>Sử dụng</p>
<pre><code class="lang-js"><span class="hljs-comment">// .vuepress/config.js</span>
<span class="hljs-built_in">module</span>.exports = {
  <span class="hljs-attr">theme</span>: <span class="hljs-string">'blog-vuetify'</span>,
  <span class="hljs-attr">themeConfig</span>: {
    <span class="hljs-comment">// ...</span>
  }
}
</code></pre>
<p>Đơn giản như đan rổ, làm ngay và luôn</p>
<h2 id="heading-kiem-tra-thanh-qua">Kiểm tra thành quả</h2>
<p>Sau vài hồi config các thứ, run <strong><em>localhost:8080</em></strong> và mình đã có được cái blog như hiện tại trên kia kìa :)</p>
<h2 id="heading-deploy-to-github-pages">Deploy to Github Pages</h2>
<p>Đến đây thì về cơ bản là đã xong rồi, làm thêm vài bước config nữa thôi</p>
<ol>
<li>Tạo repo github, để public nhé(public mới vào việc với github pages được)</li>
<li>Push code lên thôi</li>
<li>Setting gh-pages</li>
</ol>
<h2 id="heading-setup-auto-build">Setup Auto build</h2>
<p>Đến đây thì lại nảy sinh một vấn đề là, ơ thế code mình như này, github pages chơi thế éo nào được, nào là <strong>md</strong>, nào là <strong>package.js</strong>  :)</p>
<p>=&gt; Chúng ta cần phải build nó trước khi push lên github thôi. Mà vốn bản tính lười, chẳng nhẽ lần nào viết xong bài mới là lại build à, chán. Nghĩ ngay đến <strong>github actions</strong> =&gt; một công nghệ mà mới đây(chẳng qua lâu rồi mà mình không hay dùng) mới tích hợp vào github. Nhanh tay search ngay làm sao tự động build vuepress cho github pages. Ui xời, quả là trời không phụ lòng người, ra ngay được https://github.com/marketplace/actions/vuepress-deploy. Thôi là lại một nốt nhạc nữa :))</p>
<p>Test ngay cho nóng</p>
<p><img src="https://images.viblo.asia/a8958a1b-fd28-48b5-8268-809c5896beb7.png" alt /></p>
<p>Ngon luôn, bật ngay github pages check thôi, và thành quả đơn giản là https://hoangpn.com/</p>
<p><img src="https://images.viblo.asia/a1d38ad6-b393-44b6-9efb-18eda9bdbbe4.png" alt /></p>
<h2 id="heading-cac-van-de-khac">Các vấn đề khác</h2>
<p>Sơ sơ là thế, các bạn có thể nắm được và bắt tay xây dựng web được rồi. Tuy nhiên có 1 số lưu ý sau</p>
<h4 id="heading-doi-voi-viec-setup-token-cho-autodeploy">Đối với việc setup token cho auto_deploy</h4>
<pre><code class="lang-yml"><span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">to</span> <span class="hljs-string">GH</span> <span class="hljs-string">Pages</span>
<span class="hljs-attr">on:</span> [<span class="hljs-string">push</span>]
<span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">build-and-deploy:</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span>
      <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@master</span>

    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">and</span> <span class="hljs-string">Deploy</span>
      <span class="hljs-attr">uses:</span> <span class="hljs-string">jenkey2011/vuepress-deploy@dev</span>
      <span class="hljs-attr">env:</span>
        <span class="hljs-attr">ACCESS_TOKEN:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.ACCESS_TOKEN</span> <span class="hljs-string">}}</span>
        <span class="hljs-attr">TARGET_REPO:</span> <span class="hljs-string">hoangpn256/hoangpn.github.io</span>
        <span class="hljs-attr">TARGET_BRANCH:</span> <span class="hljs-string">gh_pages</span>
        <span class="hljs-attr">BUILD_SCRIPT:</span> <span class="hljs-string">yarn</span> <span class="hljs-string">&amp;&amp;</span> <span class="hljs-string">yarn</span> <span class="hljs-string">build</span>
        <span class="hljs-attr">BUILD_DIR:</span> <span class="hljs-string">src/.vuepress/dist/</span>
</code></pre>
<p>Để ý rằng có biến <code>secrets.ACCESS_TOKEN</code> -&gt; đây là access token của tài khoản github của bạn. Để lấy được nó hãy làm theo hướng dẫn sau <a target="_blank" href="https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-an-organization">đây</a> </p>
<h4 id="heading-doi-voi-viec-chia-thu-muc-viet-bai">Đối với việc chia thư mục viết bài</h4>
<p>Các bạn có thể tham khảo cấu trúc và config ở <a target="_blank" href="https://github.com/hoangpn256/hoangpn.github.io">repo của mình</a>.</p>
<p>Lưu ý các bài viết sắp xếp theo phần <code>date</code></p>
<p><img src="https://images.viblo.asia/d22940cc-aacf-4034-bd1a-d82877b11c60.png" alt /></p>
<h4 id="heading-doi-voi-van-de-setup-domain-cho-github-pages">Đối với vấn đề setup domain cho github pages</h4>
<p>Thêm file CNAME vào phần public trong source code</p>
<p><img src="https://images.viblo.asia/7f618ceb-598a-49d7-b044-977c9ca627c9.png" alt /></p>
<p>Thêm CNAME nếu bạn dùng sub-domain của mình cho github pages, hoặc A-record nếu bạn dùng chính domain của mình cho gh-pages</p>
<p>Có thể tham khảo thêm tại <a target="_blank" href="https://docs.github.com/en/github/working-with-github-pages/configuring-a-custom-domain-for-your-github-pages-site">đây</a></p>
<p><img src="https://images.viblo.asia/54d70f6c-4af4-4186-98d6-aacd189517e0.png" alt /></p>
<p><img src="https://images.viblo.asia/fec49e62-7627-49dc-8d78-2cc659ed6ea2.png" alt /></p>
<p>Trên đây là cấu hình của mình</p>
<h2 id="heading-ket">Kết</h2>
<p>Okay, cơ bản thế là xong rồi đấy, chốt lại 1 số vấn đề như sau</p>
<ol>
<li>Dùng vuepress để xây dựng blog</li>
<li>Dùng github pages để host đến chết :)</li>
<li>Dùng github actions để auto build</li>
<li>Một số cấu hình về github pages và config của dự án cần lưu ý(tham khảo repo của minh nhé - nhớ start nha :heart_eyes::heart_eyes: )</li>
</ol>
<p>Nêu có bất kì thắc mắc gì cần giải đáp, hoặc góp ý cho mình, thì hãy comment ở dưới nhé. Cảm ơn các bạn đã đọc bài viết đến đây.</p>
<p>Ủng hộ mình với bài viết gốc <a target="_blank" href="https://hoangpn.com/post/xay-dung-blog-voi-vuepress/">tại đây</a> </p>
<hr />
<p>@hoangpn - Better every day!</p>
]]></content:encoded></item><item><title><![CDATA[Thế quái nào data trong Vue lại là function ???]]></title><description><![CDATA[Chào các bạn, mình là Hoàng.
Hôm nay chúng ta sẽ cùng đi tìm hiểu vấn đề tại sao data trong Vue lại là function?
Mình đã rất thắc mắc điều này, vì đa phần thì chúng ta đều thấy dữ liệu không phải là một function, vậy tại sao trong Vue lại khác??
Dưới...]]></description><link>https://hoangpn.net/the-quai-nao-data-trong-vue-lai-la-function</link><guid isPermaLink="true">https://hoangpn.net/the-quai-nao-data-trong-vue-lai-la-function</guid><category><![CDATA[Vue.js]]></category><category><![CDATA[Technical writing ]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Tue, 15 Sep 2020 05:14:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1656393501010/DzgD6ykYe.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Chào các bạn, mình là Hoàng.
Hôm nay chúng ta sẽ cùng đi tìm hiểu vấn đề <strong>tại sao data trong Vue lại là function?</strong>
Mình đã rất thắc mắc điều này, vì đa phần thì chúng ta đều thấy dữ liệu không phải là một function, vậy tại sao trong Vue lại khác??
Dưới đây là một số giải thích mình cho là hợp lý cho đến thời điểm hiện tại, nếu các bạn có ý kiến gì thì cứ comment ở dưới cho mình biết nhé.
Cùng xét ví dụ sau để thấy sự khác biệt, và cùng đi sâu vào tìm hiểu xem lý do tại sao nhé</p>
<h1 id="heading-foreword">Foreword</h1>
<p>Đối với data khai báo là một function trả về object.</p>
<pre><code class="lang-js"><span class="hljs-comment">// Define a new component called button-counter</span>
Vue.component(<span class="hljs-string">'button-counter'</span>, {
  <span class="hljs-attr">data</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> {
      <span class="hljs-attr">count</span>: <span class="hljs-number">0</span>
    }
  },
  <span class="hljs-attr">template</span>: <span class="hljs-string">'&lt;button v-on:click="count++"&gt;You clicked me {{ count }} times.&lt;/button&gt;'</span>
})
</code></pre>
<pre><code class="lang-js">&lt;div id=<span class="hljs-string">"components-demo"</span>&gt;
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">button-counter</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">button-counter</span>&gt;</span></span>
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">button-counter</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">button-counter</span>&gt;</span></span>
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">button-counter</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">button-counter</span>&gt;</span></span>
&lt;/div&gt;
</code></pre>
<pre><code class="lang-js"><span class="hljs-keyword">new</span> Vue({ <span class="hljs-attr">el</span>: <span class="hljs-string">'#components-demo'</span> })
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656393199936/eoABzy3oB.gif" alt="9462a18d-1773-4277-bc55-1505816f271d.gif" /></p>
<p>Đối với data được khai báo là một <strong>object</strong></p>
<pre><code class="lang-js">data: {
  <span class="hljs-attr">count</span>: <span class="hljs-number">0</span>
}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656393154139/KBKzjLkbe.gif" alt="839e217b-ad19-46b9-9d3b-1b87eb0ffdc9.gif" /></p>
<p>Như chúng ta thấy thì sự khác nhau rõ ràng nhất là: Nếu khai báo data là object, thì <strong>data sẽ bị dùng chung bởi các instance của component</strong> đó. Đây là điều chúng ta trong phần lớn trường hợp là không hề mong muốn.</p>
<h1 id="heading-core-concepts">Core concepts</h1>
<ul>
<li>Vue làm việc với component, và component trong Vue phần lớn là static.</li>
<li>Một Vue component định nghĩa các methods, computed, ..., và nó được chia sẻ giữa tất cả các instance của component đó trong toàn bộ ứng dụng. Khi Vue cần sử dụng các methods đối với một instance cụ thể nào đó của component, nó sẽ <code>apply()</code>s chúng để lấy đối tượng thích hợp là <code>this</code></li>
</ul>
<h1 id="heading-reason-saving-memory">Reason: Saving Memory</h1>
<ul>
<li>Rất nhiều frameworks như angular 2, hoặc đôi khi là react sẽ tạo mỗi một instance của một component là một đối tượng riêng biệt.</li>
<li>Angular 2 là trường hợp tệ nhất, trong đó mọi component là instance của một class, điều này nghĩa là mọi thứ mà component có bên trong sẽ được khởi tạo lại cho mọi component. Tuy nhiên, với mỗi instance của các component, chúng ta chỉ thực sự cần <strong>data</strong> là <strong>riêng biệt</strong>, còn các methods, định nghĩa về computed, watcher, .. vẫn như cũ.</li>
<li>Vue làm được điều này bằng cách là khai báo data là một <strong>function trả về một object</strong>. Điều đó cho phép các component riêng biệt có các trạng thái riêng của nó (dữ liệu) mà không cần phải khởi tạo lại toàn bộ component. Các <strong>methods</strong>, định nghĩa về <strong>computed</strong>, ..., và các <strong>life cycle hook</strong> chỉ cần một lần tạo ra và lưu trữ, sau đó có thể sử dụng trên mọi instance của component đó.</li>
</ul>
<h1 id="heading-reason-static-components">Reason: Static Components</h1>
<ul>
<li>Vue 2 hoàn toàn bao hàm các ý tưởng về static component nhanh, nhẹ. Chúng không có các trạng thái dữ liệu bên trong và thường được hiển thị một lần hoặc chỉ thay đổi trạng thái bên ngoài. Điều này cho phép các chức năng của component là cưc kỳ nhanh.</li>
<li>Để tận dụng tính năng này bạn có thể sử dụng v-once để render thuộc tính một lần trong template, hoặc khai báo component hoạt động với <code>functional: true</code> trong định nghĩa của nó. </li>
</ul>
<h1 id="heading-potential-confusion">Potential Confusion</h1>
<ul>
<li>Những người mới sử dụng Vue thường thấy rằng chúng ta khai báo dữ liệu trong data, methods trong methods, thuộc tính tính toán trong computed, ..., tất cả chúng đều được truy cập trên this.thing thay vì sử dụng this.type.thing (ví dụ <code>this.myMethod()</code> thay vì <code>this.methods.myMethod()</code> )</li>
<li>Điều này, một lần nữa, là bởi vì các định nghĩa component chỉ đơn giản là định nghĩa mà thôi. Vue cần các định nghĩa về computed, methods, props, data, ... để có thể biết cách xây dựng component, nhưng để thuận tiện, nó ánh xạ chúng đên root của component thay vì các thuộc tính đó</li>
</ul>
<h1 id="heading-conclusion">Conclusion</h1>
<ul>
<li>Vue sử dụng khai báo data bằng function trả về một object thay vì một object.</li>
<li>Các methods, computed, watcher, props, life cycle hook chỉ một lần tạo ra và được lưu trữ lại để dùng chung cho mọi instance của computed.</li>
</ul>
<p>Rất mong góp ý của các bạn để có thể cải thiện chất lượng bài viết.</p>
<p>Best regards,</p>
<hr />
]]></content:encoded></item><item><title><![CDATA[Pair Programing  - Một trong những kỹ thuật phát triển phần mềm thượng thừa nên biết]]></title><description><![CDATA[Chào các bạn, mình là Hoàng đây, hôm này chúng ta quay trở lại với một chủ đề khá hay mà không phải ai cũng biết. Một chủ đề không liên quan tới code, nhưng lại giúp trình độ của các bạn phát triển. :hugs::hugs::hugs:
Không quá dài dòng nữa, đấy là p...]]></description><link>https://hoangpn.net/pair-programing-mot-trong-nhung-ky-thuat-phat-trien-phan-mem-thuong-thua-nen-biet</link><guid isPermaLink="true">https://hoangpn.net/pair-programing-mot-trong-nhung-ky-thuat-phat-trien-phan-mem-thuong-thua-nen-biet</guid><category><![CDATA[pair programming]]></category><category><![CDATA[technical]]></category><category><![CDATA[Technical writing ]]></category><dc:creator><![CDATA[Hoang Pham Ngoc]]></dc:creator><pubDate>Sun, 01 Mar 2020 16:21:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1656346854163/lfrEZ5oWL.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656346573977/RXl9fCirD.webp" alt="866eadd9-7410-4bfd-89a9-5648768b3ca9.webp" />
Chào các bạn, mình là Hoàng đây, hôm này chúng ta quay trở lại với một chủ đề khá hay mà không phải ai cũng biết. Một chủ đề không liên quan tới code, nhưng lại giúp trình độ của các bạn phát triển. :hugs::hugs::hugs:</p>
<p>Không quá dài dòng nữa, đấy là <strong>pair programing</strong></p>
<h2 id="heading-noi-dung">Nội dung</h2>
<p>Cùng theo tôi trả lời những câu hỏi sau, để bạn có thể hiểu được cái gì là <strong>pair programing</strong> nhé</p>
<ol>
<li>Pair programing là gì?</li>
<li>Pair programing có thể làm được những gì?</li>
<li>Cách thực hiện của pair programing</li>
<li>Khi nào thì dùng, và một số điểm lưu ý</li>
<li>Kết luận, ý kiến của bản thân mình.</li>
</ol>
<hr />
<h2 id="heading-pair-programing-la-gi">Pair programing là gì ?</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656346613096/CKsaB541d.webp" alt="0b6456fc-b562-4e33-961c-eebc0bcda35f.webp" /></p>
<p>Pair programing hay còn được gọi là pairing, programing in pair về cơ bản là một kỹ thuật phát triển phần mềm. Thường được thấy là việc 2 cá nhân cùng làm 1 task trên cùng một máy tính.</p>
<p>Cũng từ đó có 2 vai trò tương ứng là <strong>Driver</strong> và <strong>Navigator</strong>, Driver có trách nhiệm viết code, trong khi công việc của navigator là theo dõi driver, đưa ra lời khuyên và cố gắng hiểu và truyền đạt được bức tranh tổng thể của task đó cho driver. Hai vai trò này <strong>có thể được hoán đổi cho nhau</strong> trong khoảng thời gian thường xuyên.</p>
<h2 id="heading-pair-programing-lam-duoc-gi-ich-loi">Pair programing làm được gì? (ích lợi)</h2>
<p>Theo cá nhân tôi, lợi ích được chia cho 2 đối tượng là <strong>Con người</strong> và <strong>Dự án</strong></p>
<h3 id="heading-con-nguoi">Con người</h3>
<ul>
<li><strong>Cải thiện vấn đề teamwork</strong>. Khi pair code, chúng ta <strong>nên</strong>, hay nói nặng nề hơn là <strong>cần trao đổi với nhau</strong>. Việc này thực sự giúp cho các member hiểu nhau hơn, từ đó vấn đề teamwork cũng được nâng cao.</li>
<li><strong>Trau dỗi kĩ năng của mỗi người tốt hơn</strong>. Khi pair code, chúng ta sẽ có được góc nhìn khác nhau từ 2 người, cũng như các kiến thức, kĩ thuật khác nhau để trao đổi. Đặc biết là nếu bạn được một người có trình độ cao hơn pair code cùng. =&gt; <strong>Kĩ năng của cả team cùng được phát triển lên.</strong></li>
<li>Độ <strong>tập trung</strong>, sự <strong>tự tin</strong> và <strong>độ hài lòng</strong> của các thành viên được cải thiện rất nhiều. Chúng ta có thể thấy rằng, nếu có người pair code cùng thì chúng ta sẽ ít xao nhãng hơn, ít check fb, instagram hơn , .. vì chúng ta không muốn làm <strong><em>người đồng hành</em></strong> của mình thất vọng do đó độ tập trung chắc chắn sẽ cải thiện rõ ràng. Và việc được code cùng với người khác như thế, có thể làm cho bạn thấy thú vị hơn, vui vẻ hơn =&gt; giúp cải thiện độ hài lòng của mình tốt hơn. Và bạn sẽ dần dần tự tin hơn vào bản thân cũng như kiến thức của mình có.</li>
<li>Tăng cường <strong>khả năng giải quyết vấn đề</strong>. Bạn đã bao giờ nghe đến kĩ thuật <strong>Rubber Ducking</strong> - giải thích cho con vịt hiểu code của mình chưa. Khi pair code, chúng ta cần giải thích code của mình cho người đồng hành hiểu được. Việc này cũng mang lại kết quả tưởng tự như <strong>Rubber Ducking</strong> =&gt; giúp bạn hiểu rõ và có thể sẽ ra được cách giải quyết vấn đề mà chính bạn không ngờ tới đấy :)</li>
</ul>
<h3 id="heading-du-an">Dự án</h3>
<ul>
<li>Chất lượng <strong>code của dự án được nâng cao hơn</strong>( code ít bug hơn, unit test phủ kín hơn, code clean hơn). Vì sao lại thế? Đơn giản thôi, 2 cái đầu thì sẽ thường hơn 1 cái đầu. Khi pair code với nhau, chúng ta có thể dễ dàng phát hiện ra những sai sót của nhau, hay đưa ra cách giải quyết vấn đề tốt hơn, ...</li>
<li><strong>Thời gian giải quyết công việc tốt hơn</strong>. Hơi lạ nhỉ, thường thì mỗi người 1 việc sẽ nhanh hơn 2 người 1 việc chứ nhỉ. Nhưng trên thực tế cho thấy, đối với pair programing giúp giải quyết công việc nhanh hơn. Đối với một task khó, thì việc có 2 người cùng suy nghĩ sẽ nhanh hơn rất nhiều đối với một người.</li>
<li>Khi pair code, chúng ta sẽ <strong>hiểu dự án kĩ càng hơn</strong>, việc này rất quan trọng, nó giúp cho dự án sẽ <strong>phát triển nhanh hơn đáng kể đấy</strong>.</li>
</ul>
<p>=&gt; Từ những điều trên, chúng ta có thể kết luận ở đây rằng, pair programing giúp cho dự án <strong>hoạt động tốt hơn, tiết kiệm thời gian, chi phí</strong>.</p>
<h2 id="heading-cach-thuc-hien-cua-pair-programing">Cách thực hiện của pair programing?</h2>
<p>Chúng ta có thể phân chia làm 2 loại là <strong>Trình độ</strong> và <strong>Kiểu</strong></p>
<h3 id="heading-trinh-do">Trình độ</h3>
<ol>
<li><p><strong>Người có kinh nghiệm cao hơn - người có kinh nghiệm ít hơn</strong> (có thể hiểu như là senior - junior, junior - fresher, ...).
Đây dường như là sự kết hợp tuyệt với để tăng tốc độ học tập cho các bạn có level thấp hơn. Cũng là cách tốt để chia sẻ kinh nghiệm trong toàn team, <strong>nhưng hãy để ý đến sự cân bằng</strong>, Ví dụ pair giữa junior-senior, nếu không tốt thì junior chỉ là <strong>người xem</strong> cho đến hết task :) Chẳng tiếp thu được gì cả. Hay senior có thể cảm thấy khó chịu khi tốc độ của mình bị chậm đi khi cứ phải giải thích với junior chẳng hạn.</p>
</li>
<li><p><strong>Người có trình độ level tương đương nhau</strong> (có thể hiểu là junior - junior, ...). Sự kết hơp này cũng cải thiện đáng kể năng suất và chất lương. Vì trình độ tương đương nhau, nhưng có cái người này biết, người kia không biết, ....</p>
</li>
</ol>
<h3 id="heading-kieu">Kiểu</h3>
<p><strong>Driver-navigator</strong> là kiểu thường được thấy nhất, cả 2 đổi vai trò cho nhau =&gt; để output là một kết quả tốt nhất. Nhưng cũng gặp phải một số khó khăn như sau</p>
<ul>
<li><strong>Driver</strong> tập trung code, và <strong>navigator</strong> không muốn làm phiền</li>
<li>Hoặc khi driver bảo <strong><em>"đợi tí nhé"</em></strong> =&gt; Nagivator sẽ rảnh và khả năng cao là cũng bị xao nhãng bởi việc check fb, instagram, ....</li>
</ul>
<p>Nói chung, để pair programing thành công được, thì mấu chốt là sự <strong>tôn trọng nhau</strong>, và <strong>giao tiếp</strong> của 2 người. Đáng tiếc là điều này thường khó thực hiện đối với các cặp mới.</p>
<p>Từ đó sinh ra một số kĩ thuật khác mà bản thân tôi cho rằng nên bắt đầu từ đó đối với các cặp mới như sau</p>
<p><strong>Strong &amp; Traditional Pairing Techniques</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656346642890/xWMA2zYg_.webp" alt="4226ca44-0f3b-4ada-a2aa-961a80240d38.webp" /></p>
<p>Kim chỉ nam của kỹ thuật này là <strong>"Driver sẽ không làm gì cho đến khi có sự hướng dẫn của navigator"</strong></p>
<p>Bất cứ khi nào driver yêu cầu navigator giải thích về ý tưởng, thì navigator cần phải giải thích rõ ràng về việc đó, và sau đó thì đơn giản là quay về vị trí quan sát.</p>
<p><strong>Ping-Pong Pairing</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656346664106/N9BbqHYIX.webp" alt="fc2b39d1-2eba-4d62-b61d-43645b53f645.webp" /></p>
<p>Kỹ thuật này thường được sử dụng khi xử lý unit test. Bắt đầu bằng việc người đầu tiên viết 1 test fail, và chuyển giao nó cho người thứ 2, người thứ 2 sẽ phải hoàn thành test fail đó, đồng thời viết thêm 1 test fail khác và chuyển giao lại cho nguời thứ 1. Cứ lặp lại cho đến khi coverage được phủ hết.</p>
<h2 id="heading-khi-nao-thi-dung-va-mot-so-diem-luu-y">Khi nào thì dùng, và một số điểm lưu ý</h2>
<h3 id="heading-khi-nao-thi-dung">Khi nào thì dùng?</h3>
<p>Theo bản thân tôi thấy thì chúng ta sẽ dùng pair programing trong những trường hợp sau:</p>
<ul>
<li>Khi có 1 task phực tạp, hoặc một PR quá lớn.</li>
<li>Khi coaching</li>
<li>Khi fixing</li>
<li>Hoặc đơn giản là muốn nâng cao trình độ các member trong team lên.</li>
</ul>
<p>Túm đoạn này lại, <strong>hãy tìm thời điểm thích hợp để sử dụng</strong>, bắt đầu bằng <strong>thời điểm gợi ý như trên</strong>. Khi bạn đã có kinh nghiệm về vấn đề này rồi, thì đừng ngần ngại đề xuất sử dụng nó khi cần thiết nhé.</p>
<h3 id="heading-nhung-luu-y">Những lưu ý?</h3>
<ul>
<li>Công bằng, hãy nhớ vai trò của 2 người là như nhau.</li>
<li>Hạ cái tôi xuống, tôn trọng nhau và tiếp thu ý kiến của đối phương.</li>
<li>Hãy tin tưởng <strong>bạn đồng hành</strong> của mình.</li>
<li>Đừng ép buộc</li>
<li>Cho đối tác của bạn có cơ hội để "lái" vào đúng thời điểm</li>
<li>Khuyến khích việc giao tiếp cởi mở.</li>
<li>Đừng bỏ qua những khoảng nghỉ ngơi</li>
<li>Xác định những sai lầm của bạn</li>
<li>Nhận lỗi trước</li>
<li>Bình tĩnh lại, đừng vội vàng</li>
</ul>
<p><strong>Trong khi paring</strong>, chúng ta có một số <strong>điểm</strong> sau cần chú ý</p>
<ul>
<li>Để tôi code cho</li>
<li>Bạn có thể giúp tôi ?</li>
<li>Cùng quẩy thôi</li>
<li>Tôi định làm theo hướng như này, bạn nghĩ sao về nó ?</li>
<li>Bạn có hướng giải quyết nào không ?</li>
<li>Đoạn code này chạy thế nào đấy, viết unit test nhé.</li>
<li>Tôi không hiểu ý bạn lắm, bạn có thể giải thích rõ hơn không ?</li>
<li>Heeyyy, chúng ta có quên điều gì không nhỉ ?</li>
</ul>
<p><strong>Take a break</strong></p>
<ul>
<li>Chúng ta nghỉ chút nhỉ</li>
<li>Hey, tôi nghĩ nên đổi vai trò chút</li>
<li>Yoo, ra làm cốc cafe đi.</li>
</ul>
<h2 id="heading-ket-luan-y-kien-cua-ban-than-minh">Kết luận, ý kiến của bản thân mình.</h2>
<p>Trên thực tế, pairing đã mang lại rất nhiều lợi ích. Vì thế lợi ích của paring là không thể phủ nhận được.</p>
<p>Nhưng, liệu rằng <strong>pair programing</strong> có phù hợp với tất cả mọi người không? Thực sự câu trả lời không đơn giản cho vấn đề này. Tất cả chúng ta khác nhau, vì vậy chắc chắn sẽ có những kết quả khác nhau., Pair programing rất hiệu quả với một số người, nhưng một số người thì không.</p>
<p>Hãy nhớ rằng, pair programing không phù hợp với mọi dự án</p>
<p>Theo quan điểm của tôi thì bản thân phương pháp nào cũng vậy, không có xấu tốt gì cả, chỉ đơn giản là nó có phù hợp trong thời điểm đó hay không thôi. Pair programing cũng vậy. Nhưng nên nhớ rằng, <strong>nếu không thử, thì sao biết được đúng không</strong> ?</p>
<hr />
<p>Cuối cùng, cảm ơn bạn đã đọc đến cuối. Bất kỳ ý kiển gì hãy comment ở dưới nhé. :point_down::point_down::point_down:</p>
<p>Hãy ủng hộ mình bằng upvote. để mình có thể cải thiện và đưa ra những bài mới tốt hơn nhé.</p>
<hr />
<p><a target="_blank" href="https://hoangpn.com/">@hoangpn</a> - Better every day!</p>
]]></content:encoded></item></channel></rss>