+2

[Bài 1] Flutter - Tổng quan

Xin chào, mình là Moon.

Đây là bài viết đầu tiên của mình trên nền tảng Viblo. Mình chỉ muốn đem những gì mình học được, diễn giải lại theo cách nghĩ của mình, với ngôn từ dễ hiểu, thân thương, gần gũi, và mong rằng, sẽ giúp ích phần nào đó cho mọi người.

Đôi chút về mình. Mình là sinh viên năm 3 chuyên ngành công nghệ thông tin tại một đại học tư thục. Mình đã bắt đầu vào chuyên ngành. Trong đó có môn Lập trình cho thiết bị di động. Trường mình dạy công nghệ Flutter. Đây là một công nghệ lập trình cross platform (đa nền tảng) mới, chưa có nhiều trường đại học dạy về công này. Mình rất khó khăn trong việc tìm tài liệu học tập cả tiếng Việt lẫn tiếng Anh. Tại thời điểm mình viết bài này, chưa xuất hiện một chương trình đào tạo, một giáo trình bài bản tiếng Việt nào về công nghệ này. Mình cũng kém tiếng Anh nữa, nên việc đọc docs từ trang chủ Flutter và xem video tiếng Anh trên Youtube là việc quá sức đối với mình.

Mình tin rằng có nhiều bạn gặp khó khăn giống mình (hoặc không). Mình viết bài này (có thể là một series) về những gì mình học được, làm được với Flutter. Đây giống như là một note, story ghi lại quá trình học của mình hơn là một tutorial. Mình không muốn viết vào đây những kiến thức lý thuyết khô khan, hàn lâm. Khả năng của mình cũng không cho phép mình làm việc đó. Mình chỉ muốn viết mọi thứ theo cách hiểu, theo cách nghĩ, và theo ngôn từ của mình.

Luyên thuyên đủ rồi, bắt đầu vào chủ đề chính luôn thôi.

Tại sao lại là Flutter?

Lý do chính bởi vì trường mình dạy Flutter. Flutter là lựa chọn bắt buộc. Nếu không học mình sẽ trượt môn và đóng tiền học lại vì đây là môn chuyên ngành bắt buộc. Bố mẹ ở quê sẽ rất buồn về mình.

Lý do tiếp theo có lẽ là Flutter là một công nghệ lập trình cross platform. Hiểu đơn giản, lập trình cross platform có nghĩa là bạn tạo ra ứng dụng trên nhiều nền tảng khác nhau chỉ từ một codebase duy nhất (single codebase). Flutter hỗ trợ các nền tảng sau:

  • Window
  • MacOS
  • Linux
  • Android
  • IOS
  • Web
  • Có thể hỗ trợ các nền tảng khác nữa mà mình không biết. Nhưng biết nó hỗ trợ bằng này nền tảng cũng quá đủ rồi.

Nghe thật diệu kỳ đúng không? Trước đây, khi code xong cho android, nếu muốn build thêm cho IOS, người ta phải dịch code sang IOS (đương nhiên phải học thêm Swift hoặc Objective C của Apple, hoặc không nếu đã biết). Với Fluter, bạn chỉ cần code một lần duy nhất, việc build ra các nền tảng khác Flutter sẽ lo hết cho bạn.

Đương nhiên, cái gì dành cho số đông cũng không thể tối ưu bằng việc cá nhân hóa. Quần áo mua không thể vừa vặn bằng quần áo may được. Mọi thứ đều là sự đánh đổi. Build đa nền tảng, cái lợi là code ít hơn, nhưng phải đánh đổi bằng hiệu năng so với việc code riêng cho từng nền tảng.

Ngoài Flutter, còn một công nghệ nổi tiếng khác cũng có tính năng cross platform, dó là React native. Kiến trúc của hai công nghệ này khác nhau, nhưng điểm chung là đều cần phải có một bộ dịch để dịch code sang kiến trúc của các nền tảng khác nhau. Về hiệu năng thì theo trí nhớ của mình, Flutter có hiệu năng cao hơn một chút so với React native.

Đôi nét về Flutter

Flutter là một framework do Google phát triển vào năm ... (mình không nhớ nữa, hình như lần phát hành phiên bản ổn định đầu tiên năm 2018) dựa trên ngôn ngữ lập trình Dart (cũng do Google phát triển). Mình có cảm giác như kiểu Google tạo ra Dart với mục đích chính để xây dựng một framework nào đó ấy.

