Thứ Sáu, 31 tháng 7, 2020

3 đặc trưng của thông tin và tư vấn tổng quan về ngành IT

Bài viết này chủ yếu dành cho các bạn học sinh phổ thông (cấp 2, cấp 3), nhưng các bạn học đại học vẫn có thể đọc. Bài này mình bàn về khái niệm của <<thông tin>> và ngành IT (công nghệ thông tin), vì kỳ thi tốt nghiệp phổ thông 2020 (trước kia là kỳ thi đại học) đã tới gần.

1. Ba đặc trưng của thông tin

Những đặc trưng này, tác giả tự đúc kết sau khi dành thời gian 4.5 năm học về kỹ thuật máy tính (computer engineering, or CE) ở đại học, một thời gian nghiên cứu PhD, và đi làm 3 công ty từ nhỏ đến lớn (i.e, Softfoundry, AIQ, Grab,...). Tổng cộng thời gian, tác giả tiếp xúc/làm việc nghiêm túc với máy tính 13 năm từ 2007 tới nay. Trước đó, thì chỉ chơi một ít game thời học cấp 3. Đi cùng những đặc tính này, mình sẽ tóm lượt những công việc liên quan tới những đặc trưng này.

Nhanh (fast): Đây là đặc tính đầu tiên và quan trọng nhất của thông tin số. Thông tin số là thông tin được mã hoá trong máy tính. Máy tính bây giờ có thể xử lí một câu lệnh trong khoảng 1ns (1 giây có 10^9 ~ 1 tỷ nano giây). Bạn nói một câu nói ngắn thì khoảng 5s, và bạn có thể tưởng tượng trong khoản thời gian ấy, máy tính có thể thực hiện 5 tỷ câu lệnh rùi. Rất có ít thứ trên thế giới có thể làm điều kỳ diệu này. Nhiều câu lệnh sẽ gộp thành những tác vụ (operation) có ích với con người như truyền, biến đổi, trình diễn, gây chú ý thông tin. Chính sự nhanh của thông tin đã làm hiệu suất làm việc của con người tăng lên.
Figure 1: Máy tính Apple Macintosh Classic II, một trong những máy tính cá nhân đầu tiên.


Đa dạng (big): Máy tính xử lí nhanh và có dung lượng lớn, dẫn đến con người dùng máy tính để lưu trữ một lượng thông tin khổng lồ. Các loại thông tin khác nhau như số, ngôn ngữ, chữ viết, văn bản, bài văn, thư từ, báo chí, âm thanh, hình ảnh, video, thông tin tài chính, địa lý,  giải trí, trò chơi (gaming)... Ngành khoa học máy tính có một chuyên ngành xử lí big data khá phổ biến.
Figure 2: dữ liệu lớn và đống hỗn độn của nó 😀


Ảo (virtual): Thông tin thường thì không sờ, nắm, ngửi được, mà bạn chỉ có thể nhìn, đọc, nghe nó. Bazinga!!! Nhưng có ngoại lệ, bạn có thể in thông tin (một bài báo vnexpress), ..., và ngửi nó, hi hí!!! Các bạn học C++ cũng biết khái niệm virtual function, một hàm (function) không có hình dạng/chức năng/hiện thực (còn gọi là implementation) cụ thể mà chỉ có một giao diện (interface), có thể được dùng ở nhiều nơi. Tương tự, thông tin cũng ảo và đa hình được dùng/biến đổi tuỳ thuộc vào nhu cầu của con người cho mục đích cả xấu lẫn tốt. Nhu cầu của con người đối với thông tin sẽ tạo ra nhiều việc làm và nhiều ngành công nghệ nhỏ trong ngành IT. Ví dụ, chúng ta muốn phát triển phần mềm (software) có nhiều lĩnh vực khác nhau (tài chính, báo chí, chính phủ, dầu mỏ, quản lí địa lí (GIS),...) làm cho công việc kỹ sư phần mềm (software engineer) rất phong phú. Chúng ta muốn phát triển phần mềm cho các loại thiết bị khác (máy tính, macOS, Windows, điện thoại, iOs, Android, Sámsung, Apple, Huawei phone, ...). Chúng ta muốn thông tin an toàn hơn, sản sinh lớp công việc về kỹ sư an toàn thông tin (security engineer), kỹ sư mạng máy tính (network engineer). Chúng ta muốn thông tin trở nên thông minh hơn, tạo nên lớp công việc về phân tích dữ liệu, khoa học dữ liệu (data analytics, data analysts, data scientist). Rồi có công việc quản lí chuỗi thông tin trong một chuỗi kinh doanh/sản xuất, ví dụ như quản lí chương trình kỹ thuật (Technical Program Manager), quản lí sản phẩm (Product Manager). Vì nhu cầu dồi dào, nên cũng có nhu cầu về tập huấn/giảng dạy cho nhân viên công ty những công nghệ IT phổ biến, chẳng hạn, trong cloud computing, có nhiều chương trình training về AWS (Amazon), Azure (Microsoft), GCP (Google), và có những công việc loại giảng dạy này. Vì chữ ảo này, trong kinh doanh, cũng có nhiều công ty, ngành công nghiêp cố gắng kết nối giữa ảo (virtual) & thực (reality), ví dụ, gọi dịch vụ xe, thức ăn qua điện thoại thông minh (ride-hailing, food delivery), in 3D (3D-printing), thương mại điện tử (e-commerce), Internet-of-Things (IoT).

Figure 3: Funny cat with virtual reality glasses.

2. Những câu hỏi thường gặp về ngành IT

Trong phần này, tác giả chủ yếu làm sáng tỏ một vài điều bí ẩn thường được hỏi về ngành IT.
  • Có phải là tác giả khuyên người đọc nên thi IT?
Dĩ nhiên là không. Với kinh nghiệm, mình đã từng thấy nhiều bạn học xong IT đi làm ngành khác, hoặc học những ngành khác chuyển sang làm IT, cũng có nhiều bạn nhìn thấy codes là bỏ chạy á 😂. Tôi chỉ cung cấp cho các bạn những kinh nghiệm trong ngành mà ít người bàn tới.
  • Học IT luôn vất vả vì phải học liên tục, luôn cập nhật kiến thức?
Tôi luôn gặp câu hỏi này từ những người phụ huynh khi lựa chọn nghề nghiệp. Ba tôi, một người nông dân, không bao giờ tiếp xúc với công nghệ thông tin (CNTT), vẫn biết về điều này. Chắc do những người có con học về CNTT nói chuyện và kể lại. Rồi, một hôm, tui đi một hội thảo (workshop) bên xứ Singapore này, có một bà mẹ cũng hỏi, nếu con tôi học và thành thạo một ngôn ngữ (C++) thì liệu nó có được một nghề nghiệp ổn định trong tương lai. Với kinh nghiêm trong ngành, tôi thấy một phần nào đúng trong những nhận xét này. Tuy nhiên, chúng ta nghĩ theo điều này ở một khía cạnh tích cực. Chính việc đổi mới liên tục của công nghệ sẽ tạo ra công việc. Nếu các bạn có kiến thức cơ bản của ngành thì việc tiếp thu kiến thức mới sẽ dễ hơn. Những bạn thích công việc nhẹ nhàng, ít thay đổi thì IT sẽ khó đáp ứng bạn. Và tất cả các công việc theo nghĩa rộng nhất là tạm thời.
  • Học IT "hái" ra tiền?
Tôi cũng nhận được lời nhận xét này. So với mặt bằng chung thu nhập ở VN bây giờ, thì cũng có thể đúng là ngành IT có mức lương cơ bản tốt hơn mức trung bình, báo cáo ở đây (link). IT trả lương tốt cho những người có kinh nghiệm. Nhưng phổ lương của IT khá rộng tuỳ thuộc vào năng lực và kinh nghiệm. Nhưng làm việc trong ngành IT, bạn phải thường xuyên làm việc quá giờ (over-time).
  • Con gái có học được IT?
Theo kinh nghiệm của tôi, IT là ngành công nghiệp bao gồm nhất (inclusive) nhất. IT là một ngành trong khối STEM (science, technology, engineering, mathematic) mà con gái có thể dễ dàng hoà nhập. Vì sự đa dạng về công việc của IT, có nhiều vị trí ít yêu cầu về kỹ năng kỹ thuật như quản lí sản phẩm (product manager), quản lí dự án (program manager), quản lý tài khoản (account manager), làm về nhân sự (technical recruiter), thiết kế đồ hoạ (designer), kiểm thử (tester), bán hàng. Hơn thế nữa, nhiều bạn nữ có kỹ năng làm kỹ thuật tốt.
  • Những kỹ năng gì quan trọng để học ngành IT?
