Enlightenmentware - Những phần mềm giúp tôi khai sáng
(mmapped.blog)- UNIX, Git, Emacs, Boost.Graph, Bazel
- Với tư cách là một lập trình viên, mỗi ngày tôi đều tương tác với các công cụ phần mềm, nhưng phần lớn chúng chỉ đơn thuần giúp hoàn thành công việc ở mức tối thiểu
- Thỉnh thoảng, ta bắt gặp những phần mềm vượt xa tính hữu dụng đơn thuần: chúng kích thích trí tưởng tượng, mở ra những khả năng mới và ảnh hưởng đến cách ta thiết kế hệ thống
- Tôi gọi những phần mềm như vậy là “phần mềm khai sáng” (Enlightenmentware)
- Với lập trình viên, nguồn khai sáng phổ biến nhất là các ngôn ngữ lập trình họ sử dụng, kể cả những ngôn ngữ học vì sở thích
- Tôi đã trải nghiệm nhiều sự khai sáng khi làm việc với các ngôn ngữ lập trình như MASM, C, Prolog và Idris
- Vì ảnh hưởng của việc học ngôn ngữ đối với sự mở rộng tư duy đã được biết đến từ lâu, nên trong bài này tôi sẽ không tập trung vào ngôn ngữ mà chỉ nói về những phần mềm mang lại sự khai sáng
UNIX
unix thân thiện với người dùng—chỉ là nó kén bạn mà thôi.
Vô danh, "Art of unix Programming" của Eric S. Raymond
- Năm 2008, khi còn học đại học, tôi bắt đầu tìm công việc lập trình đầu tiên.
- Phần lớn tin tuyển dụng đều yêu cầu kiến thức về UNIX và socket.
- Vì chương trình học ở trường không có môn nào về unix hay hệ điều hành, tôi quyết định tự học.
- Tôi bước vào thế giới unix qua cuốn "The unix Operating System" của Andrey Robachevsky và cộng sự.
- Việc cài Mandriva Linux đã đưa tôi đi khám phá môi trường unix.
- Kể từ đó, unix đã đồng hành cùng tôi qua mọi giai đoạn của cuộc sống.
- Phần lớn phần mềm đều vận hành trong môi trường unix, và đến nay tôi vẫn tham khảo cuốn "Advanced Programming in the unix Environment".
Git
Dùng git để tự bắn vào chân mình thì dễ, nhưng quay về chân trước đó rồi hợp nhất nó với cái chân hiện tại cũng dễ không kém.
Jack William Bell
- Đầu năm 2009, tôi lần đầu tiếp xúc với hệ thống quản lý phiên bản khi dùng Rational ClearCase.
- ClearCase cực kỳ rối rắm và chỉ đáp ứng được những yêu cầu tối thiểu.
- Sau đó tôi chuyển sang dùng Subversion và học qua cuốn "Version Control with Subversion".
- Subversion dễ hiểu và dễ dùng, nhưng lại bất tiện cho các dự án cá nhân.
- Rồi tôi phát hiện ra Git.
- Git có đường cong học tập dốc và cũng gây bối rối, nhưng đó là kiểu bối rối khác với ClearCase.
- Git loại bỏ ma sát trong việc dùng quản lý phiên bản, cho phép ta đưa mọi thứ đáng giá vào version control.
- Thiết kế của Git hấp dẫn ở chỗ nó là sự pha trộn thanh nhã giữa hệ phân tán, đồ thị không chu trình và kho lưu trữ định địa chỉ theo nội dung.
- Việc tìm hiểu nội tại của Git thú vị đến mức khiến tôi quan tâm cả những hệ thống quản lý phiên bản khác.
- Nhược điểm lớn của Git là cách tiếp cận định hướng snapshot khiến việc hiểu merge trở nên khó khăn hơn.
Emacs
Bất kỳ trình soạn thảo văn bản nào cũng có thể lưu tệp, nhưng chỉ Emacs mới cứu rỗi được linh hồn.
Per Abrahamsen
- Tôi đã chỉnh sửa chương trình đầu tiên của mình trong cửa sổ màu xanh thân thuộc của Turbo Pascal 7.0.
- Ở đại học, tôi học lập trình bằng Pascal, rồi sau đó dùng C++ và Java.
- Ở công việc lập trình đầu tiên, tôi dùng NEdit nhưng dần quan tâm đến Vim và Emacs.
- Vim mang lại thử thách nhưng cũng rất thú vị, giống như chơi một nhạc cụ.
- Emacs là một cỗ máy Lisp cung cấp khả năng biên tập văn bản và quản lý cửa sổ.
- Cấu trúc bên trong của Emacs sạch sẽ, ngăn nắp và được tài liệu hóa rất tốt.
- Việc mở rộng nó bằng Emacs Lisp dễ hơn nhiều so với các trình soạn thảo khác.
Boost.Graph
Tôi có thành kiến mạnh với trào lưu mã tái sử dụng được. Tôi cho rằng “mã có thể biên tập lại” tốt hơn nhiều so với hộp đen hay bộ công cụ.
Donald Knuth, phỏng vấn với Andrew Binstock
- Đêm giao thừa năm 2013, tôi đọc Boost Graph Library.
- Phần lớn các thư viện thuật toán phụ thuộc vào một cách biểu diễn dữ liệu cụ thể, khiến việc tích hợp vào dự án sẵn có trở nên khó khăn.
- Thư viện Boost.Graph giải quyết vấn đề này bằng lập trình generic.
- Dù chưa từng thực sự dùng thư viện này, thiết kế của nó đã giúp tôi hiểu sâu hơn về thiết kế STL và lập trình generic.
Bazel
Nếu make không hoạt động như bạn mong đợi, khả năng cao là Makefile đã sai.
Adam de Boor, "PMake—A Tutorial"
- Năm 2009, tôi viết
Makefileđầu tiên cho một dự án nghiên cứu. - Sự phức tạp của
makekhiến tôi khao khát một công cụ tốt hơn. - Tôi đã thử nhiều hệ thống build khác nhau, nhưng đều không thấy thỏa mãn.
- Năm 2016, tôi gia nhập Google và bắt đầu dùng
blaze. - Bazel là mảnh ghép cuối cùng còn thiếu của bài toán build system.
- Bazel nhanh, chính xác, dễ dùng và không phụ thuộc vào ngôn ngữ.
Kết luận
- Điểm chung của một enlightenmentware tốt:
- Giải quyết những vấn đề sâu sắc, đồng thời là những vấn đề ta gặp hằng ngày.
- Chứa đựng rất nhiều chiều sâu trong một bề mặt nhỏ gọn.
- Mời gọi và khuyến khích người dùng khám phá bên trong nó.
Ý kiến của GN⁺
- Tầm quan trọng của UNIX: UNIX là hệ điều hành nền tảng trong nhiều môi trường lập trình và là yếu tố thiết yếu để hiểu các cơ sở của lập trình hệ thống.
- Đường cong học tập của Git: Git lúc đầu khá khó, nhưng là công cụ cực kỳ quan trọng cho quản lý phiên bản. Nó đặc biệt hữu ích trong môi trường cộng tác và hệ phân tán.
- Tính linh hoạt của Emacs: Emacs cung cấp nhiều hơn một trình soạn thảo văn bản, đặc biệt đáng khuyến nghị cho những ai quan tâm đến lập trình Lisp.
- Lập trình generic trong Boost.Graph: Boost.Graph là một ví dụ mạnh mẽ về lập trình generic, giúp học cách hiện thực các thuật toán phức tạp một cách hiệu quả.
- Hiệu quả của Bazel: Bazel là công cụ có thể tối đa hóa hiệu quả của build system trong các dự án quy mô lớn, đặc biệt hữu ích ở các công ty lớn như Google.
5 bình luận
Trên Windows thì chẳng phải là Everything sao haha
Magit tốt đến mức nào mà lại được xếp vào hàng ngũ những phần mềm kiệt tác như vậy nhỉ? Vì tôi không dùng Emacs nên cũng không biết được.
Nghe nói trên Nvim thì Neogit chịu ảnh hưởng từ Magit, chắc có lẽ tôi cũng nên thử cái đó...
Cũng xin đề cử
lazygitạ heheCảm ơn.
Cuối tuần tôi sẽ cài
superfilevàlazygitđể thử xem sao.Ý kiến trên Hacker News
Tóm tắt các bình luận trên Hacker News
Compiler Explorer:
Ý kiến về việc dùng Windows:
Docker:
Spring Framework:
Nix:
Emacs:
Khái niệm 'Round':
Magit:
So sánh SVN và Git:
Trải nghiệm sử dụng Linux, Emacs, Bazel, Magit: