VietTechiesHIỂU CÔNG NGHỆ. MỞ GÓC NHÌN.
☰ Chuyên mục

Fernando Pérez khởi đầu IPython bằng 259 dòng “hack một buổi chiều”. Notebook, tiền thân Jupyter, mất cả thập kỷ

14/10/2026 · VietTechies · Biên tập

Fernando Pérez mỉm cười tại lễ trao giải thưởng năm 2012 của Quỹ Phần mềm Tự do, cạnh một khung nền tối ghi tên ông, dòng chữ “IPython · 2001” và những hàng vạch ngắn màu hổ phách, như phác họa một file code dài 259 dòng.


Cuối năm 2001, Fernando Pérez, khi đó là nghiên cứu sinh ngành vật lý tại Đại học Colorado Boulder, khởi đầu IPython bằng 259 dòng code Python; còn notebook (sổ tay tính toán) mà ông hình dung ngay từ đầu thì phải mất thêm mười năm và vài lần làm dở dang mới ra đời, rồi phát triển thành Jupyter.

Về sau, theo lời chính ông, phiên bản đầu tiên ấy “chỉ là một bản hack nho nhỏ làm trong một buổi chiều”.

Pérez dùng Python để phân tích dữ liệu cho luận án tiến sĩ, và ông thích ngôn ngữ này. Năm 2021, ông còn nhắc tới “một chút cân nhắc về đạo đức”: việc chia sẻ công trình với những người thầy ở quê nhà Colombia “là không thể nếu dùng các công cụ độc quyền, vì chúng rất đắt”. Nhưng ông vốn thạo Maple, Mathematica và IDL, một ngôn ngữ chuyên về tính toán số. Năm 2012, ông viết rằng đặt cạnh những công cụ ấy, hay cạnh shell dòng lệnh của Unix, dấu nhắc lệnh tương tác của Python “cứ như một món đồ chơi què quặt”.

Giải pháp của ông dựa vào đúng một hook, tức một điểm cho phép gắn code riêng vào Python. Khi bạn gõ một biểu thức tại dấu nhắc lệnh, Python chuyển kết quả cho một hàm tên là sys.displayhook, và hàm này in kết quả ra. Pérez nhận ra rằng nếu cài vào đó một đối tượng callable (gọi được như hàm) do chính mình viết, đối tượng ấy có thể giữ trạng thái và cất các kết quả trước đó để dùng lại.

File khởi động của ông — Python chạy nó trước khi hiện dấu nhắc đầu tiên — đánh số dấu nhắc theo kiểu Mathematica, In[1]:= và Out[1]=, đồng thời lưu lại mọi kết quả đã in, nên kết quả thứ tư vẫn có thể gọi lại bằng tên _p4. File này còn nạp sẵn Numeric và Gnuplot để tính toán số và vẽ đồ thị. Pérez gọi đó là một “mini-mathematica” trong Python, rồi nói thêm: “Công bằng mà nói, gọi là femto- có lẽ đúng hơn.”

Ông cũng còn một tấm bằng phải lấy cho xong. Trong một cuộc phỏng vấn năm 2021, Pérez kể rằng ông từng bị thầy hướng dẫn tiến sĩ đầu tiên sa thải và khi đó đang chật vật hoàn thành luận án. Anna Hasenfratz, một giáo sư khác trong khoa, đã hướng dẫn ông cho tới khi tốt nghiệp. Theo lời Pérez, bà “đã đủ kiên nhẫn để tôi được ‘trì hoãn có ích’ bằng việc phát triển IPython” — việc mà ông “phần nào có thể biện minh, xem như một công cụ để hoàn thành luận án ấy”.

Hạn nộp luận án cận kề và hai shell đi mượn

Ít lâu sau, Pérez đọc được về hai hệ thống tương tác khác cho Python: IPP của Janko Hauser và LazyPython của Nathan Gray, cũng đều do các nhà khoa học viết, giống như bản của ông. Ông liên lạc với hai tác giả. Họ cho ông dùng code của mình nhưng không có thời gian cùng tham gia. Pérez viết rằng mình đã làm “như bất kỳ nghiên cứu sinh đúng nghĩa nào cũng sẽ làm khi hạn nộp luận án đã cận kề”: dồn toàn bộ thời gian vào việc gộp cả ba thành bản IPython “thực thụ” đầu tiên. “Nhân tiện nói luôn, rốt cuộc tôi vẫn tốt nghiệp đấy.”