Kỹ năng giải quyết vấn đề và tiếng Anh. Tiếng Anh là quan trọng, vì rất nhiều tài liệu quan trọng, hệ thống kiến thức được phổ biến bằng tiếng Anh.  Một phần vì những phát minh đầu tiên liên quan đến máy tính đến từ Mỹ, một phần vì tiếng Anh là ngôn ngữ phổ biến của khoa học. Nhưng quan trọng nhất vẫn là kỹ năng giải quyết vấn đề.
  • Toán học có quan trọng với ngành IT?
Rất nhiều giải thuật trong khoa học máy tính được phát minh tự trên những định lý, nghiên cứu của các nhà toán học, ví dụ, như đại số boolean, định lý số lớn trong học máy... 
  • Liệu ngành IT còn tồn tại trong 20 năm tới?
Chắc chắn là vậy. Tất nhiên, sẽ có nhiều tiến bộ trong ngành nữa, nhiều công cụ nâng cao hơn, ứng dụng sâu rộng hơn. Giống như ngành IT bây giờ khác rất nhiều so với 40 năm trước.
  • Học xong thì làm việc ở đâu?
Bây giờ có rất nhiều công ty có việc làm IT ở Việt Nam. Phổ biến nhất về phần mềm là FPT Software, VNG, TMA, CMC, KMS, Global Cybersoft,... Những công ty Internet ở Việt Nam như Tiki,...Những công ty viễn thông như Viettel, VNPT, Vinaphone cũng cần nhân viên để xây dựng và vận hành hệ thống công nghệ của họ. Ngân hàng cũng có hệ thống IT riêng như Vietcom bank, Techcom bank... Những công ty đa quốc gia cũng có mặt ở VN như Grab, Shopee, Harvey Nash, Bosch, KPMG... Những công ty phần cứng đa quốc gia như AMD, Renesas Electronics, Samsung, nghe đồn có Apple... Và cả ngàn công ty startup, SME khác như GiaoHangNhanh,...
  • Những ngành học có liên quan đến IT?
Những ngành chính thống như khoa học máy tính (computer science), kỹ thuật máy tính (computer engineering). Có những ngành mà tôi đi làm vẫn thấy, sau khi tốt nghiệp, họ vẫn làm kỹ sư phần mềm/phần cứng tốt như điện tử (electronics), viễn thông (telecomunication), toán/thống kê (mathematics)...


Chúc các bạn có sự lựa chọn hợp lý và một kỳ thi tốt! Nếu các bạn có câu hỏi, xin hãy gửi bình luận phía dưới (phần comment) 👇👇👇.
🐘🐘🐘

Thứ Bảy, 9 tháng 2, 2019

PL 101: Python numpy assignment operation is very amusing.

Hi all,
In this post, I just found that Python numpy is really an amusing language in the assignment operation and the mutable property of strings and tuples. I will continuously update this page to reflect my surprise on the features of Python numpy package.

First, the assignment operation is not a deep copy operation. It means that it just copy the pointer of contents to a new variable name. For example,
In [1]: import numpy as np
In [2]: a = np.zeros((2,3))
In [3]: a
Out[3]:
array([[0., 0., 0.],
[0., 0., 0.]])
In [4]: b = a
In [5]: b[0][0]= 1
In [6]: b
Out[6]:
array([[1., 0., 0.],
[0., 0., 0.]])
In [7]: a
Out[7]:
array([[1., 0., 0.],
[0., 0., 0.]])

You can see that modifying matrix `b` will cause matrix `a` modified.

Happy new year 2019, the year of Pig! Happy Python.

Thứ Hai, 5 tháng 2, 2018

C++ Algorithm 101: get index of sort algorithm

Hi,
Do you wonder to ask how to get index of a sorted array in C++. The answer is not straightforward, but tangible with C++11 lambda. Keep it in your C++ toolbox, you might need it quite often. I hope people will include some ways to do it easily in C++ next version.

template <typename T>
vector<int> sort_indexes(const vector<T> &v) {

  // initialize original index locations
  vector<int> idx(v.size());
  iota(idx.begin(), idx.end(), 0);

  // sort indexes based on comparing values in v
  sort(idx.begin(), idx.end(),
       [&v](size_t i1, size_t i2) {return v[i1] < v[i2];});

  return idx;
}
See you in the next post. Happy 2018 with productivity.

Thứ Tư, 18 tháng 11, 2015

Programming languages 101: Python containers vs. C++ containers

Hi all,
    I am always fascinated about programming languages, computer science and technology in general. At a dinner with my friends, we were discussing about programming languages Python, R, Fortran, C/C++ and data science. At a particular time, we were moving into an topic with a simple question how to implement linked-list in Python. For an experienced programmer like me, it is quite ridiculous for me to ask this question, because we do not need it in most cases. I think that Python will take care of basic data structures for you and you just use it. Python uses C to implement basic data structures for you, called CPython. And if you are crazy enough or want to reinvent the wheel or implement a new data structure, you can implement it in C/C++ and bind it to Python.
    So, I spent that a whole night to rethink about a new question: What underlying implementation of Python container list [] and what is the equivalence containers/implementations in C++?
    At first, I think the equivalent container in C++ would be vector. In the end, it has a slight  difference in their implementation. The implementation of Python list uses a contiguous array of references to other objects, and keeps a pointer to this array and the array’s length in a list head structure. Some explanations can found at [1], [2]. The intuitive idea is represented through this simple picture.
Courtesy from Laurent Luce [2]
The first left column represents array of pointers to keep tracking of Python objects. The right column represents Python objects itself. Any insertion, append, removal of elements would affect arrangements of the first column (array of pointers), but not on the second column (Python objects). In fact, moving expensive Python objects around is more than costly than its pointers. In contrast, C++ vector utilizes array as underlying storage mechanism. In a sense, Python list [] is better than C++ vector in the insert operation. In particular, if you insert an element in the middle of the array, the Python list just only need to shift references of Python objects, while C++ need to shift the C++ objects to new positions. The efficiency, you can imagine, is usually between moving heavy class objects and moving slight pointers. However, C++ offers more containers that are suitable your need. For example, if you want to insert objects frequently, it is efficient to use C++ lists (implemented by a double linked-list).
typedef struct {
    PyObject_HEAD
    Py_ssize_t ob_size;

    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;

    /* ob_item contains space for 'allocated' elements.  The number
     * currently in use is ob_size.
     * Invariants:
     *     0 <= ob_size <= allocated
     *     len(list) == ob_size
     *     ob_item == NULL implies ob_size == allocated == 0
     */
    Py_ssize_t allocated;
} PyListObject;

    For me, Python is still new. And I think the best way to learn and understand a language is to ask simple and stupid questions like this. I have recently admired the development of Python language because it is motivated and evolved from exciting huge efforts of an open-source community.
    Of course, the container are quite an important concept of a programming language. The container in Python includes list, tupple, dict, string and something else. The container in C++11 includes vector, list (equivalent to Python list), forward_list (single linked-list), map (similar concept to Python dict), unorder_map, deque (double linked-list queue), string, and something else.
    Today, I have motivations to write blogs in Vietnamese. I decided that this blog is bilingual, i.e., English and Vietnamese. For me, it is easier to write technical contents in English, although Vietnamese is my mother tongue. It is because I tried to adapt to technical contents around Internet in English when I first came to learn computer science in university. Now, I find it hard to describe some technical concept in Vietnamese, especially with fast-pace changing field like Computer Science (CS). Overall, it is helpful because it is fun to contribute back to the community.

References:
[1] http://stackoverflow.com/questions/3917574/how-is-pythons-list-implemented
[2] http://www.laurentluce.com/posts/python-list-implementation/

Chủ Nhật, 19 tháng 7, 2015

OpenCV vs Matlab in Image Processing

OpenCv and Matlab are frequently used in image processing and computer vision because of their well-supported from OpenCv developers and Mathworks. In this post, I would like to highlight some differences in some basic concepts in memory layout, model, math expressions and etc. These concepts are very vital for programmers who use these tools.