Flutter là một framework với cú pháp ngoặc ngôn ngữ C (C-style), hỗ trợ lập trình hướng đối tượng với cú pháp như Java, xây dựng giao diện với cơ chế Widget, giống với tư duy code HTML/CSS.

Nếu bạn nào đã học chắc môn Nhập môn lập trình (hoặc tên khác nhưng nội dung tương đương, đại loại là môn lập trình đầu tiên ở trường đại học), Lập trình hướng đối tượng và Xây dựng ứng dụng web thì học sang Flutter bạn sẽ tiếp cận được rất là dễ dàng. Mình học trên lớp thì buổi đầu quét sạch cú pháp của lập trình Dart, buổi thứ hai quét sạch hướng đối tượng trong Dart, buổi thứ ba chuyển sang Flutter.

Có cần học Dart trước khi học Flutter không?

Mình nghĩ là có. Một chút chút.

Don't worry nếu bạn đã nắm chắc ba môn mình vừa đề cập. Bạn có thể viết ngay chương trình Hello World đầu tiên bằng Flutter mà không cần biết Dart là gì. Nhưng để việc học mượt mà hơn, có lẽ mình sẽ viết 1 (hoặc 2 gì đó) bài đi nhanh toàn bộ cú pháp cơ bản của Dart.

Còn nếu bạn chưa nắm chắc ba môn kia, mình nghĩ có lẽ bạn chưa thực sự phù hợp để tìm hiểu Flutter. Nói gì nói, đây vẫn là một môn chuyên ngành của trường mình, và không phải một sinh viên mới vào trường hoặc một sinh viên năm 3 nhưng rỗng kiến thức có thể học được. Học môn chuyên ngành mà dễ thế thì quê mình đua nhau bán nhà cho con cái đi học đại học hết rồi.

Viết chương trình Hello World đầu tiên

Bước 1: Cài đặt môi trường

Mình dùng Windows 11 nên trong bài mình sẽ hướng dẫn trên Windows 11.

Để chạy được Flutter, máy của bạn cần có 2 thứ sau:

  1. Android Studio
  2. Flutter SDK
  3. [Optional] Một text editor bất kỳ (recommend neovim nhưng mình sẽ hướng dẫn trên VSCode)

Mình coi như máy bạn chưa có gì. Nếu máy bạn đã có công cụ tương ứng, vui lòng bỏ qua bước cài công cụ đó.

[Optional] Nếu gặp lỗi trong quá trình setup và chạy, recommend gỡ cài đặt cả 3 công cụ như trên và tải lại từ đầu theo hướng dẫn của mình.

Bước 1.1: Tải scoop

Bước 1.1.1: Tải scoop

Ở đây, mình dùng scoop để quản lý mọi thứ. Hiểu đơn giản, scoop là một trình quản lý cài đặt gói (ứng dụng, phần mềm) trên Windows. Nếu Python có pip, Nodejs có npm, Lua có Luarocks thì Windows có scoop. Đây là một trình quản lý gọn nhẹ, tập trung.

Chúng ta sử dụng scoop để cài đặt tất cả các công cụ còn lại.

Để cài đặt scoop, mở Windows terminal và thực hiện lệnh sau:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex

Thông thường, bất kỳ một công cụ nào cài đặt trên máy đều cung cấp lệnh thường là:

[name_tool] --version

để kiểm tra xem công cụ đó đã được cài đặt thành công trên máy chưa. Scoop cũng không ngoại lệ. Để kiểm tra xem scoop đã được cài đặt chưa, gõ lệnh:

scoop --version

Nếu kết quả xuất hiện như hình dưới, hoặc tương tự (miễn không phải những dòng chữ đỏ lòm) nghĩa là scoop đã được cài đặt thành công

Bước 1.1.2: Tải Git

Tại sao phải tải Git?

Kệ đi, mình bảo tải thì cứ tải.

Để tải git, sử dụng lệnh sau:

scoop install git

Bước 1.1.3: Thêm bucket extras

Mặc định scoop chỉ có bucket main. Hiểu đơn giản, bucket là các kho lưu trữ ứng dụng, giống như kiểu chợ ứng dụng CH Play trên Android hoặc App Store trên IOS.