Ông cũng viết rằng ngay từ những ngày đầu, Mathematica và các notebook của nó, cùng các worksheet của Maple trước đó, đã “nằm sẵn trong đầu tôi như môi trường lý tưởng cho công việc khoa học hằng ngày”. Shell mới chỉ là điểm xuất phát. Đích đến là một notebook.

Hai notebook dang dở

Lần thử đầu tiên diễn ra năm 2005, khi hai sinh viên tham gia chương trình Google Summer of Code bắt đầu làm một notebook bằng Wx, bộ công cụ dựng giao diện cho ứng dụng desktop. Robert Kern góp thêm công sức, nhưng Pérez viết rằng bản nguyên mẫu ấy “không bao giờ thực sự dùng được trọn vẹn”.

Người về đích trước lại là một người khác. William Stein, người dùng IPython làm giao diện dòng lệnh cho phần mềm toán học Sage của mình, mời Pérez tới hội thảo Sage Days đầu tiên vào đầu năm 2006, nơi Kern trình diễn bản nguyên mẫu. Rõ ràng bản ấy chưa sẵn sàng, và Stein bắt tay làm một notebook của riêng mình, chạy trên trình duyệt. Đến tháng 10 năm 2006, notebook của Sage đã dùng được. Pérez gọi quyết định đi đường riêng của Stein là “hoàn toàn hợp lý và chính đáng”.

Nhóm IPython thử lại lần nữa vào năm 2006 và 2007, sau khi Brian Granger và Min Ragan-Kelley gia nhập dự án. Ragan-Kelley làm ra một nguyên mẫu chạy được trên trình duyệt. Khác với notebook của Sage, nguyên mẫu này cố giữ “trải nghiệm IPython”, trong đó có khả năng truy cập trực tiếp vào các file của chính người dùng. Nhưng rồi bản này cũng “không bao giờ đạt tới chất lượng đủ để dùng thực tế”. Pérez viết rằng ông không còn nhớ hết lý do.

Tách IPython làm đôi

Đến năm 2009, theo lời Pérez, khối code lớn dần lên từ lần hợp nhất năm 2001 đã thành “một mớ hỗn độn khó hiểu, đan xen chằng chịt đến khủng khiếp và gần như chẳng có bộ kiểm thử nào”. Mùa hè năm đó, nhờ nguồn lực từ NiPy, một dự án về hình ảnh học thần kinh, Granger được tài trợ để làm IPython toàn thời gian; ông tháo rời từng phần rồi lắp lại thành những module gọn gàng hơn.

Đầu năm 2010, trong một chuyến sang Colombia dạy học, Pérez đọc được về ZeroMQ, một thư viện truyền thông điệp, rồi kể cho Granger nghe. Chỉ trong vòng hai ngày, Granger đã viết xong pyzmq, phần binding giúp gọi ZeroMQ từ Python. Trong một chuyến thăm cuối tuần, một trong hai người viết kernel — tiến trình thực thi mã lệnh — còn người kia viết client. Sau hai ngày, họ đã có một shell Python chạy qua ZeroMQ.

Khi kernel chạy trong một tiến trình riêng và giao tiếp theo một giao thức xác định, bất kỳ giao diện nào cũng có thể điều khiển kernel ấy: Pérez viết rằng chỉ sau một buổi làm việc với nhóm IPython, Shahrokh Mortazavi và Dino Viehland ở Microsoft đã tích hợp hỗ trợ IPython vào Python Tools for Visual Studio “mà không hề hỏi chúng tôi lấy một câu”.

