Gần đây tôi có đọc một cuốn sách có tên là Thinking Fast and Slow (Tư duy nhanh và chậm) của tác giả Daniel Kahneman người Do Thái đã từng đoạt giải Nobel kinh tế học năm 2002. Dưới đây tôi sẽ đúc rút một số kiến thức học được từ cuốn sách mong rằng có thể giúp các lập trình viên có thể nâng hiệu năng lên một tầm cao mới.

Hai hệ thống

Đầu tiên đoạn code sau đây sẽ output ra kết quả là bao nhiêu?

$x = 2;
$y = 2; 
print $x + $y;

Nhìn vào đoạn code sau tôi tin rằng bất cứ lập trình viên PHP nào đều có thể trả lời ngay lập tức là kết quả là 4 mà không đồng tử mắt không giãn nở ra và nhịp đập của trái tim cũng không tăng nhanh hơn, điều đó cũng có nghĩa là khi này chúng ta không cần phải nỗ lực suy nghĩ.

Bây giờ thay vì nhìn vào đoạn code xin mời hãy liếc mắt nhìn vào một bức ảnh sau trên giao diện người dùng sau.

Angry

Kinh nghiệm của bạn khi nhìn vào khuôn mặt của người phụ nữ ở hình trên kết hợp nhuần nhuyễn giữa quan sát thông thường và tư duy trực giác. Vừa thoạt nhìn bạn đã nhận ra người phụ nữ này có mái tóc vàng, đồng thời biết cô ta đang giận dữ, bạn cảm nhận được người phụ nữ này sắp sửa "phun ra" những lời độc địa với chất giọng "lảnh lót" xuyên thấu màng nhĩ người nghe. Dự cảm về hành động tiếp theo của người phụ nữ này xuất hiện trong trí óc bạn một cách tự động và chẳng tốn chút công sức nào.

Hai ví dụ trên là hai ví dụ điển hình về cơ chế tư duy nhanh cơ chế này được hai nhà tâm lý học Keith StanovichRichard West đề xuất và đưa chúng vào hệ thống tư duy được gọi là "Hệ thống 1".

Tiếp theo, bạn hãy cho biết output của đoạn code sau là bao nhiêu?

function ktsnt($n) {
    for ($x = 2; $x < $n; $x++) {
        if( $n % $x ==0) {
            return 1;
        }
    }

    return 2;
}

$a = ktsnt(33);
print $a;

Tình huống này đã đến lúc có lẽ đồng tử mắt của bạn đã giãn nở ra và nhịp tim đã đập nhanh hơn đó là biểu hiện của việc bạn đang nỗ lực suy nghĩ để tìm ra câu trả lời. Trước tiên phải suy nghĩ xem nội dung đoạn code trên đang viết về cái gì, output của nó là gì, tham số là gì, với tham số này thì kết quả output sẽ là gì...

Bạn vừa trải qua quá trình tư duy chậm khi đi tuần tự qua các công đoạn như trên. Trường hợp này bạn phải nỗ lực rất nhiều và huy động rất nhiều bộ nhớ để xử lý và tìm ra đáp án. Quá trình nỗ lực tư duy này cũng được hai nhà tâm lý học StanovichRichard West đề xuất và đưa chúng vào hệ thống tư duy được gọi là "Hệ thống 2".

Vậy "Hệ thống 1", "Hệ thống 2" là gì? Chúng ta có định nghĩa như sau:

Hệ thống 1: hoặt động theo cơ chế tự động, mau lẹ, với rất ít và hầu như không cần cố gắng và không tự động kiểm soát.

Hệ thống 2: tập trung sự chú ý đối với những hoặt động tư duy đòi hỏi sự nỗ lực, bao gồm những phép tính phức tạp. Cơ chế hoặt động của Hệ thống 2 thường gắn với những kinh nghiệm chủ quan, sự lựa chọn và tập trung của chủ thể.

Ảo giác