Bucket main có số lượng ứng dụng hạn chế. Chúng ta cần thêm bucket extras để tải được nhiều thứ hay ho hơn.

Để thêm bucket extras, ta sử dụng lệnh sau:

scoop bucket add extras

Ở bước 1.1.2, mình muốn các bạn tải Git vì việc thêm bucket yêu cầu Git.

Bước 1.2: Cài đặt Android Studio

Để cài đặt Android Studio, sử dụng lệnh sau:

scoop install android-studio

Sau khi cài đặt thành công Android Studio, thực hiện các bước sau để mở:

  1. Ấn phím Windows (có biểu tượng cửa sổ)
  2. Gõ "android"
  3. Cửa sổ hiện ra có ứng dụng Android Studio, click chuột vào ứng dụng

Sau khi mở ứng dụng, cần thực hiện trình tự setup như sau:

Ok, vậy là đã setup xong Android Studio, bạn có thể đóng cửa sổ ứng dụng lại được rồi.

Bước 1.3: Tải Flutter

Để tải Flutter, sử dụng lệnh sau

scoop install flutter

Để kiểm tra xem Flutter đã cài đặt thành công chưa, sử dụng lệnh sau:

Kiểm tra kiến thức: Sử dụng lệnh kiểm tra một
công cụ đã được cài đặt thành công chưa để kiểm tra flutter

Sau khi xác nhận Flutter đã được tải thành công, chạy lệnh sau để kiểm tra môi trường cho Flutter:

flutter doctor

Bạn có thể thấy, trong ảnh có warning là một vài chứng chỉ chưa được chấp nhận.

Flutter gợi ý sử dụng lệnh:

flutter --android-licenses

để chấp nhận chứng chỉ. Các bạn gõ lệnh trên và gõ y + enter cho đến khi chấp nhận hết các chứng chỉ.

Khi chấp nhận hết các chứng chỉ, giao diện sẽ như sau:

Ở kết quả của lệnh flutter doctor, nếu điều kiện

hiện dấu chấm than vàng hoặc đỏ thì cũng không sao cả, vì chúng ta đang hướng đến việc build app cho mobile nên chưa cần điều kiện đó.

Điều kiện đầu tiên màu vàng cũng không sao cả. Do chúng ta cài flutter qua scoop nên nó bị warning như vậy.

Sau khi chấp nhận hết tất cả các chứng chỉ có nghĩa là các bạn đã setup flutter thành công.

Bước 1.4: Tải VSCode

Scoop lợi ở chỗ bạn không cần lên trình duyệt gõ ứng dụng cần tải, chọn version phù hợp, download, giải nén hoặc chạy file thực thi (executable). Với scoop, bạn chỉ cần một lệnh duy nhất.

Để tải VSCode, sử dụng lệnh sau:

scoop install vscode

Đến đây, chắc bạn cũng hình dung ra cú pháp để tải một thứ gì đó qua scoop (nếu scoop hỗ trợ, bởi không phải ứng dụng nào scoop cũng hỗ trợ, nhất là những ứng dụng thiên về đồ họa).

Cú pháp chung để tải một ứng dụng qua scoop như sau:

scoop install [name_app]

Để xem danh sách ứng dụng đã cài đặt qua scoop, sử dụng lệnh sau:

scoop list

Để update ứng dụng đã tải, sử dụng lệnh sau:

scoop update [name_app]

Note: Không update thủ công các ứng dụng được cài đặt bởi scoop. Chỉ update qua một và chỉ một cách thức: Sử dụng lệnh update mình đề cập ở trên.

Sau khi tải thành công VSCode, các bạn mở ứng dụng theo hướng dẫn mở Android Studio mình đã trình bày ở trên.

Để code Flutter, các bạn cần cài thêm một extension trong VSCode. Để cài extension, các bạn thực hiện các bước sau:


Phùuuuuuu........Cuối cùng đã setup xong môi trường. Đối với lập trình viên, việc setup môi trường chưa bao giờ là hết rắc rối. Mình học trên lớp, thầy có nói là có những sinh viên đến giữa học phần rồi vẫn chưa setup được môi trường. Nên nếu bạn làm đến đây và thành công thì là quá giỏi rồi. Xứng đáng tạm dừng và tự thưởng cho bản thân chút gì đó, như rủ người yêu đi uống trà sữa chẳng hạn, uống xong rồi mới quay lại đây code chương trình Hello World đầu tiên.

