Sinh viên đang khiến mình thụt lùi với AI

Để nâng cao năng suất làm việc của lập trình viên thì có nhiều phương án, phương án dùng AI sinh code chỉ là một, nhưng là phương án được marketing ồn ào nhất. Cũng phải thôi, để huấn luyện các mô hình AI đó thì tốn rất nhiều tiền nên các cty chủ quản phải marketing rầm rộ, dùng tới cả chiêu bài hù dọa để cốt bán được hàng.

Vấn đề là những bài marketing làm lệch lạc phương hướng của các sinh viên rất nhiều. Thay vì tự rèn luyện về thuật toán, nghệ thuật của các ngôn ngữ, các good practices, các bí ẩn sâu xa của công nghệ để nâng trình độ của mình vượt lên AI, để có thể tự tin review và bác bỏ code do AI sinh ra, thì giờ nhiều bạn SV lại thấy tự hào vì "AI làm hết cho mình", tự hào vì dành một phần lớn trong số tiền "trợ cấp" hàng tháng để "cúng" cho AI.

Mùa Google Summer of Code năm nay, mình đọc một số proposal của các SV đăng ký dự thi, và gần 100% có giọng văn, cách trình bày của AI, nhưng phần lớn trong số đó bị loại vì lạc đề và dựa vào kiến thức cũ kĩ ko còn đúng với thực tế. Ví dụ có một đề bài là nâng cấp một bộ code cũ của dự án nọ từ Vue 2 lên Vue 3. Sinh viên ấy viết proposal để đề xuất dùng Options API thay vì Compositon API, với một trong những lý do là nếu dùng Composition API thì phải dùng công cụ Volar. Cái không thực tế ở đây là ngoài Volar thì làm gì còn công cụ LSP server cho Vue nào tốt hơn nó nữa. Các sinh viên đó thừa nhận là dùng AI để làm nhưng coi những lời của AI như thần, ko bao giờ đặt nghi vấn, vặn vẹo lại.

Vừa nãy có nói, dùng AI tạo sinh chỉ là một phương án. Phương án còn lại là gì? Là tập dùng các công cụ dòng lệnh, và các đồ chơi trên HĐH Linux (vế này ko cần nghe nếu nghề của bạn là lập trình ứng dụng Windows, iOS, MacOS). Trong phần lớn các trường hợp có dùng AI để phụ viết code thì mình suy nghĩ ra giải pháp nhanh hơn AI (và nhìn AI "thinking..." mà sốt cả ruột), nhưng mình lại gõ phím rất chậm, nên sẽ làm chậm hơn AI nếu code đó phải viết ở nhiều nơi nhiều chỗ. Tuy nhiên có nhiều trường hợp, sử dụng thành thạo các công cụ dòng lệnh thì mình đỡ phải viết code nhiều (cứ phím tắt, autocomplete mà nện) thì cuối cùng lại làm nhanh hơn AI (nếu tính cả thời gian viết prompt nhiều lần để lái AI cho làm đúng ý mình).

...


Đồ chơi để thấy GraphQL đỡ phiền

GraphQL là một dạng thiết kế HTTP API được dùng rộng rãi. Mặt lợi của nó thì không cần bàn. Tuy nhiên mình và có thể các bạn cũng thấy hơi phiền vì nó dài dòng. Bài này sẽ giới thiệu một số phương tiện phần mềm để làm việc với nó thoải mái hơn, ở phía client.

Python: Cách dùng Pydantic để kiểm tra hợp lệ

Lấy ví dụ API của BirdWeather. Đây là kho dữ liệu của các trạm thu thập tiếng chim hót, phục vụ nghiên cứu nhận dạng chim từ tiếng hót. Ta sẽ gọi vào truy vấn stations để lấy danh sách các trạm. Một response mẫu sẽ trông như sau:

...

Cấu hình autocomplete cho Nushell

Bạn đã thích thú với Nushell, đã cài vào nhưng không thấy tính năng auto-complete? Đừng vội buồn. Đó là vì các file cài đặt Nushell hiện tại không kèm sẵn các script auto-complete. Bạn sẽ phải làm thêm tí việc tay chân để cài các script này vào.

Mặc dù yêu thích Nushell, mình phải thừa nhận rằng mức độ hỗ trợ auto-complete của Nushell chưa dồi dào bằng Fish. Nushell được thiết kế để nhận dữ liệu auto-complete từ cả các script chuyên dụng viết bằng Nu và từ cả phần mềm khác.

1. Nguồn từ phần mềm khác

Từ trong Nushell, gõ:

...

Grey background issue with Helix inside Byobu

I often work on a remote Linux box and like to have Byobu running so that I have tab view and status bar. But somedays in mid 2024, somethings start to break when I open Helix inside Byobu and get this annoying gray background every where:

Grey background

The root issue is that, Byobu runs Tmux with a configuration, and that configuration makes tmux disable some features which is needed to render Helix theme correctly. The key is the TERM environment variable. No matter which terminal emulator we use, after running Byobu, the TERM is set to screen-256color.

...

Triển khai tự động ứng dụng web Python

Gần đây nghe sự cố máy chủ DeepSeek bị lộ dữ liệu do để mở cổng database toang hoác, làm tôi nhớ đến cách triển khai ứng dụng web của mình, trong đó mình đóng cổng database luôn, chỉ cho truy cập qua Unix domain socket (dạng file), và cũng không cần tạo password, không cần nhớ, không cần giấu password. Thủ thuật này đã được nhắc đến trong một bài blog khác bằng tiếng Anh, nay dịch ra cho anh em tham khảo. Bài viết đó nói về một chủ đề rộng hơn là "cách triển khai ứng dụng web Python một cách tự động".