1. Memory layout of an image
  • OpenCV supports only interleaved images (packing multiple channels one after the other for each pixel). This is more ridiculous and take notices when reading pixel values of opencv image.
  • Always to like this in scanning an image in Opencv 
    int channels = I.channels();

    int nRows = I.rows;
    int nCols = I.cols * channels;

    if (I.isContinuous())
    {
        nCols *= nRows;
        nRows = 1;
    }

    int i,j;
    uchar* p;
    for( i = 0; i < nRows; ++i)
    {
        p = I.ptr<uchar>(i);
        for ( j = 0; j < nCols; ++j)
        {
            p[j] = table[p[j]];
        }
    }
  • Matlab all of the channels clustered into image planes with the planes placed one after another. There is one advantage that matlab is homogenous, and single invariant to deal with.
2. Memory model
  • OpenCV is row-major
  • Matlab is column-major.

3. Matrix allocation and copy
  • Opencv: Do not expect a deep copy of an assignment operation in OpenCv. It just copies the header of Mat object.

  • Matlab: Somehow, Matlab will delay the deep copy until necessarily.
Ex: a = rand(5000);
      b = a;                // still not copy from a
      a(1) = 1;            // a will make a deep copy of itself and modify first element to 1.

This is the only way to implement Mat in opencv, because Mat will be shared between many variables rather than deep copying around, which is heavily prohibited for large object in memory.

4. Math experssions:
Although cv::Mat supports some mathematical expressions, it is very limited. Matlab is very intuitive and expressive language of math.

5. Matrix dimension in Opencv:
Semantic meaning x ~ width, y ~ height. But the first dim is y, second dim is x. 
For example, to access elements in position (x, y) in Mat, we should do
mat.at<int>(y, x).
Similarly, Matlab also uses the same notations.

6. Continuity of memory layout:
Memory layout for a matrix in Matlab is continuous, column after column. However, in Opencv, it can be separate or continuous. We can check its continuity by calling function Mat::isContinuous() in Mat objects. 
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-iscontinuous

7. Size vs. Size
OpenCV returns size() method as Size(cols, rows). This is inconsistent with Mat constructor Mat(rows, cols, type). While Matlab is always consistent, a matrix will return size as index dimensions of matrix (0, 1, 2, ...).
The problem with OpenCV that it has notations of width, height with width ~ x ~ cols, height ~ y ~ rows. Remembering this correspondence is problematic.
REMEMBER: Size(x, y).

Selamat Hari Raya
@An

Thứ Tư, 26 tháng 11, 2014

What happened if GCC search for libraries in C/C++

Hi all,
In some beautiful days, we wonder how GCC search for standard libraries like libstdc++.so. Cool! It really matters for those guys who works on developments of new standard libraries. They want to have both versions of libraries at the same time. It is a controversial topics. After I googled it, here is the summary I found.

There are two definitions denoted as ld you need to differentiate: linker in GCC and loader in linux. ld can refer to ld (GNU linker) (at compiling time). It can also refer to loader ld.so in linux (at running time).

How to know search path during linking and running time? 

During linking of GCC, we can use this instruction:
1/ You can do this by executing the following command:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012

2/ gcc passes a few extra -L paths to the linker, which you can list with the following command:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,;  ,g' | tr \; \\012

The answers suggesting to use ld.so.conf and ldconfig are not correct because they refer to the paths searched by the runtime dynamic linker (i.e. whenever a program is executed), which is not the same as the path searched by ld (i.e. whenever a program is linked).

The most important keynote: GCC search -L paths first, then the default library (i.e, 2 first, then 1).

During run-time:
ldconfig -v 2>/dev/null | grep -v ^$'\t'

Thứ Năm, 22 tháng 5, 2014

what happened after # in C/C++

Hi all,
If you ever want to know what will happen after including a header, what does GCC look for, or where does it find these headers, or then can I read this header files in Linux. Awesom.......e!!!
If you feel awesome, you need to know a little bit about it.
Well, GCC will look in default "include" folder in Linux such as
     /usr/local/include
     libdir/gcc/target/version/include
     /usr/target/include
     /usr/include

If you mention -Idir option in the command line or makefile scripts, it will search your directory first, then the default folder. For example, if you want to search for headers in current working folder, then use "-I."
More information,
https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html.