Bước 2: Kết nối Emulator

Tiếp theo, bạn cần kết nối Emulator để xem được kết quả trong và sau khi code. Hiểu đơn giản, Emulator là một máy ảo Android chạy trên máy tính, giúp lập trình viên đóng gói, tải về và sử dụng ứng dụng như trên điện thoại thật. Nếu có thể, bạn hãy kết nối với điện thoại thật, bạn sẽ được trải nghiệm cảm giác "ù òa mình đã tự tay code được một cái app trên điện thoại thật". Ta nói cảm giác này nó tự hào vãi ò luôn á.

Note: Emulator khá tốn RAM, khuyến nghị RAM >= 16 GB

Để kết nối Emulator, các bạn thực hiện các bước như sau:

Đầu tiên, gõ lệnh:

flutter emulators

Lệnh này liệt kê các Emulator khả dụng trên máy bạn. Mặc định, Android Studio sẽ setup sẵn cho bạn một Emulator với API 36 (tại thời điểm mình viết bài này). Bạn chỉ việc sử dụng mà không cần tạo mới.

Kết quả của lệnh trên như sau:

Flutter gợi ý luôn là sử dụng lệnh flutter emulators --launch <emulator id> để chạy Emulator. Vậy thì mình làm theo thôi.

flutter emulators run --launch Medium_Phone_API_36.0

Sau khi chạy lệnh trên, sẽ có một cái điện thoại ảo xuất hiện trên màn hình. Không hiểu sao, máy mình thì cái điện thoại đấy toàn bị trồi lên trên và bị lấp mất. Nếu bạn cũng gặp tình trạng tương tự, bạn chỉ cần rê chuột vào mép dưới cái điện thoại đến con trỏ chuột biến thành hình mũi tên, kéo xuống là cái điện thoại nó ra giữa màn hình của bạn. Sau khi cái điện thoại ra giữa, bạn có thể để nó sang bên phải màn hình cho dễ quan sát.

Bước 3: Viết ứng dụng đầu tiên

Để viết ứng dụng đầu tiên, chúng ta cần một nơi để lưu code. Ở đây, mình lưu luôn vào folder flutter. Các bạn mở Windows terminal, gõ lệnh sau để tạo folder:

mkdir flutter

Trong đó, mkdirmake directory.

Tiếp theo, mình di chuyển vào folder vừa tạo bằng lệnh:

cd flutter

Trong đó, cdchange directory.

Để khởi tạo dự án flutter, các bạn gõ lệnh

flutter create myapp

Sau khi dự án được tạo thành công, mình tiếp tục di chuyển vào thư mục dự án bằng lệnh:

cd myapp

Sử dụng lệnh:

flutter run

để build app ra Emulator.

Mặc định, Flutter đều mặc định viết sẵn một counter app khi khởi tạo dự án Flutter. Chúng ta chạy luôn app mặc định này để test xem Emulator đã hoạt động ổn định chưa.

Note: Lần đầu chạy dự án có thể mất đến 5 - 7 phút.

Sau khi chạy thành công, Emulator sẽ có giao diện như này:

Đến đây, các bạn đã setup mọi thứ đầy đủ để bắt đầu code Flutter được rồi.

Các bạn mở VSCode, chọn folder vừa khởi tạo bằng flutter. Folder nằm ở C:\Users\<tên user>\flutter\myapp\

Sau khi import dự án thành công, VSCode sẽ có giao diện như sau:

Các bạn đừng quan tâm nhiều đến cấu trúc thư mục dự án, cái chúng ta cần quan tâm là làm sao viết được chương trình Hello World đầu tiên.

Các bạn vào folder lib, sẽ thấy một file có tên main.dart.

Đây là điểm bắt đầu của chương trình khi thực thi. Chúng ta sẽ làm việc với file main.dart này để viết chương trình đầu tiên.

Các bạn xóa toàn bộ nội dung trong file main.dart và thực hiện theo hướng dẫn sau.