Tháng 10 năm 2010, James Gao, nghiên cứu sinh ngành khoa học thần kinh ở Berkeley, viết nhanh một nguyên mẫu notebook chạy trên web, theo thiết kế mới. Mùa hè năm 2011, Granger biến nguyên mẫu ấy thành một hệ thống chạy được hoàn chỉnh, dùng WebSockets, máy chủ web Tornado, CodeMirror để soạn code và MathJax để hiển thị công thức toán. Ngày 21 tháng 12 năm 2011, sau bốn tháng rưỡi phát triển cật lực, IPython 0.12 ra mắt cùng notebook trên nền trình duyệt.

Ngay từ sớm, đã có bản kể lại rút ngắn chặng đường ấy. Một bài đăng năm 2012 của Viện Bền vững Phần mềm (Software Sustainability Institute) ở Anh nói rằng nguyên mẫu đầu tiên của IPython Notebook “do Brian Granger lập trình vào mùa hè năm 2011”. Theo lời kể của Pérez, mùa hè năm đó Granger đã dựng nên hệ thống chạy được hoàn chỉnh đầu tiên từ nguyên mẫu năm 2010 của Gao, sau các lần thử năm 2005 và 2006–2007.

Từ IPython đến Jupyter

Quỹ Phần mềm Tự do (Free Software Foundation) trao cho Pérez Giải thưởng Thúc đẩy Phần mềm Tự do năm 2012, và gọi ông là “người tạo ra IPython”. Ngày 8 tháng 7 năm 2014, ông ra mắt Dự án Jupyter. Một slide trong bài thuyết trình ra mắt của ông đặt câu hỏi: “Sao lại gọi là IPython, khi nó chạy được cả Julia, R, Haskell, Ruby, …?” Cái tên mới lấy cảm hứng từ Julia, Python và R.

Năm 2018, Giải thưởng Hệ thống Phần mềm năm 2017 của Hiệp hội Máy tính ACM được trao cho mười lăm thành viên hội đồng điều hành của Jupyter, tính theo danh sách lúc dự án được đề cử vào tháng 11 năm 2016. Theo một phân tích mà tạp chí Nature dẫn lại, đến tháng 9 năm 2018, trên GitHub có hơn 2,5 triệu notebook Jupyter công khai, tăng từ mức khoảng 200.000 vào năm 2015.

Cái lợi của việc chậm chân

Trong bài viết năm 2012 nhìn lại lịch sử notebook, Pérez đặt tên cho một phần là “Giá trị của việc chậm nhất cuộc đua”. Ông viết rằng những lần làm dở dang “đã giúp chúng tôi hiểu rõ hơn nhiều về những phần khó của bài toán, và biết những ngõ cụt sẽ nằm ở đâu”. Ba bài học từ thập kỷ ấy vẫn đúng cả bên ngoài câu chuyện này:

  • Gãi đúng chỗ ngứa của chính mình, rồi nhìn quanh. Bản 259 dòng ấy giải quyết nỗi bực mình hằng ngày của một nhà nghiên cứu, và hai nhà khoa học khác cũng đã viết shell cho chính nhu cầu ấy từ trước.
  • Chờ đợi có thể cho công cụ thời gian bắt kịp. Pérez ghi công cho ZeroMQ, Tornado, WebSockets, MathJax và các engine JavaScript tốc độ cao của trình duyệt: “Không có những công cụ này, chúng tôi không thể nào xây dựng được những gì đang có hiện nay.”
  • Có những tính năng phải chờ kiến trúc. Notebook dùng được ra đời sau khi kernel chuyển sang một tiến trình riêng và giao tiếp theo một giao thức xác định; khi đó, trình duyệt chỉ là thêm một client nữa. Nếu một tính năng cứ giậm chân tại chỗ, hãy nhìn xuống những gì nằm bên dưới nó.

Chưa đầy ba tuần sau khi notebook ra mắt, Pérez đăng 259 dòng code ban đầu lên mạng, dán nhãn “chỉ có giá trị lịch sử”. Ý tưởng mà bản code ấy đưa ra vẫn còn đó: trong IPython ngày nay, kết quả của dòng lệnh thứ 12 đang chờ sẵn dưới tên _12 hoặc Out[12].

Bài liên quan

Đọc bằng ngôn ngữ khác: English

Nguồn