This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

Thứ Bảy, 1 tháng 10, 2016

Một số kĩ thuật tối ưu hoá mã nguồn Java - Phần 1

Trong Java việc tối ưu hoá mã nguồn Java là công việc rất quan trọng, nó không chỉ giúp mã nguồn thông thoáng hơn, giúp tiêu tốn ít tài nguyên hệ thống hơn, mà các kĩ thuật được trình bày dưới đây sẽ giúp nâng cao hiệu suất (performance) làm việc của Java khi chạy chương trình!
Một LTV Java có kinh nghiệm luôn coi việc tối ưu hoá mã nguồn như là 1 phần quan trọng của công việc lập trình, trang bị những kĩ thuật, thủ thuật tối ưu sẽ thể hiện một LTV có trình độ, và coi nó như 1 kĩ năng không thể thiếu khi làm việc với Java.
Các kĩ thuật dưới đây không phải là những giải thuật toán học cao siêu, cũng không phải triển khai 1 cách phức tạp, đôi khi chúng rất dễ để thực hiện nhưng rất nhiều LTV không để ý hoặc chưa biết cách để triển khai nó.

I. Các vòng lặp

1. Tránh việc gọi phương thức trong vòng lặp

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Nếu có thể hãy tránh sử dụng cuộc gọi tới các phương thức như length(), size() ... trong vòng lặp, nó sẽ giúp cải thiện hiệu suất
  • Lý do: Việc sử dụng các phương thức trên trong vòng lặp sẽ gây ra rất nhiều cuộc gọi giống nhau và không cần thiết làm tăng xử lý cho chương trình
Ví dụ:
Java
package com.rule;
class Avoid_method_calls_in_loop_violation
{
public void method()
{
        String str = "Hello";
        for (int i = 0; i < str.length(); i++)   // Vi Phạm
        {
          i++;
        }
}
}
Nên được viết thành:
Java
package com.rule;
class Avoid_method_calls_in_loop_correction
{
    public void method()
    {
        String str = "Hello";
        int len = str.length();     // Đẩy size ra bên ngoài vòng lặp
        for (int i = 0; i < len ; i++)
        {
            i++;
        }
 }
}

2. Đưa các tính tóan bất biến ra ngoài vòng lặp

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Các mã nguồn luôn cho ra một kết quả giống nhau qua từng lần lặp nên được di chuyển ra ngoài vòng lặp
  • Lý do: Các tính tóan cho ra kết quả giống nhau, bất biến là không cần thiết phải gọi lại nhiều lần gây ra sự chậm trễ cho chương trình
Ví dụ 1:
Java
package com.rule;
class Loop_invariant_code_motion_violation
{
    public void method(int x, int y, int[] z)
    {
        for(int i = 0; i < z.length; i++)
        {
            z[i] = x * Math.abs(y);     // Vi phạm
        }
    }
}
Nên được viết thành:
Java
package com.rule;
class Loop_invariant_code_motion_correction
{
    public void method(int x, int y, int[] z)
    {
                    int t1 = x * Math.abs(y);       // Điều chỉnh
        for(int i = 0; i < z.length; i++)
        {
            z[i] = t1;
        }
    }
}
Ví dụ 2:
Java
public NamedElement find(NamedElement namedElement)
{ 
     for (NamedElement otherNamedElement : getNamedElements()) { 
          if (namedElement.getName().equals(otherNamedElement.getName())) { //Vi phạm
               return otherNamedElement; 
          }
     } 
               return null; 
}
Nên viết thành:
Java
public NamedElement find(NamedElement namedElement)
{ 
     String name = namedElement.getName(); // Chỉnh sửa
     for (NamedElement otherNamedElement : getNamedElements()) { 
         if (name.equals(otherNamedElement.getName())) { // Chỉnh sửa
             return otherNamedElement; 
         }
     } 
             return null; 
}
Tham khảo:
  • Java Performance Tunning by Jack Shirazi
  • The Art of Java Performance Tuning by Ed Merks (Page 20)

3. Tránh nối chuỗi (String) trong vòng lặp

  • Mức độ nghiêm trọng: Rất nghiêm trọng
  • Nguyên tắc: Sử dụng StringBuffer hoặc StringBuilder thay vì sử dụng nối chuỗi String trong vòng lặp
  • Lý do: String là 1 đối tượng bất biến, mỗi khi nối chuỗi gây ra tạo mới đối tượng String, số lần lặp càng lớn càng gây chậm trễ chương trình, tốn tài nguyên xử lý