Nói tới từ "Ảo giác" thường chúng ta hay nghĩ tới việc các giác quan bị đánh lừa bởi các  hình ảnh, hiện tượng thời tiết trên không gian. Vấn đề này cũng rất hay gặp trong lập trình di động. Các hình ảnh cùng kích thước trên giao diện chỉ cần thêm nhưng phụ kiện khác nhau vào thì mặt chúng ta rất dễ bị nhầm lẫn là kích thước đã thay đổi nhưng thực tế thì hoàn toàn không.

Ví dụ hãy nhìn kỹ hình ảnh sau đây:

3 Arrow

Hình ảnh này không có gì đặc biệt: Ba đoạn thẳng có độ dài khác nhau, có gắn thêm "vây", chỉ về hai phía khác nhau. Đoạn thẳng bên dưới rõ ràng dài hơn đoạn thẳng bên trên. Đó là tất cả những gì chúng ta nhìn thấy rất tự nhiên, chúng ta tin tưởng vào những gì mình vừa trông thấy.

Giờ thì hãy đo đạc hẳn hoi, bạn – tức Hệ thống 2 của bạn, cái thực thể lý trí mà bạn gọi là “tôi” ấy – giờ đã có một niêm tin mới: bạn hay Hệ thống 2 biết rằng ba đoạn thẳng trên có độ dài bằng nhau. Nếu hỏi bạn về độ dài của chúng, bạn sẽ nói điều mà bạn mới biết. Nhưng nếu chỉ nhìn bạn sẽ thấy đoạn thẳng ở giữa dài hơn đoạn thẳng trên đầu và ở dưới. Bạn buộc phải tin tưởng vào sự đo đạc, nhưng bạn không thể ngăn cản Hệ thống 1 làm nhiệm vụ của nó, bạn không thể bắt mình – Hệ thống 1 nhìn thấy ba đường thẳng đó dài bằng nhau, mặc dù bạn – Hệ thống 2 biết chắc chắn điều đó.

Để chống lại ảo giác bạn phải học cách hoài nghi chính cảm giác của mình về chiều dài của các đoạn thẳng khi chúng được gắn thêm "vây".

Vậy thì đối với lập trình viên chúng ta thi sao liệu rằng tất cả những code mình viết ra mà dù mình nghĩ rằng nó là đúng, là chính xác cũng nên đặt ra sự hoài nghi và kiểm tra lại một cách kỹ lưỡng. Tôi nghĩ rằng chính từ ảo giác này mói sinh ra việc viết unit test trong lập trình.

Kết luận

Trong mỗi con người nói chung và lập trình viên như chúng ta nói riêng luông luôn tồn tại hai hệ thống tư duy đó là "Hệ thống 1" và "Hệ thống 2" nhưng quy luật vận hành của mỗi con người lại khác nhau có người Hệ thống 2 rất mạnh vào ban ngày có người lại mạnh vào ban đêm, có người mạnh vào buổi sáng, có người mạnh vào buổi chiều.

Hệ thống 1 cũng vậy. Vì vậy để việc việc code một cách hiệu quả và chính xác mỗi lập trình viên chúng ta hãy tìm tự tìm cho mình những thời điểm mà Hệ thống 1 hay Hệ thống 2 của mình mạnh để thực hiện những công việc cho hiệu quả nhất.

Ví dụ:

Với tôi thời điểm từ 6h -> 7h Hệ thống 2 của tôi mạnh vì thế đây là khoảng thời gian thích hợp cho tôi tiếp thu lượng kiến thức mới hay suy nghĩa về những vấn đề hóc búa như những đoạn code chuyển hoá từ thuật toán...

Thời điểm từ 19h -> 21h là thời điểm Hệ thống 2 của tôi trở lên lười biếng hay nói đúng hơn là lười nỗ lực tư duy lúc này công việc tôi chọn là những công việc quen thuộc hay những công việc mà đòi hỏi ít nỗ lực hơn.