Lần Viết Lại Nào Cũng Tưởng Là Lần Cuối
Tôi đã viết lại cùng một thành phần lõi của hệ thống ba lần. Không phải vá víu, không phải tinh chỉnh — mà xây lại, gần như từ con số không, ba lần riêng biệt. Và mỗi một lần, tôi đều chắc chắn rằng phiên bản này mới là phiên bản thật: kiến trúc sạch sẽ, đúng đắn mà cuối cùng tôi sẽ dựa vào để xây dựng lâu dài.
Tôi đã sai ba lần liên tiếp, lần nào cũng đầy tự tin. Việc sai thì khó chịu. Nhưng sự tự tin tuyệt đối mới là điều tôi thật sự muốn nói tới, bởi vì đó là cùng một cảm giác lặp đi lặp lại, và tôi chưa một lần nào nhận ra nó như một lời cảnh báo.
”Lần này thì đúng rồi”
Có một cảm giác phấn khích đặc biệt đi kèm với một lần viết lại mới tinh. Đoạn mã cũ là một mớ hỗn độn — bạn nhìn thấy mọi sự thỏa hiệp, mọi miếng vá, mọi chỗ mà thực tế đã buộc bạn phải uốn mình. Thiết kế mới, nằm gọn gàng trong đầu bạn, không có chút nào trong số đó. Nó thanh thoát. Nó hiển nhiên. Nó rõ ràng là tốt hơn.
Thế là bạn phá bỏ thứ cũ và xây thứ mới, và trong một thời gian nó có cảm giác như là tiến bộ, bởi vì đoạn mã mới thực sự sạch hơn. Rồi bạn bắt đầu dùng nó, và sự uốn mình lại bắt đầu, và một thời gian sau bạn đứng trước một mớ hỗn độn thứ hai, cảm thấy đúng cái ngứa ngáy muốn làm lại từ đầu.
Vì sao bản viết lại luôn trông đẹp hơn
Phép so sánh bị gian lận, và phải mất ba vòng tôi mới thấy ra cách thức của nó. Khi bạn đánh giá một bản viết lại, bạn đang so sánh một thiết kế mới mẻ, lý tưởng hóa với một thiết kế cũ đã trải qua nhiều tháng hấp thụ ma sát của việc sử dụng thực tế. Tất nhiên bản mới trông đẹp hơn. Nó chưa gặp phải vấn đề nào cả.
Đoạn mã cũ trông xấu xí không chỉ vì nó được thiết kế chưa hoàn hảo, mà còn vì nó đang mang trên mình kinh nghiệm của nó. Nhiều nhánh rẽ vụng về trong đó là những vết sẹo từ các trường hợp biên thực tế — những thứ mà thế giới đã ném vào nó, những thứ mà thiết kế mới sạch sẽ kia chưa hề phải sống sót qua. Bạn không phải lúc nào cũng so sánh một thiết kế tốt với một thiết kế tồi. Thường thì bạn đang so sánh một cựu binh với một tân binh và trầm trồ về việc tân binh kia chẳng có vết sẹo nào.
Cái giá tôi cứ phải trả mãi
Mỗi lần viết lại vứt đi nhiều hơn là đoạn mã. Nó vứt đi tri thức — sự xử lý đã được tích lũy, đã phải vất vả mới có được, cho mọi tình huống kỳ lạ mà phiên bản cũ đã âm thầm học được cách đối phó. Và bởi vì tri thức đó nằm trong đoạn mã chứ không phải trong đầu tôi, xây lại đồng nghĩa với khám phá lại nó: lại gặp những trường hợp kỳ quặc ấy, lại gỡ lỗi cho những vấn đề ấy, trả lần thứ hai và thứ ba cho những bài học mà tôi đã mua rồi.
Có một kiểu kiệt sức rất đặc thù khi sửa một lỗi và nhận ra rằng bạn đã sửa đúng cái lỗi này trước đây rồi, trong một phiên bản của đoạn mã không còn tồn tại nữa. Phần lớn lần viết lại thứ ba của tôi là như vậy — chậm rãi kiếm lại tri thức mà tôi đã vứt đi trong lần thứ hai.
Thứ nằm bên dưới: trừu tượng hóa quá sớm
Cỗ máy thực sự đứng sau toàn bộ việc xây đi xây lại này là một sai lầm trong cách tôi suy nghĩ về thiết kế. Tôi cứ viết lại bởi vì tôi cứ cố tìm cấu trúc đúng trước khi tôi thực sự hiểu vấn đề. Tôi đối xử với sự trừu tượng đúng đắn như một thứ tôi có thể ngồi xuống và thiết kế chính xác ngay từ đầu, miễn là tôi đủ thông minh.
Theo kinh nghiệm của tôi, các trừu tượng hữu ích hiếm khi được thiết kế đúng ngay từ đầu; chúng được giành lấy thông qua việc sử dụng. Chúng đến từ việc sống cùng vấn đề đủ lâu để học được nó thực sự uốn mình ở đâu — phần nào thay đổi và phần nào giữ cố định, những đường nối thật nằm ở chỗ nào. Thiết kế nó trọn vẹn từ trước là phỏng đoán, và mỗi lần viết lại chỉ là tôi phỏng đoán lại lần nữa, có chút hiểu biết hơn, nhưng vẫn còn lâu mới học đủ để phỏng đoán cho giỏi.
Khi nào viết lại thực sự đáng giá
Tôi không muốn khẳng định rằng viết lại bao giờ cũng sai. Đôi khi một thiết kế thực sự không thể co giãn tới chỗ bạn cần nó tới, và việc tiến hóa nó tại chỗ sẽ tốn kém hơn là bắt đầu mới. Sự phân biệt mà cuối cùng tôi học được cách vạch ra là về nguồn gốc của thôi thúc.
Một lần viết lại được thúc đẩy bởi sự hiểu biết mới thực sự về vấn đề — “giờ tôi thấy rằng cái thứ tôi vẫn coi là một khái niệm thực ra là hai” — thường là tiến bộ thực sự. Một lần viết lại được thúc đẩy chủ yếu bởi sự khó chịu với đoạn mã hiện tại — “cái này xấu, tôi muốn một cái gì đó sạch” — thường chỉ là sự chuyển động khoác lên một lớp sơn mới. Cái thứ nhất có nhiều khả năng tạo ra tiến bộ cấu trúc có ý nghĩa hơn. Cái thứ hai chủ yếu thay đổi cảm nhận của bạn về nó trong vài tuần, cho đến khi thứ mới cũng trở nên xấu xí.
Cách khắc phục: uốn nó tại chỗ, cho tới khi bạn thực sự không thể
Thói quen tôi xây dựng được là hạ bậc việc viết lại từ phản xạ đầu tiên xuống thành phương án cuối cùng. Khi đối mặt với một cấu trúc làm tôi khó chịu, giờ tôi cố thay đổi nó tại chỗ trước — nắn lại nó, tái cấu trúc nó, để nó giữ được tri thức tích lũy của mình trong khi tôi dịch chuyển nó về phía cái tôi cần. Tôi cố dành việc xây lại hoàn toàn cho lúc cấu trúc hiện có thực sự chống cự mọi nỗ lực tiến hóa nó, chứ không chỉ khi nó xúc phạm tới cảm quan gọn gàng của tôi.
Phần lớn thời gian, sự khó chịu khiến bạn muốn làm lại từ đầu là thông tin, không phải bản án. Đó là đoạn mã đang nói cho bạn biết nó đau ở đâu — và đó chính xác là tri thức mà bạn sẽ vứt đi khi xây lại từ con số không.
Sự chắc chắn chính là dấu hiệu
Sợi chỉ xuyên suốt cả ba lần viết lại không phải là đoạn mã tồi. Đó là một cảm giác: sự chắc chắn sạch sẽ, trọn vẹn rằng lần này tôi đã làm đúng. “Đây là kiến trúc cuối cùng” là câu mà tôi đã nói, trên thực tế, trước mỗi lần. Việc một câu nói cứ liên tục hóa ra sai lẽ ra phải làm giảm lòng tin của bạn vào nó, và từ từ thì điều đó cũng xảy ra.
Sự chắc chắn mạnh mẽ về một thiết kế mà bạn chưa kiểm thử dưới áp lực không giống với sự thấu hiểu. Nó thường chỉ là sự vắng mặt của những vết sẹo lẽ ra đã dạy cho bạn điều ngược lại — sự tự tin dễ chịu của một kế hoạch chưa hề gặp thế giới. Dạo này, khi tôi cảm thấy hoàn toàn chắc chắn rằng một thiết kế mới là thiết kế cuối cùng, tôi cố đối xử với chính cái cảm giác đó như một gợi ý rằng có lẽ tôi chưa sống cùng vấn đề đủ lâu để được tin tưởng với ý kiến ấy.
— Không tín hiệu, không lợi nhuận, không phải lời khuyên đầu tư.