<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: nghiepvuvietnam</title>
    <description>The latest articles on DEV Community by nghiepvuvietnam (@nghiepvuvietnam).</description>
    <link>https://dev.to/nghiepvuvietnam</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4245846%2F23d067f4-45d3-4cce-85dd-9fb46d4f8c9b.png</url>
      <title>DEV Community: nghiepvuvietnam</title>
      <link>https://dev.to/nghiepvuvietnam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nghiepvuvietnam"/>
    <language>en</language>
    <item>
      <title>Quy đổi điểm TOEFL ITP sang Khung năng lực ngoại ngữ 6 bậc bằng Python</title>
      <dc:creator>nghiepvuvietnam</dc:creator>
      <pubDate>Sun, 15 Nov 2026 13:02:40 +0000</pubDate>
      <link>https://dev.to/nghiepvuvietnam/quy-doi-diem-toefl-itp-sang-khung-nang-luc-ngoai-ngu-6-bac-bang-python-50od</link>
      <guid>https://dev.to/nghiepvuvietnam/quy-doi-diem-toefl-itp-sang-khung-nang-luc-ngoai-ngu-6-bac-bang-python-50od</guid>
      <description>&lt;p&gt;Khi làm hồ sơ tốt nghiệp hay thăng hạng, mình thường phải tra bảng quy đổi điểm TOEFL ITP sang bậc của Khung năng lực ngoại ngữ 6 bậc dùng cho Việt Nam. Tra tay thì dễ nhầm ở các mốc biên (499 hay 500?), nên mình viết một hàm Python nhỏ để làm việc này, kèm một hàm kiểm tra hạn dùng của kết quả. Bài dành cho người mới, chỉ cần biết hàm và vòng lặp.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bảng quy đổi
&lt;/h2&gt;

&lt;p&gt;Mình dùng bảng quy đổi nêu trên một trang giới thiệu khóa luyện thi TOEFL ITP:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Điểm TOEFL ITP&lt;/th&gt;
&lt;th&gt;Bậc&lt;/th&gt;
&lt;th&gt;CEFR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;450 đến 499&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;B1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500 đến 549&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;B2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;550 đến 626&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;C1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;627 đến 677&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;C2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Điểm dưới 450 tương ứng các bậc thấp hơn. Quy định có thể thay đổi, nên hãy đối chiếu văn bản hiện hành của nơi nhận hồ sơ trước khi dùng.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hàm quy đổi
&lt;/h2&gt;

&lt;p&gt;Ý tưởng: lưu bảng thành danh sách các bộ &lt;code&gt;(thấp, cao, bậc, mức)&lt;/code&gt;, rồi duyệt để tìm khoảng chứa điểm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;

&lt;span class="no"&gt;BANG_QUY_DOI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;450&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;499&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"B1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;549&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"B2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;550&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;626&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;677&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;quy_doi_toefl_itp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="s2"&gt;"""Trả về (bậc, mức CEFR) hoặc None nếu thấp hơn Bậc 3."""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;diem&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;677&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Điểm TOEFL ITP nằm ngoài khoảng 0-677"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;thap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bac&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;muc&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;BANG_QUY_DOI&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;thap&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;diem&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;cao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bac&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;muc&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thử các mốc biên:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;430&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;499&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;549&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;550&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;626&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;677&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;quy_doi_toefl_itp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 430 None&lt;/span&gt;
&lt;span class="c1"&gt;# 450 (3, 'B1')&lt;/span&gt;
&lt;span class="c1"&gt;# 499 (3, 'B1')&lt;/span&gt;
&lt;span class="c1"&gt;# 500 (4, 'B2')&lt;/span&gt;
&lt;span class="c1"&gt;# 549 (4, 'B2')&lt;/span&gt;
&lt;span class="c1"&gt;# 550 (5, 'C1')&lt;/span&gt;
&lt;span class="c1"&gt;# 626 (5, 'C1')&lt;/span&gt;
&lt;span class="c1"&gt;# 627 (6, 'C2')&lt;/span&gt;
&lt;span class="c1"&gt;# 677 (6, 'C2')&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lưu ý: với số nguyên thì các khoảng liền nhau, nên không có điểm nào rơi vào khoảng trống giữa hai mức.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kiểm tra hạn dùng
&lt;/h2&gt;

&lt;p&gt;Chứng chỉ điểm thường không ghi ngày hết hạn, nhưng nhiều đơn vị tiếp nhận chỉ nhận kết quả trong khoảng 2 năm kể từ ngày thi. Số năm này do nơi nhận hồ sơ quy định, nên mình để thành tham số:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;con_han&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ngay_thi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hom_nay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;so_nam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;han&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ngay_thi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ngay_thi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;so_nam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# ngày 29/2 của năm nhuận&lt;/span&gt;
        &lt;span class="n"&gt;han&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ngay_thi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;so_nam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hom_nay&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;han&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;con_han&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# True&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;con_han&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Đoạn &lt;code&gt;try/except&lt;/code&gt; xử lý trường hợp thi vào 29/2: cộng năm trực tiếp sẽ báo lỗi nếu năm đích không nhuận.&lt;/p&gt;

&lt;h2&gt;
  
  
  Có thể mở rộng
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Đọc bảng từ file CSV để thay đổi khi quy định đổi, không phải sửa mã.&lt;/li&gt;
&lt;li&gt;Thêm quy đổi cho thang điểm khác và so sánh với yêu cầu bậc của từng hồ sơ.&lt;/li&gt;
&lt;li&gt;Viết vài test bằng &lt;code&gt;pytest&lt;/code&gt; cho các mốc biên ở trên.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu bạn có cách làm gọn hơn, mình rất muốn đọc bình luận.&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>education</category>
    </item>
    <item>
      <title>Giới thiệu: ghi chú về nghiệp vụ, chứng chỉ và cách học</title>
      <dc:creator>nghiepvuvietnam</dc:creator>
      <pubDate>Sun, 15 Nov 2026 11:45:45 +0000</pubDate>
      <link>https://dev.to/nghiepvuvietnam/gioi-thieu-ghi-chu-ve-nghiep-vu-chung-chi-va-cach-hoc-162h</link>
      <guid>https://dev.to/nghiepvuvietnam/gioi-thieu-ghi-chu-ve-nghiep-vu-chung-chi-va-cach-hoc-162h</guid>
      <description>&lt;p&gt;Chào mọi người, đây là bài đầu tiên của mình trên DEV. Mình đang ghi chú lại những gì học được về nghiệp vụ, chứng chỉ nghề và cách chuẩn bị hồ sơ, vì thông tin này thường nằm rải rác và dễ quên.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mình sẽ viết gì
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tóm tắt nội dung các khóa bồi dưỡng và chương trình đào tạo.&lt;/li&gt;
&lt;li&gt;Những điểm cần kiểm tra trước khi đăng ký: văn bản áp dụng, thời hạn, đơn vị cấp.&lt;/li&gt;
&lt;li&gt;Cách sắp xếp việc học để không bị rời rạc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cách mình làm
&lt;/h2&gt;

&lt;p&gt;Mỗi chủ đề là một ghi chú ngắn, viết bằng lời của mình và ghi rõ nguồn tham khảo. Quy định có thể thay đổi, nên bài viết chỉ mang tính tham khảo, bạn nên hỏi lại đơn vị nhận hồ sơ.&lt;/p&gt;

&lt;p&gt;Nếu bạn cũng đang học hoặc chuẩn bị hồ sơ và có kinh nghiệm hay, mình rất muốn đọc bình luận của bạn.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>career</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
