The editor war - the oldest rivalry in computing

Posted in General on December 20, 2015 by manhhomienbienthuy Comments
The editor war - the oldest rivalry in computing

Hãy tạm quên đi những cuộc cạnh tranh như Apple vs Samsung, hay Microsoft vs Apple. Trong bài viết này, chúng ta sẽ đề cập đến một cuộc cạnh tranh khác, một cuộc cạnh tranh kéo dài hàng thập kỷ, và kết quả là, nhờ đó, chúng ta có những sản phẩm tuyệt vời. Vâng, tôi đang nhắc đến Editor war, một cuộc chạy đua giữa các text editor trong cộng đồng các lập trình viên trong 40 năm. Đây là cuộc cạnh tranh có bề dầy lịch sử khá lâu đời.

Emacs manual from 1981

Trong một thế giới mà cả phần mềm lẫn phần cứng đều nhanh chóng trở nên lỗi thời chỉ sau vài năm phát hành, hai chương trình này, đồng thời cũng là đối thủ của nhau, có quyền tuyên bố rằng chúng là những chương trình tồn tại lâu nhất lịch sử. Cả hai chương trình sắp bước vào thập kỷ thứ 5 của chúng. Chúng đều là text editor, nhiệm vụ của chúng rất kinh điển là nhập và biên tập code, các file dữ liệu, v.v... Và chúng cũng là những đối thủ truyền kiếp, chúng cạnh tranh nhau ngay khi vừa được khai sinh.

Tên chúng là Emacs và Vi (gọi đúng kiểu các lập trình viên là vi). Những editor này là những huyền thoại, rất cổ điển và không hoa lệ. Chúng được phát triển từ những năm 1976, điều đó khiến chúng còn nhiều tuổi hơn phần lớn những người đang sử dụng chúng.

Cả hai đều là text editor, nên chúng sẽ không có tính năng nào tương tự như WYSIWYG (what you see is what you get), tính năng chỉ có trên các chương trình xử lý văn bản (word processor) như Microsoft Word.

Công việc lập trình rất khác với công việc xử lý văn bản, chúng ta không cần các file được trình bày đẹp nhưng có cấu trúc phức tạp, chúng ta chỉ cần các file mã nguồn (và cả các file dữ liệu) ở dạng text thông thường. Emacs và Vi đã đáp ứng điều đó, chúng đều là những chương trình giúp biên tập một cách dễ dàng và nhanh chóng mã nguồn các phần mềm (và các file text khác). Đây là mục tiêu tối thượng và cũng là quan trọng nhất với các lập trình viên. Cả hai chương trình đều đã được phát triển cho mục tiêu này trong 40 năm qua.

Hai chương trình kinh điển này cũng xứng đáng trở thành đối thủ của nhau nhất, xứng đáng hơn bất kỳ đối thủ nào trong bất kỳ một cuộc cạnh tranh nào khác. Nếu bạn biết một lập trình viên sử dụng một trong hai chương trình, Emacs hay Vi, thì khả năng rất lớn, anh ta sẽ ghét cay ghét đắng chương trình còn lại.

Điểm qua một chút về lịch sử phát triển của hai chương trình. Vi được phát triển bởi một huyền thoại là Bill Joy (người mà sau này sáng lập Sun Microsystems và tạo ra ngôn ngữ Java) khi còn là học viên sau đại học ở Berkeley. Sau đó, Vi được cung cấp như là một phần mềm nguồn đóng trong phần lớn các hệ thống Unix, mặc dù những clone phiên bản mã nguồn mở của Vi đã xuất hiện từ giữa những năm 80 cho đến tận bây giờ.

vi interface

Emacs có sự khởi nguồn là một nhánh của TECO từ MIT, một dự án của Guy Steele và Richard Stallman. Tuy nhiên nó chỉ thực sự trở nên nổi tiếng khi một huyền thoại khác là Richard Stallman phát triển một biến thể của nó, GNU Emacs vào giữa những năm 80 như là một phần của công cuộc chuyển sang phần mềm tự do mà chính Stallman dẫn đầu.

Trong khi Vi được duy trì là một chương trình gọn nhẹ thì Emacs lại có kích thước đáng kể. Vì vậy có một số câu nói đùa rằng Emacs là viết tắt của "Emacs Makes a Computer Slow" và "Eight Megabytes and Constantly Swapping" (thời điểm đó, 8MB là một phần bộ nhớ rất lớn).

Vi được viết khi mà các máy tính còn rất chậm, bộ nhớ ít. Và với phần cứng như thế, bạn sẽ chẳng muốn bất cứ thứ gì có thể làm chậm công việc của bạn như phải thao tác nhiều hơn, hay đồ họa đẹp làm máy tính chậm hơn. Joy thiết kế Vi cho những máy tính có tốc độ in text ra màn hình còn chậm hơn cả tốc độ gõ của người dùng. Như Joy đã nói vào 1999:

I was trying to make it usable over a 300 baud modem ... the editor was optimized so that you could edit and feel productive when it was painting slower than you could think.

Thậm chí ngay cả bây giờ, hiệu suất vô song của nó khiến nó có những tín đồ trung thành, những người có thể phát điên vì sự chậm trễ của tiện ích nặng nề (ví dụ những kỹ sư phần mềm). Vi là một trong số ít phần mềm bạn có thể thao tác mà không cần di chuyển các ngón tay nhiều, thậm chí không cần phải di chuyển ngón tay ra khỏi khu vực phím trung tâm. Bạn không cần sử dụng các phím mũi tên (bạn có thể dùng các phím H, J, K, và L).

Emacs, ngược lại, lại cung cấp một môi trường biên tập rất tiện lợi và dễ dàng thao tác, với các lệnh được gán vào các tổ hợp phím, ví dụ như Ctrl-S để tìm kiếm, Ctrl-X Ctrl-S để lưu file, v.v... Emacs cung cấp nhiều phản hồi cho phía người dùng hơn là chỉ kêu những tiếng bíp vô nghĩa. Nó có khả năng định dạng text rất tốt và có nhiều tiện ích cho các lập trình viên trong rất nhiều, rất nhiều ngôn ngữ.

Sự khác biệt rất lớn được thể hiện ngay trong chính tư tưởng thiết kế của 2 chương trình, đó là cách mà chúng tiếp nhận yêu cầu từ người dùng. Vi là một editor loại modal, Emacs thì modeless.

Phần lớn các editor hiện này đều là modeless. Modeless nghĩa là editor được thiết kế để nhập văn bản ngay sau khi khởi động. Bất cứ khi nào người dùng gõ phím, các ký tự sẽ được điền vào văn bản. Để thao tác các lệnh của editor, các tổ hợp phím, các phím chức năng hoặc chuột sẽ được sử dụng.

Modal thì ngược lại, editor sẽ chuyển qua lại giữa 2 chế độ tiếp nhận văn bản và nhận lệnh. Điều đó có nghĩa là các phím sẽ được sử dụng để viết code, cũng được sử dụng để đưa ra các chỉ dẫn cho editor.

Mỗi cách tiếp cận đều có ưu điểm riêng. Modeless là cách làm rất trực quan, có lẽ vì thế mà phần lớn các editor đều theo cách này. Nó có một nhược điểm là các tổ hợp phím thường dài hơn, khó nhớ hơn và cũng không thể thao tác nhanh được. Modal, ngược lại, rất khó khi mới bắt đầu. Nhưng một khi đã thành thạo, việc biên tập sẽ nhanh hơn rất nhiều vì các lệnh dễ nhớ hơn.

Một điểm khác biệt dễ nhận ra nhất đó là Vi nhanh hơn Emacs. (Những người hâm mộ Vi nói rằng bạn có thể học các lệnh của Vi trong thời gian chờ Emacs khởi động). Tuy nhiên, khi mà ngày nay, phần cứng máy tính đã rất phát triển, thì cả Vi và Emacs đều nhanh hơn rất nhiều so với những IDE hiện đại như Eclipse hay Microsoft Visual Studio.

Những người dùng Vi thấy không có lý do nào mà phải hy sinh sự hiệu quả để kích thước chương trình tăng lên và tốc độ giảm đi như Emacs. Những fan của Emacs thì đáp trả rằng, bạn chỉ cần bật Emacs lên một lần và không cần bật thứ gì khác.

Emacs rất mềm dẻo và linh hoạt. Bạn có thể tùy biến mọi thứ. Ví dụ, phần lớn các lệnh của Emacs đều dựa vào tổ hợp phím của phím ESC hoặc Ctrl, ngoại trừ ESC-X đưa bạn vào chế độ gõ lệnh với khả năng autocomplete. Nhưng hai phím trên khiến ngón tay của bạn phải đi rất xa, và các lập trình viên thường kêu ca vì điều này.

emacs vim use hand

Nhưng đó không phải là vấn đề, bởi Emacs cho phép bạn remap các phím một cách dễ dàng, ví dụ bạn có thể chuyển phím Ctrl thành Caps Lock và chuyển ESC thành Alt. Thêm nữa, rất nhiều lệnh có thể được gán vào các tổ hợp phím tùy theo nhu cầu của bạn. Lập trình viên có thể tùy biến Emacs đến từng chi tiết nhỏ nhất cho phù hợp với nhu cầu của mình.

Emacs bản thân nó cũng tích hợp sẵn một ngôn ngữ lập trình, một biến thể của LISP, gọi là Emacs Lisp, nó cho phép bạn lập trình tất cả các tính năng cho editor, không chỉ biên tập và định dạng văn bản, mà bạn có thể làm mọi thứ, truy cập và quản lý file, đồng hồ, duyệt Web, gửi mail, v.v.... Thực sự bạn có thể làm hầu hết mọi công việc với máy tính chỉ thông qua Emacs.

Tôi biết có nhiều người sử dụng Emacs như một hệ điều hành, tất cả mọi thao tác đều trên Emacs chứ không cần thêm một chương trình nào khác. Emacs cho chúng ta khả năng tiếp cận dễ dàng hơn Vi, nhưng sự khó khăn không phải là không có, nhất là khi bạn cần những thao tác nâng cao. Khả năng vô hạn của Emacs có thể giúp bạn hưởng thụ cuộc sống và làm việc chỉ với 1 chương trình.

emacs

Những người ghét Vi nói rằng, bạn chỉ cần nhớ duy nhất một lệnh với 3 ký tự, đó là :q! - bởi vì đây là lệnh để thoát Vi. Lần đầu tiên tôi sử dụng Vi, tôi rất khó khăn khi không biết phải làm thế nào để bắt đầu viết code. Và tôi cũng không biết phải làm gì để thoát khỏi nó. Tôi gõ phím và Vi chỉ đơn giản phát ra những tiếng bíp báo rằng tôi đã thao tác sai. Ngay cả các phím mũi tên cũng không hoạt động.

Bây giờ thì tôi biết rằng, khi Vi được bật lên, nó sẽ ở chế độ gọi là "normal mode", ở chế độ này, bạn không thể viết gì cả, chỉ có thể thao tác biên tập nội dung có sẵn mà thôi. Khi bạn ấn phím i, nó sẽ chuyển sang "insert mode", cho phép bạn thao tác với nó như với một editor thông thường. Bạn ấn ESC và nó lại quay trở lại "normal mode", và ở đây, tôi ấn :q! để thoát ra. Đó là một vài hiểu biết sơ lược về Vi. Sử dụng Emacs vẫn dễ dàng hơn.

Đó là một sự khởi đầu khá chông gai cho tôi khi làm quen với Vi, và tôi nghĩ rằng, nhiều người khi mới làm quen với Vi cũng như vậy. Nhưng đổi lại, khi đã master các lệnh của Vi rồi thì nó sẽ cho bạn sức mạnh rất lớn và công việc lập trình trở nên dễ dàng hơn rất nhiều.

Tôi nghĩ rằng, các chuyên gia sử dụng Vi sẽ có khả năng biên tập mã nguồn nhanh hơn những người sử dụng các chương trình khác, không chỉ vì các lệnh của Vim rất hiệu quả mà chính bản thân Vi cũng rất nhẹ nhàng, xử lý truy vấn nhanh và đáp ứng gần như ngay lập tức tất cả các thao tác của người dùng.

Một lập trình viên tên là Larry Marburger đã có một so sánh nhỏ giữa Vi và Emacs. Thực ra, dùng Vi cũng rất thích. Một số thao tác với Vi có thể thực hiện rất dễ dàng như về trước 5 từ, 5b, xóa 6 dòng tiếp theo d6j, tìm kiếm bất cứ từ nào kể từ vị trí hiện tại *, thêm dấu nháy vào tất cả các dòng trong file - 1 lệnh 18 ký tự :%s/\(^\|$\)/\"/g

Phần lớn mọi người đều thấy không quen khi mới làm việc với Vi, vì ít có editor nào lại hoạt động như Vi. Đúng là khi chưa thành thạo thì các lệnh của Vi rất khó thao tác, nó khác hoàn toàn với những editor thông thường, chúng ta phải học rất nhiều thứ. Nhưng khi đã thành thạo rồi thì lại không muốn dùng chương trình nào khác.

vi cheatsheet

Về tổng thể, sự cạnh tranh của hai chương trình rất rõ ràng. Một mặt, là sự thanh lịch và hiệu quả của Vi, cho phép lập trình viên đạt được mục tiêu quan trọng nhất là viết code mà không cần di chuyển ngón tay quá nhiều. Mặc khác, sự linh hoạt, mềm dẻo và khả năng tích hợp mọi thứ của Emacs, thứ mà bạn có thể tùy biến và mở rộng cho đến khi nó đáp ứng được các yêu cầu và cá tính của bạn.

Vi tiêu chuẩn hóa sự hoàn hảo còn Emacs trừu tượng hóa sự tổng quát, đó cũng là hai trong số những lý tưởng cao nhất của các kỹ sư công nghệ. Cuộc cạnh tranh giữa hai chương trình cho bạn thấy một thực tế phũ phàng rằng những lý tưởng cao đẹp thường không tương thích với nhau.

Đôi khi tính cách cá nhân của mỗi người cũng được thể hiện qua việc họ sử dụng chương trình nào: có thể họ thích một hệ thống cứng nhắc nhưng phổ biến (như Vi) hay họ thích một hệ thống duy nhất tích hợp mọi thứ cho họ (như Emacs).

Tim O'Reilly của O’Reilly Media, đã chuyển sang dùng Vi sau khi những cấu hình Emacs của anh ta vô tình bị phá hủy. Anh ta quyết định đi theo "cult of Vi", ca ngợi Vi ở mọi mặt. (Mặc dù anh ta nói rằng mình không đổ thêm dầu vào lửa.)

It was just there on any system I sat down at.

Tác giả hạt nhân Linux, Linus Torvalds thì ngược lại, không chỉ hâm mộ Emacs (thực ra là một biến thể của nó là MicroEmacs) mà anh ta còn thay đổi mã nguồn của nó để nó phù hợp hơn với nhu cầu cá nhân.

Nhưng bất cứ một lập trình viên nào cũng có thể phải biên tập và chỉnh sửa mã nguồn trên máy tính khác, có thể hệ thống đó không có sẵn Emacs (thảm họa!!). Những lúc như vậy, phụ thuộc vào Emacs quả thật là một gánh nặng. Vì vậy nhiều người dùng Emacs đã miễn cưỡng học cách sử dụng Vi về cơ bản.

Về phần mình, sự bó buộc của Vi cũng đã được giảm đi đáng kể sau nhiều năm, nó có nhiều tính năng hơn và cũng nhiều extension hơn, đặc biệt là với clone đầy sức mạnh của nó là Vim. Nó cung cấp một số tính năng phổ biến và được ưa chuộng của Emacs cũng như game Tetris.

I apologise for any typos. If you notice a problem, please let me know.

Thank you all for your attention.