Gần đây tôi thấy một câu hỏi từ một đồng nghiệp Python, làm thế nào để triển khai ứng dụng Django mà không cần phải SSH thủ công vào máy chủ và chạy các lệnh. Phong cách này là "single server deployment". triển khai trên một máy chủ duy nhất, nơi bạn đặt tất cả các thành phần, từ mã ứng dụng, cơ sở dữ liệu, đến các tệp tĩnh, tệp media, trên cùng một máy chủ. Không có Docker tham gia. Với kiểu triển khai này, chúng ta sẽ cần một cách nào đó để cung cấp phiên bản mới của ứng dụng mỗi khi mã mới được đẩy lên nhánh "release" của kho lưu trữ Git.

Tại sao cần tự động hóa? Vì làm đi làm lại những việc này rất nhàm chán:

  • SSH vào máy chủ, cd vào thư mục cài đặt.
...

Thử tài viết code Rust của DeepSeek

Hôm nay mình thử tài DeepSeek về một số ngôn ngữ lập trình mới. Đề bài là: Hãy cho một ví dụ để cho thấy comptime trong ngôn ngữ Zig đem lại trải nghiệm lập trình tốt hơn macro của Rust.

Câu trả lời đầu tiên của DeepSeek bị mình bác bỏ (code trong hình 1), vì nó cho rằng trong Zig có thể dùng comptime để tạo cấu trúc generics trong khi Rust phải dùng macro.

DS-generics

...

Khám phá Nushell

Ai dùng Linux thì cũng phải đụng vào shell, với hình thức đơn giản nhất là chạy một chương trình / lệnh nào đó từ Terminal. Khi làm việc với server không có giao diện đồ họa, mọi tác vụ quản lý phải thực hiện qua dòng lệnh thì cũng là lúc ta sử dụng shell ở mức độ nâng cao hơn. Ta sẽ cần viết một lệnh dài để thực hiện nhiều việc theo chuỗi, hoặc viết thành một file script với điếu kiện if else, với vòng lặp để thi hành nhiều tác vụ phức tạp. Tuy nhiên, thật tình mà nói thì các phần mềm shell phổ biến trên Linux như Bash, Zsh tôi đều không thích cú pháp của chúng, nên nếu cần viết lệnh dài, viết ra file script thì tôi sẽ chuyển qua viết script Python. Mọi việc thường là thế cho đến khi tôi bắt gặp Nushell...

Sau khi chạy thử vài dòng lệnh theo bài giới thiệu nhanh, tôi thấy Nu quyến rũ với tư tưởng khá mới mẻ, đó là thiết kế dữ liệu chảy qua các ống dẫn (pipe) là dữ liệu có cấu trúc, có các field, chứ không đơn giản là văn bản text như các shell truyền thống. Để hình dung được ý tưởng này, xét ví dụ sau, là chạy lệnh ls trong Nu:

❯ ls
╭───┬────────────────┬─────────┬─────────┬────────────────╮
...

So sánh hệ thống kiểu của Python và TypeScript

Với hơn một nửa công việc hàng ngày là làm web, Python và JavaScript là hai ngôn ngữ mình dùng nhiều. Đây vốn là hai ngôn ngữ "kiểu động" (dynamic type), nhưng mình vẫn tận dụng hệ thống kiểu (type system) của chúng để viết như với một ngôn ngữ "kiểu tĩnh" (static type). Sau một thời gian thì mình rút ra được một số kinh nghiệm để làm việc với hai hệ này.

Thật ra, ngôn ngữ JavaScript không có ký hiệu kiểu, nên nói chính xác hơn là mình đang dùng TypeScript chứ không phải JavaScript. Trước hết, người đã làm quen với JavaScript mà được giới thiệu về TypeScript thì sẽ bật lên một câu hỏi, tại sao chúng là ngôn ngữ dynamic type thì lại mất công viết như static type làm gì. Đó là vì những ích lợi sau:

  • Giúp các công cụ kiểm tra (static analysis) như MyPy, tsc hiểu được code mình, để phát hiện được bug tiềm tàng trong những trường hợp ngách mà mình chưa test.
  • Giúp các trình soạn thảo (code editor, IDE) hiểu được biến đang có kiểu gì, để đưa ra gợi ý autocomplete đúng hơn.
...

Effectly copy part of code file from remote machine

Let's say you have a source code file on a remote machine (accessed via SSH) and you want to copy a portion of the content to your local machine. There are many ways to do this, but I want to present an effective way, as it will take advantage of Helix's very convenient block selection feature.

For example, in the following image, the window on the left is accessing a remote machine, via SSH, on which I am opening a source code file using Helix. The window on the right is an editor, e.g. Geany, of your local machine. I want to copy the source of the enable_mqtt_on_gsm_modem function to Geany. In the left window, we should use a slightly modern Terminal application, e.g. Kitty, WezTerm, Alacritty because of a feature that I will explain later.

Figure 1

On the source file, we'll move the cursor to any line inside the enable_mqtt_on_gsm_modem body, then press m. Helix will bring up a menu of m command, let's press a to select "Select around object". Helix then shows the menu of m a.

...