Đầu tiên, chúng ta cần import thư viện. Ở đây, có một thư viện chúng ta nên luôn luôn khai báo, đó là thư viện package:flutter/material.dart. Thư viện này có tất cả mọi thứ cơ bản theo phong cách thiết kế material. Các bạn viết dòng sau vào dòng đầu tiên của file main.dart.

import 'package:flutter/material.dart';

Tiếp theo, chúng ta cần gọi hàm main. Đây là điểm xuất phát của chương trình

import 'package:flutter/material.dart';

void main() {
}

Trong hàm main, chúng ta gọi hàm runApp() để chạy chương trình

import 'package:flutter/material.dart';

void main() {
  runApp();
}

Hàm runApp() nhận vào một Widget. Hiểu đơn giản, mọi thứ trên màn hình và không trên màn hình đều là Widget, từ văn bản, hình ảnh, nút bấm, trường nhập liệu, thậm chí cả khoảng cách, ... cũng là Widget. Các bạn chưa cần quá đi sâu vào khái niệm này, chúng chỉ cần nắm được cái khung cú pháp để viết được chương trình đầu tiên nhanh nhất.

Mọi Widget đều nằm trong Widget MaterialApp. Mình sẽ truyền nó vào cho hàm runApp().

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp());
}

Bản chất Widget cũng là một class. Một class sẽ có thuộc tính và phương thức. Việc dựng giao diện bằng Flutter chính là việc chúng ta sử dụng các thuộc tính của Widget người ta đã xây dựng sẵn, truyền cho nó giá trị phù hợp để hiển thị giao diện mình mong muốn.

MaterialApp giống như là cái khung, môi trường cho ứng dụng chạy, nó bọc bên ngoài toàn bộ các Widget khác

Mình sử dụng thuộc tính home của MaterialApp để khai báo Widget tiếp theo. Cú pháp như sau:

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: Text('hello world'),
  ));
}