Ví dụ:
Java
package com.rule;
class String_concatenation_violation
{
    public void concatValues()
    {
        String result = "";
        for (int i = 0; i < 20; i++) 
        {
              result += getNextString();                // Vi phạm
        }
    }
}
Nên được viết thành:
Java
package com.rule;
class String_concatenation_correction
{
    public void concatValues(String strMainString, String strAppend1, String strAppend2)
    {
        String result = "";
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 20; i++) 
 {
     builder.append(getNextString()); // Sử dụng StringBuilder
 }
 result = buffer.toString(); 
 }
}

4. Sử dụng biến tạm thay cho truy cập giá trị của phần tử trong mảng

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Sử dụng biến tạm để lưu trữ dữ liệu và tính toán thay vì truy cập tới giá trị của phần tử trong mảng
  • Lý do: Việc truy cập tới 1 phần tử trong mảng luôn làm tốn chi phí hơn là truy cập tới 1 biến tạm bởi vì máy ảo Java (VM) phải kiểm tra các ràng buộc truy cập tới phần tử đó cũng như phải kiểm tra độ dài của mảng
Ví dụ:
Java
public void setUpArray(int REPEAT) {
     for(int i = 0; i < REPEAT; i++) {
        countArr[0] += 10; // VI PHẠM
     }     
}
Nên viết thành:
Java
public void setUpArray(int REPEAT) {
     int tempCound = coundArr[0]; // ĐẨY VÀO BIẾN TẠM
     for(int i = 0; i < REPEAT; i++) {
       tempCound += 10;  // SỬA CHỮA
        countArr[0] = tempCount; // SỮA CHỮA
     }     
}
Tham khảo:
  • Java Performance Tunning 2nd, by Jack Shirazi (Chapter 7 - Page: 194)

5. Sử dụng Int

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Sử dụng kiểu dữ liệu int cho các chỉ số thay vì sử dụng các kiểu dữ liệu khác
  • Lý do: Sử dụng kiểu dữ liệu Int cho các chỉ số là nhanh nhất so với việc sử dụng bất kì kiểu dữ liệu nào khác. VM được tối ưu để sử dụng kiểu Int.
Ví dụ:
Sử dụng int :
Java
        for(int i = 0; i < Repeat; i++)
là nhanh hơn so với sử dụng bất kì kiểu dữ liệu nào khác
Java
     for(long i = 0; i < Repeat; i++)
     for(double i = 0; i < Repeat; i++)
     for(char i = 0; i < Repeat; i++)
Tham khảo:
  • Java Performance Tunning 2nd, by Jack Shirazi (Chapter 7 - 7.1.4)

6. Đặt Try Catch ra ngoài vòng lặp

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Đặt các khối Try/Catch/Finally bên trong vòng lặp có thể làm chậm quá trình thực thi của chương trình
Ví dụ:
Java
package com.rule;
import java.io.InputStream;
import java.io.IOException;
class Place_try_catch_out_of_loop_violation
{
    void method (InputStream is)
     {
         int ZERO = 0;
         int TEN = 10;
         int count = 0;
         for (int i = ZERO; i < TEN; i++)
         {
             try            // VIOLATION
             {
                 count += is.read();
             }
             catch (IOException ioe)
             {
                ioe.printStackTrace();
             }
         }
 }
}
Nên viết thành:
Java
package com.rule;
import java.io.InputStream;
import java.io.IOException;
class Place_try_catch_out_of_loop_correction
{
  void method (InputStream is)
     {
         int ZERO = 0;
         int TEN = 10;
         int count = 0;
         try            // Bao Try Catch ra ngoài vòng lặp
         {
             for (int i = ZERO; i < TEN; i++)
             {
                     count += is.read ();
             }
         }
         catch (IOException ioe)
         {
            ioe.printStackTrace();
         }
 }
}

II/ Làm việc với chuỗi

1. Sử dụng String.length() để kiểm tra chuỗi rỗng (empty)

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Sử dụng String.length() để kiểm tra chuỗi rỗng thay vì sử dụng String.equal()
  • Lý do: Phương thức String.equals () là quá mức cần thiết để kiểm tra một chuỗi rỗng. Kiểm tra độ dài của chuỗi là 0 sử dụng String.length() sẽ nhanh hơn.
Ví dụ:
Java
package com.rule;
class Use_String_length_to_compare_empty_string_violation
{
    public boolean isDocEmpty()
    {
                return doc.getContents().equals("");      // VI PHẠM
    }
}
Nên viết thành:
Java
package com.rule;
class Use_String_length_to_compare_empty_string_correction
{
    public boolean isDocEmpty()
    {
                return doc.getContents().length() == 0;     // SỬ DỤNG LENGTH
    }
}
Tham khảo:

2. Sử dụng StringBuffer hoặc StringBuilder (Tham khảo 3. Tránh nối chuỗi (String) trong vòng lặp)

3. Sử dụng equalsIgnoreCase

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Sử dụng phương thức equalsIgnoreCase() để so sánh chuỗi mà không phân biệt hoa thường
Ví dụ:
Java
public class Use_String_equalsIgnoreCase_violation
{
    public void method()
    {
        String str = "APPPERFECT";
        String str1 = "appperfect";
        if(str1.toUpperCase().equals(str))      // Violation
        {
            System.out.println("Strings are equals");
        }   
    }
}
Nên được viết thành:
Java
package com.rule;
public class Use_String_equalsIgnoreCase_correction
{
    public void method()
    {
        String str = "APPPERFECT";
        String str1 = "appperfect";
        if(str1.equalsIgnoreCase(str))      // Correction.
        {
            System.out.println("Strings are equals");
        }   
    }
}

4. Tránh sử dụng startsWith()

  • Mức độ nghiêm trọng: Rất Cao
  • Nguyên tắc: Tránh gọi String.startsWith () vì lý do hiệu suất
  • Lý do: Trong native mã nguồn Java String.startsWith () xử lý khá nhiều thứ truớc khi cho ra kết quả, vì vậy giới hạn vùng kiểm tra bằng cách kiểm tra ký tự ở vị trí đầu tiên
Ví dụ:
Java
package com.rule;
class Avoid_startsWith_violation
{
    public void method()
    {
        String sTemp="Data";
        if (sTemp.startsWith("D")) // VIOLATION
        {
            sTemp = "data";
        }
    }
}
Nên được viết thành
Java
package com.rule;
class Avoid_startsWith_correction
{
    public void method()
    {
        final int ZERO = 0;
        final char D = 'D';
        String sTemp="Data"; 
        if (sTemp.length () > ZERO && sTemp.charAt(ZERO) == D)  // CORRECTION
        {
            sTemp = "data"; 
        }
    }
}

III/ Các trường hợp khác

1. Sử dụng System.arraycopy()

  • Nguyên tắc: Sử dụng System.arraycopy() cho việc sao chép mảng
  • Lý do: Sử dụng System.arraycopy() là nhanh hơn so với việc sử dụng vòng lặp để sao chép 1 mảng
Ví dụ:
Java
package com.rule;
class Use_System_arrayCopy_violation
{
    public int[] copyArray (int[] array)
    {
        int length = array.length;
        int[] copy = new int [length];
        for(int i=0;i<length;i++)
        {
            copy [i] = array[i];        // VIOLATION
        }
        return copy;
    }
}
Nên viết thành:
Java
package com.rule;
class Use_System_arrayCopy_correction
{
    public int[] copyArray (int[] array)
    {
        final int ZERO = 0;
        int length = array.length;
        int[] copy = new int [length];
        System.arraycopy(array, ZERO, copy, ZERO, length);      // CORRECTION
        return copy;
    }
}

2. Tránh lặp lại việc Casting (ép kiểu)

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Chỉ ép kiểu 1 lần sau đó giữ tham chiếu của nó
  • Lý do: Việc lặp đi lặp lại nhiều lần việc ép kiểu khiến việc xử lý chậm trễ hơn
Ví dụ:
Java
package com.rule;
import java.awt.Component;
import java.awt.TextField;
class Avoid_repeated_casting_violation
{
    public void method(Component comp)
    {
        ((TextField) comp).setText("");       // VIOLATION
        ((TextField) comp).setEditable(false);  // VIOLATION
    }
}
Nên viết thành:
Java
package com.rule;
import java.awt.Component;
import java.awt.TextField;
class Avoid_repeated_casting_correction
{
    public void method(Component comp)
    {
        final TextField tf = (TextField) comp;  // CORRECTION
        tf.setText("");
        tf.setEditable(false);
    }
}
Tham khảo: Java Performance tunning by Jack Shirazi

3. Hủy các cấu trúc if else không cần thiết

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Đơn giản hóa để nâng cao hiệu quả của mã và giảm kích thước của nó.
Ví dụ:
Java
package com.rule;
class Use_ternary_operator_correction
{
    public boolean test(String value)
    {
        if(value.equals("AppPerfect"))        // VIOLATION
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
Nên viết thành:
Java
package com.rule;
class Use_ternary_operator_correction
{
    public boolean test(String value)
    {
          return value.equals("AppPerfect"); // CORRECTION
        }
 }

4. Luôn sử dụng static với hằng số

  • Mức độ nghiêm trọng: Bình thường
  • Nguyên tắc: Nên khai báo static với các biến là hằng số
Ví dụ:
Java
package com.rule;
public class Always_declare_constant_field_static_violation
{
    final int MAX = 1000; // VIOLATION
    final String NAME = "Noname"; // VIOLATION
}
Nên viết thành:
Java
package com.rule;
public class Always_declare_constant_field_static_correction
{
    static final int MAX = 1000; // CORRECTION
    static final String NAME = "Noname"; // VIOLATION
}

5. Tránh check null truớc khi sử dụng so sánh InstanceOf

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Không nên check NULL truớc khi so sánh InstanceOf
  • Lý do: Không cần thiết phải check NULL trong truờwng hợp này, InstanceOf chỉ được so sánh khi đối tượng != NULL, nên việc so sánh là không cần thiết
Ví dụ:
Java
package com.rule;
public class Avoid_null_check_before_instanceof_violation
{
    public void method(Object o)
    {
        if(o != null &&  o instanceof Object)       // Violation.
        {
            // Do Something.
        }   
    }
}
Nên viết thành:
Java
package com.rule;
public class Avoid_null_check_before_instanceof_correction
{
    public void method(Object o)
    {
        if(o instanceof Object)     // Correction
        {
            // Do Something.
        }   
    }
}

6. Sử dụng mảng dữ liệu nguyên thủy

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Sử dụng mảng dữ liệu nguyên thủy thay vì sử dụng Collection
  • Lý do: Collection có thể chứa trong nó nhiều kiểu dữ liệu (kiểu object, nguyên thủy ...), vì vậy sử dụng mảng nguyên thủy giúp nâng cao hiệu suất chương trình
Ví dụ:
Java
package com.rule;
import java.util.Vector;
public class Use_array_of_primitive_type_insteadof_collection_violation
{
    public void method()
    {
        Vector vInt = new Vector(); // VIOLATION
        vInt.add(new Integer(1));
        vInt.add(new Integer(2));
        vInt.add(new Integer(3));
    }
}
Nên viết thành:
Java
package com.rule;
public class Use_array_of_primitive_type_insteadof_collection_correction
{
    public void method()
    {
        int[] arrInt = new int[3]; // CORRECTION
        arrInt[0] = 1;
        arrInt[1] = 2;
        arrInt[2] = 3;
    }
}

7. Tránh show Debug code

  • Mức độ nghiêm trọng: Thấp
  • Nguyên tắc: Nên check Debug truớc khi show Log
  • Lý do: Việc Debugger vốn bản chất chỉ dành cho nhà phát triển, vì vậy hãy loại bỏ hoặc kiểm tra chúng truớc khi thực thi
Ví dụ:
Java
package com.rule;
public void Avoid_debugging_code_violation
{
    private int count =0;
    public int getCount()
    {
        //...
        System.out.println("count ="+count);  // Violation
        return count;
    }
}
Nên viết thành:
Java
package com.rule;
public void Avoid_debugging_code_correction
{
    private int count =0;
    public int getCount()
    {
        if (Debug.ON) 
        {
            System.out.println("count ="+count);  //correction
        }
        return count;
    }
}

8. Tránh việc sử dụng Thread.sleep()

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Không nên sử dụng Thread.sleep vì lý do hiệu suất
Ví dụ:
Java
package com.rule;
class Avoid_call_to_Thread_sleep_violation
{
    public void doTest() throws InterruptedException
    {
        //......
        Thread.sleep(100); // VIOLATION
        //......
    }
}
Nên viết thành:
Java
package com.rule;
class Avoid_call_to_Thread_sleep_correction
{
    public void doTest()
    {
        //......
        this.wait(100); // CORRECTION
        //......
    }
}

8. Tránh sử dụng String.charAt()

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Sử dụng mảng char[] thay vì sử dụng String.charAt();
Ví dụ:
Java
package com.rule;
class Avoid_using_String_charAt_violation
{
    public void method(String str)
    {
        for(int i=0; i<str.length(); i++)
        {
            System.out.println(str.charAt(i));  // VIOLATION
        }
    }
}
Nên viết thành:
Java
package com.rule;
class Avoid_using_String_charAt_correction
{
    public void method(String str)
    {
        char[] carr = str.toCharArray();        // CORRECTION
        for(int i=0; i<carr.length; i++)
        {
            System.out.println(carr[i]);        // CORRECTION
        }
    }
}
Tham khảo:

Trong bài này có sử dụng tài liệu tham khảo:

Nguồn: 

Thứ Năm, 18 tháng 8, 2016

Nghề làm thầy giáo có khó lắm không?

Trong xã hội, cũng có những nghề, chỉ ngay sau khi chia tay, người ta đã không còn muốn nghĩ về nó nữa, nhưng nghề giáo thì không như thế. Tôi được biết trong lĩnh vực đặc biệt này, có những người thầy, dù đã chính thức nghỉ hưu hàng chục năm nay, vậy mà thiên chức nhà giáo trong họ dường như vẫn vẹn nguyên. Họ là những bông hoa đẹp rất đáng được trân trọng trong xã hội.

Nghề giáo có “nhàn nhã”, “ăn trắng, mặc trơn”? 
Không phải ngẫu nhiên, trong xã hội, chỉ có hai loại nghề được người ta gọi là thầy: thầy giáo và thầy thuốc. Vinh quang là thế, nhưng từng có thời gian dài, nghề làm thầy vẫn bị xã hội “quay lưng”: “Chuột chạy cùng sào mới vào sư phạm”. Rồi lại có thời kì, học sinh đổ xô vào trường Sư phạm, không hẳn vì say mê, tâm huyết với nghề, mà vì vào đó sẽ không phải đóng học phí, mà ra trường cũng dễ kiếm việc làm. Nói chung đây là một cái nghề thiếu ổn định. Hoặc cũng có thể là khó, không phải ai cũng có thể làm được.
Vậy làm nghề thầy giáo có khó thật không? Bản thân tôi, phải đến tận khi chính thức hoàn tất gần 40 năm sự nghiệp của mình, mới tìm được câu trả lời tạm coi là có thể chấp nhận được: làm nghề thầy giáo với người này có thể là dễ, nhưng với một số người khác thì đúng là khó. Nói dễ bởi nhìn bề ngoài, so với nhiều nghề nghiệp khác, nghề nhà giáo không cần đến "cơ bắp”, công việc có vẻ “nhàn nhã”, “ăn trắng, mặc trơn”: không phải lao động chân tay, không phải đến công sở hàng ngày, được nhiều người trong xã hội trọng vọng” (không “trọng vọng” sao được gọi là thầy giáo?
Nhưng làm nghề giáo cũng thật khó. Bởi lẽ, một khi đã chấp nhận công việc này, cũng có nghĩa phải chấp nhận sự hi sinh: người ta không thể giàu có khi làm nghề thầy giáo (trừ một số người giỏi giang, xuất chúng). Trong dân gian từ lâu đã tồn tại câu cửa miệng “phi thương bất phú”.
Từng gắn bó với nghề giáo gần như cả đời, tôi dám khẳng định, trong xã hội ta, ít có ai làm nghề này mà lại giàu có bao giờ (hoặc những người thầy giáo mà giàu có hẳn họ phải làm thêm, hoặc làm một việc “mờ ám” gì đó).
Gần đây, trên báo mạng tôi có đọc được thông tin, một nghiên cứu ở Đại học Mĩ cho rằng thầy giáo đại học Việt Nam có thể kiểm hàng tỉ mỗi năm. Bản thân tôi cũng biết, có vài ba ông thầy (nhờ đi dạy thêm, hoặc có “mánh mung” gì đó), mà hàng năm kiếm được tiền tỉ, có ô tô, nhà lầu. Nhưng đó chỉ là những trường hợp cá biệt. Còn nói chung đa số các thầy cô giáo trong xã hội ta còn rất nghèo, trong khi áp lực xã hội mà họ phải chịu đựng là vô cùng lớn. Điều này có lí do của nó, nghề thầy giáo (và cả thầy thuốc nữa), luôn chịu sự phê phán, “săm soi” của hàng triệu con người, của xã hội. Đơn giản thôi vì trong cuộc sống thường nhật gia đình nào mà chả có người đi học (và chữa bệnh).
Đôi khi phải biết tỏ ra “đạo đức giả”
Quả nhiên làm nghề thầy giáo thật là khó, vậy nên bất kì ai, khi đã dấn thân vào lĩnh vực, cũng có nghĩa là phải biết chấp nhận hi sinh, phải biết làm gương cho học trò, phải có lòng thương yêu, và đôi khi cũng phải biết tỏ ra “đạo đức giả” nữa, tức là phải “tự dối lòng” mình trước một điều gì ham muốn ghê gớm lắm, mà vẫn cứ buộc phải “dằn lòng mình” xuống.
Đứng trước những ham muốn vật chất, những dục vọng tầm thường, nghề thầy giáo chính là “vật cản” để người thầy giáo không bị cuốn theo. Người thầy giáo, cũng giống như thầy thuốc, khi đã bước chân vào nghề, là đã mang mang theo trong suốt cuộc đời mình “lời thề Hypocrat”: không chỉ là tấm gương về đạo đức, họ còn phải là một tấm gương về chuyên môn.
Tôi không quan niệm chuyên môn ở đây có nghĩa là phải trang bị cho mình thật nhiều bằng cấp (mặc dù đây cũng là một phần trách nhiệm của họ), mà là phải thực sự đào sâu vào lĩnh vực chuyên sâu của mình, phải say mê và tâm huyết, phải có đủ lòng nhiệt tình để khơi gợi niềm đam mê ở học trò, phải sáng tạo - “sáng tạo”, nói như Giáo sư Đỗ Đức Hiểu, người thầy vô cùng kính trọng của tôi và nhiều thế hệ sinh viên khoa Ngữ Văn, để không “biến học sinh thành bản sao của mình”. Một thế giới hội nhập không cần đến những “bản sao” như thế.
Quả thật, có một thời gian dài, Giáo sư Đỗ Đức Hiểu sống ngay giữa trung tâm Hà Nội (26 phố Hàng Bài), mà hệt như một người lạc đến từ một hành tinh khác. Thầy từ bỏ mọi ham muốn (vật chất) của mình để đam mê hết lòng với những trang sách, với việc đào tạo sinh viên, “ngô nghê” trước thế giới kim tiền, thậm chí có lúc trong túi riêng không có nổi 50 ngàn đồng cho một bữa ăn hàng ngày vốn đã rất đạm bạc.
Trong cuộc đời làm thầy (và cả làm trò) của mình, tôi từng được chứng kiến nhiều tấm gương thầy cô giáo ngay gần bên tôi tại khoa Ngữ Văn, Đại học Tổng hợp trước đây: Giáo sư Phan Cự Đệ, Hà Minh Đức, Lê Hồng Sâm, Đặng Thị Hạnh, Nguyễn Văn Khỏa…, với những việc làm dù rất bình thường và dung dị của họ, mà cứ khiến tôi phải suy nghĩ mãi. Chính những việc làm và suy nghĩ dung đị đó, có những điều tôi bắt chước được, và có những điều không, nhưng tất cả đều đọng lại trong tôi lòng biết ơn sâu sắc, vì nhờ đó mà nhân cách nghề nghiệp của của tôi được hoàn thiện dần.
Những bông hoa tươi thắm kính tặng thầy cô nhân Ngày Nhà giáo Việt Nam 20/11
Những bông hoa tươi thắm kính tặng thầy cô nhân Ngày Nhà giáo Việt Nam 20/11.

Trước sinh viên, mỗi người thầy đã được coi như một “vị thánh sống”
Làm nghề thầy giáo thật không dễ, dù ngay cả khi mình đã được trang bị đầy đủ kiến thức để truyền thụ cho học trò. Từng có một thâm niên bề dày giảng dạy nhiều năm “biết mười dạy một”, nhưng trước mỗi giờ lên lớp, người thầy giáo vẫn không được phép chủ quan, vẫn phải chủ động, nắm chắc từng chi tiết kiến thức trước khi lên lớp.
Tôi nhớ cách đây rất lâu, cỡ những năm 77, 78, tình cờ một lần tôi được phân công đi dạy cho một lớp tại chức ở Hải Dương cùng Giáo sư Đỗ Đức Hiểu. Lúc đó, thầy Hiểu là phó chủ nhiệm khoa Ngữ Văn, phụ trách chuyên môn, lại cùng tổ chuyên môn Văn học phương Tây với tôi.
Vào cái đêm hôm trước ngày có giờ dạy trên lớp, vì lo cho sức khỏe tốt nhất sáng hôm sau, tôi đã đi ngủ sớm. Nhưng tôi rất ngạc nhiên, khi đã chợp mắt được một giấc, bất chợt tỉnh dậy, tôi vẫn thấy phía giường người thầy của tôi, có vẻ như vẫn còn le lói ánh đèn: thầy chưa đi ngủ, thầy đang lật giở một cuốn sách, có vẻ như nhẹ nhàng để không ảnh hưởng đến giấc ngủ của người bên cạnh. Khi tôi cất lời hỏi: thầy ơi, sao giờ này thầy vẫn còn chưa đi nghỉ, ngày mai mình có giờ giảng sớm cơ mà? Ông thầy đã từng có ba mươi năm giảng dạy, buổi tối hôm đó khẽ khàng trả lời, khiến tôi về sau này cứ “ngượng” mãi: anh Hinh ơi, anh cứ ngủ đi, tôi thức thêm một chút ngó lại bài giảng ngày mai cho lớp.
Một người thầy đã từng có gần ba mươi năm đứng lớp (ở thời điểm đó), đã làu làu bài giảng của mình, vậy mà vào trước hôm lên lớp vẫn cẩn thận xem lại từng trang giáo án đã cho tôi một “bài học” thấm thía trong nghề dạy học: người thầy không bao giờ được cho phép mình có quyền ”sơ suất’ trước sinh viên, bởi trước sinh viên, mỗi người thầy đã được coi như một “vị thánh sống”, luôn luôn nói những điều đúng đắn và chính xác.
Những sai sót không đáng có của người thầy trong giảng dạy đôi khi sẽ để lại những “ám ảnh” rất lâu trước học trò. Sự tắc trách của người thầy giáo có thể không gây nguy hiểm “chết người” như thầy thuốc, nhưng nó cũng để lại những di hại không kém: vì những kiến thức được truyền thụ sai mà người học trò có thể sẽ mất đi niềm tin, hoặc có thể sẽ dẫn đến những “lầm lạc” trong công việc sau này, ảnh hưởng lớn đến xã hội. Quả là làm nghề thầy giáo không hề dễ.
Tôi nghĩ, ở khoa Văn và ở Trường ĐH Tổng hợp trước đây cũng như Trường ĐH Khoa học Xã hội & Nhân văn hiện nay có nhiều tấm gương thầy cô giáo (mà tôi không thể kể hết tên ở đây), họ đã cống hiến suốt cả một đời, những năm về già cũng có người “khá giả” có người tạm coi là “tiềm tiệm”, ít ai giàu có, vậy nên chấp nhận làm nghề thầy giáo thật không dễ dàng gì. Nhưng nếu bảo rằng, giờ đây, nếu như có một phép thần kì diệu, cho phép được lựa chọn lại, tôi cũng sẽ chọn nghề thầy giáo.
Vinh danh chữ “Thầy”
Suy cho cùng, làm nghề thầy giáo, cũng là một hạnh phúc, hay nói cách khác, là một “tỉ phú”, tỉ phú về tinh thần. Tôi xin lấy thâm niên gần 40 năm dạy học của mình khẳng định như vậy. Các bạn hãy kiên nhẫn nghe tôi giải thích…
Thứ nhất, ở trên tôi có nói, trong xã hội có rất nhiều nghề, nhưng chỉ có hai nghề được gọi là thầy: thầy giáo và thầy thuốc, đó là một hạnh phúc; thứ hai, làm nghề thầy giáo, chí ít mình cũng có được niềm vui dạy học hàng ngày, được mang những kiến thức ít ỏi của mình “trao” cho nhiều thế hệ học sinh, được nhìn thấy họ trưởng thành và đóng góp cho gia đình và xã hội. Tôi xin kể lại một vài chuyện nho nhỏ vui vui. Cách đây đã lâu, có một lần tôi đưa anh bạn Nguyễn Huy Hoàng (hiện đang ở Nga) vào cấp cứu tại một bệnh viện. Anh bị đau ruột thừa.
Trong lúc rất vội vã đẩy anh đang nằm trên cáng cấp cứu vào phòng mổ, bất ngờ cả tôi và Nguyễn Huy Hoàng giật mình: “Em chào thầy ạ!”. Chúng tôi nhìn lên, một người phụ nữ đã trung tuổi, người vừa chào, tự giới thiệu chị là học trò của các thầy. Hôm ấy chị có việc vào viên thăm người thân. Nhìn thấy thầy giáo đang nằm trên cáng cấp cứu tự nhiên bật ra tiếng chào kính trọng (một niềm vui nho nhỏ).
Lại một lần khác, đang trên đường đến lớp, khi đi ngang qua một ngã tư, vì buổi học đã sát đến giờ, tôi tranh thủ “vượt” nhanh khi đã có tín hiệu đèn đỏ. Một anh cảnh sát dừng xe tôi lại với vẻ mặt rất nghiêm trọng, việc đầu tiên là hỏi giấy tờ. Hôm ấy tôi không mang giấy tờ tùy thân theo, nên đã nhanh nhảu nói với anh: “Tôi xin lỗi, anh cứ ghi phạt tôi đi, bao nhiêu cũng được nhưng nhanh lên một chút, tôi sắp đến giờ vào lớp”. Anh cảnh sát khi nghe tôi nói “sắp đến giờ vào lớp”, biết tôi là thầy giáo, đã ngay lập tức đổi thái độ, nói với tôi: “Vậy thì thầy đi nhanh lên, lần sau thầy chú ý cho một chút”. Không có tờ biên phạt nào cả.
Một lần khác nữa cách đây 20 năm, có lần tôi vào thỉnh giảng ở khoa Ngữ Văn, Đại học Khoa học Huế. Ngay buổi học đầu tiên, tôi chứng kiến một cảnh tượng bất ngờ: cả một “rừng” học trò gái phía dưới nhất loạt mặc áo dài trắng, tôi hỏi “sao thế các em?”, cả rừng hoa màu trắng ấy nhất loạt trả lời: “Vì thầy đó thầy ạ”. Tôi xúc động lắm. Về sau hỏi ra mới được biết, vì tôi là thầy giáo ngoài Bắc vô thỉnh giảng, lâu rồi mới có một thầy phía ngoài vào đây, học trò đã tự động bảo nhau mặc áo dài trắng lên lớp cho thầy bất ngờ…
Quả là, làm nghề thầy giáo thật hạnh phúc, vì trong đời mình được gặp vô khối những “niềm vui nho nhỏ như vậy”. Không phải ngẫu nhiên dân gian nhiều đời nay đã từng tồn tại những câu vinh danh người thầy: “Không thầy đố mày làm nên”, “Nhất tự vi sư, bán tự vi sư” (“Một chữ cũng nhờ thầy, nửa chữ cũng nhờ thầy”), “Muốn sang thì bắc cầu Kiều/ Muốn con hay chữ thì yêu lấy thầy”…
Thế đấy, đó là tất cả những gì tôi tích lũy được từ nghề làm thầy trong suốt gần 40 năm qua. Thế hệ chúng tôi thời ấy việc chọn nghề thực ra không mấy quan trọng. Nhưng ngày nay thì khác. Tôi biết, các bạn trẻ bây giờ, không phải ở chỗ nào cũng ưu tiên lựa chọn nghề thầy giáo. Bây giờ xã hội “thực dụng” hơn, việc lựa chọn nghề cũng nghiêng hơn về phía “vật chất”, giá trị tinh thần trở nên mong manh. Thêm nữa, vì cuộc cạnh tranh khốc liệt của đồng tiền, trong môi trường giáo dục dù vẫn tồn tại  nhiều tấm gương sáng, vẫn còn không ít “tấm gương tối”.
Thế nhưng dù sự thế có xoay vần thế nào, tôi nghĩ nghề thầy giáo vẫn luôn cần thiết, quan trọng và thiêng liêng với nhiều người. Sẽ không có một xã hội tốt, nếu như không có những người thầy tốt.
Trần Hinh - Dantri
Chủ nhiệm Bộ môn Nghệ thuật học (Khoa Văn học)


Trường ĐH Khoa học, Xã hội & Nhân văn - ĐH Quốc gia Hà Nội