Để hiển thị một văn bản, chúng ta sử dụng Widget `Text' và truyền vào văn bản muốn hiển thị, đặt trong cặp dấu nháy đơn hoặc nháy kép.

Các bạn lưu file lại. Sau đó, quay trở lại Windows terminal. Để cập nhật giao diện Emulator theo code mới chúng ta vừa code, các bạn gõ R. Nó gọi là các key commands. Mình sử dụng 2 key commands phổ biến như sau:

R: Hot restart
q: Quit

Sau khi gõ R, Emulator sẽ hiển thị giao diện như sau:

Rõ ràng, đây là một giao diện quá ư là xấu xí. Code app tỏ tình tặng crush mà như này chắc bạn ấy sẽ tặng cho một cú vả nồng cháy quá.

Để cho giao diện đẹp đẽ hơn, chúng ta cần bọc nó trong một cái màn hình. Cái màn hình ở đây chính là Widget Scaffold. Trong Scaffold có thuộc tính body, chúng ta sẽ để những Widget muốn hiển thị lên màn hình vào trong đó.

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      body: Text('hello world'),
    ),
  ));
}

Tiếp tục sử dụng phím R thần thánh trong Windows terminal, chúng ta sẽ thu được giao diện như sau:

Rõ ràng, cái giao diện nó vẫn quá ư là xấu xí. chữ hello world bị chèn vào cả phần dành cho thông báo.

Để khắc phục vấn đề này, chúng ta cần sử dụng một Widget bảo vệ, đó chính là SafeArea. Chúng ta sẽ bọc Widget này bên ngoài Scaffold để Scaffold nằm gọn trong vùng an toàn của màn hình.

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: SafeArea(
      child: Scaffold(
        body: Text('hello world'),
      ),
    ),
  ));
}

Lưu file lại và sử dụng phím R thần thánh để xem kết quả

Có vẻ đã đẹp hơn rồi đó, hello world không bị lấn sân sang phần dành cho thông báo nữa.

Tuy nhiên, để ở góc thì hơi khó quan sát, giờ mình muốn nó ra giữa màn hình thì làm nào?

Để cho một cái gì đó ra giữa đâu đó, chúng ta sử dụng Widget bố cục Center. Chúng ta để những gì muốn căn giữa vào thuộc tính child của nó.

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: SafeArea(
      child: Scaffold(
        body: Center(
          child: Text('hello world'),
        ),
      ),
    ),
  ));
}

Lưu file lại và R, chúng ta thu được giao diện như sau:

Chữ hello world đã ra giữa. Tuy nhiên, mình thấy app hơn đơn điệu, mình muốn cách điệu một chút bằng việc thêm một cái app bar ở trên đầu, đơn giản chỉ để thông báo cho người dùng đây là app gì.

Để thêm app bar, chúng ta sử dụng thuộc tính appBar của Scaffold, thuộc tính này nhận một Widget, và Widget chúng ta truyền cho nó là AppBar.

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: SafeArea(
      child: Scaffold(
        appBar: AppBar(),
        body: Center(
          child: Text('hello world'),
        ),
      ),
    ),
  ));
}

Để hiển thị tiêu đề trên app bar, chúng ta sử dụng thuộc tính title của AppBar.

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: SafeArea(
      child: Scaffold(
        appBar: AppBar(
          title: Text('My App'),
        ),
        body: Center(
          child: Text('hello world'),
        ),
      ),
    ),
  ));
}

Cùng xem kết quả nào

Nhưng mà để như này vẫn chưa rõ ràng lắm, mình không biết app bar sẽ kéo dài đến đâu. Để cho rõ ràng hơn, mình sẽ thêm màu nền cho nó.

Để thêm màu nền, chúng ta sử dụng thuộc tính backgroundColor với giá trị nhận và là một enum của color.

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    home: SafeArea(
      child: Scaffold(
        appBar: AppBar(
          title: Text('My App'),
          backgroundColor: Colors.blue,
        ),
        body: Center(
          child: Text('hello world'),
        ),
      ),
    ),
  ));
}

Vì crush của mình thích màu xanh nên mình chọn giá trị blue cho app bar. Các bạn chỉ cần gõ Colors., VSCode sẽ gợi ý cho bạn các màu để chọn.

Cùng xem kết quả nào

Hmm...cũng ra hình hài của một cái app rồi đấy chứ!

Cuối cùng, mình thấy cái chữ debug màu đỏ bên trên góc phải màn hình làm mình không vừa mắt, nên mình sẽ ẩn nó đi bằng thuộc tính debugShowCheckedModeBanner. Nó thuộc MaterialApp, mặc định giá trị của nó là true, mình sẽ set lại nó thành false.

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    home: SafeArea(
      child: Scaffold(
        appBar: AppBar(
          title: Text('My App'),
          backgroundColor: Colors.blue,
        ),
        body: Center(
          child: Text('hello world'),
        ),
      ),
    ),
  ));
}

R và xem kết quả nào

Vậy là sau n bước setup lằng nhằng, chúng ta đã có thể viết được chương trình đầu tiên. In ra màn hình dòng chữ hello world vốn là một công việc dễ dàng, là chương trình đầu tiên mà ai nhập môn lập trình cũng đều trải qua. Nhưng khi đặt trong những môi trường khác nhau, dưới những điều kiện khác nhau thì công việc đó không còn dễ dàng nữa.

Nhớ hồi mình học C, là môn lập trình đầu tiên mình được học ở đại học. Để in ra được hello world, mình phải cài trình biên dịch bằng lệnh sudo apt install gcc. Dùng vi tạo một file hello.c đầu tiên và viết printf("hello world\n");. Sau đó lại phải gcc hello.c, rồi lại ./a.out để chạy. Mình tưởng như thế đã lằng nhằng lắm rồi ai ngờ học sang môn Hệ điều hành, mình phải viết hello world khi chỉ có một cục kim loại (laptop). Không môi trường, không driver, không gì cả, chỉ có mình và chiếc máy tính. Cảm giác phải tự định nghĩa hàm printf bằng việc thao tác với từng bit địa chỉ bộ nhớ nó thật là khủng khiếp.

Bởi vậy, ngay cả một công việc tưởng chừng như không thể đơn giản hơn như viết chương trình hello world cũng có thể trở nên cực kỳ khó khăn khi thay đổi môi trường.

Chúng ta nên biết ơn những người, phải nói là thiên tài, đã làm cho máy tính trở nên dễ dùng hơn bao giờ hết. Chúng ta đang đứng trên vai người khổng lồ và nên trân trọng người khổng lồ đó.

Ok, luyên thuyên vậy cũng đủ rồi. Bài viết cũng đã dài. Hẹn gặp lại ở những bài viết sau.

Tạm biệt, mình là Moon.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí