Nhờ công cụ mạnh, yêu cầu tốc độ và sự chuyển dịch bản chất của chính việc lập trình, cuộc chiến của bạn là trên API của framework chứ không phải là cú pháp...
Những năm 80 thế kỷ trước, cách dễ nhất để khai mào một cuộc cãi vã là tuyên bố ngôn ngữ lập trình bạn ưa thích là hay nhất. C, Pascal, Lisp, Fortran? Những tay lập trình sẽ dành hàng giờ để giảng giải cặn kẻ tại sao cách đẽo gọt của riêng họ cho mệnh đề điều kiện "if-then-else" hay hơn hẳn cách của bạn.
Thời đó là vậy. Còn ngày nay, những trận chiến về cú pháp và cấu trúc hầu như không còn vì thế giới lập trình đã hội tụ vào vài tiêu chuẩn đơn giản.
Sự khác biệt giữa dấu chấm phẩy, dấu ngoặc móc và "whatnot" trong C, Java và JavaScript chỉ còn là chuyện nhỏ. Những tranh cãi thú vị về kiểu viết lệnh và cách thức đóng mã lệnh vẫn còn, nhưng hầu như không đáng kể vì tính năng tự động đã xóa nhòa những khác biệt.
Nếu không thích định nghĩa kiểu dữ liệu thì bạn đã gặp may vì máy tính có thể hiểu chính xác ý bạn. Nếu sếp thì muốn dùng JavaScript, nhưng bạn lại thích Java thì trình biên dịch chéo sẽ chuyển đổi Java thành JavaScript chạy được trong trình duyệt. Do đó, cần gì phải nhọc công "đấu võ mồm" khi mà công nghệ đứng về phía chúng ta?
Hiện nay những hoạt động lý thú diễn ra trong lĩnh vực khung phát triển (framework) và được thảo luận sôi nổi. Angular có tốt hơn Ember? Node.js có đủ mọi tính năng?
Theo nghĩa này, khung phát triển là những ngôn ngữ lập trình mới. Chúng là nơi có thể tìm thấy những ý tưởng, triết lý và ứng dụng thực tế của lập trình hiện đại. Một số sẽ mất đi nhưng nhiều khung phát triển đang trở thành những khối nền tảng lập trình mới.
Bài viết trình bày 7 khía cạnh mang lại sức mạnh cho khung phát triển – và cũng biến khung phát triển thành trận địa mới, thú vị hơn cho những cuộc chiến giữa các tay lập trình viên kỳ quặc.
1. Hầu hết mã lệnh buộc với nhau bằng API
Từng có một thời, viết phần mềm đồng nghĩa với việc vận dụng mọi tri thức về ngôn ngữ lập trình để vắt kiệt khả năng của mã lệnh. Vì thế cần phải làm chủ được sự phức tạp của kiểu biến con trỏ (pointer), hàm (function) và phạm vi ảnh hưởng – chất lượng của mã lệnh phụ thuộc làm điều đúng. Ngày nay tính năng tự động thực hiện hầu hết những chuyện này. Nếu bạn có "bỏ quên" những phát biểu vô nghĩa trong mã lệnh thì cũng đừng lo bởi trình biên dịch sẽ xóa sạch những mã chết đó; còn nếu bạn để con trỏ lơ lửng thì đã có "bộ gom rác" lo.
Hơn nữa, thực tế viết mã lệnh hiện nay cũng khác biệt; hầu hết mã lệnh là một hàng dài gồm những phép gọi "giao diện lập trình ứng dụng" (API: Application Program Interface). Thỉnh thoảng dữ liệu phải được định dạng lại giữa những lần gọi API nhưng ngay cả việc này cũng thường do các API đảm nhiệm. Một vài người hiếm hoi có khả năng lập trình thông minh đến mức có thể tung hứng các con trỏ, "đánh đập" từng bit ở cấp mã máy nhưng hầu hết chúng ta chỉ có thể làm việc với những lớp cao hơn. Chúng ta chỉ đơn giản là nối ống dẫn (pipe) giữa các API.
Vì thế, điều quan trọng là hiểu được hành vi của API và nó có thể làm được gì. Nó chấp nhận cấu trúc dữ liệu nào? Những giải thuật này sẽ hành xử như thế nào khi tập dữ liệu phát triển lớn hơn? Những câu hỏi như thế ngày nay trong lĩnh vực lập trình quan trọng hơn thắc mắc về cú pháp hay ngôn ngữ. Thật sự, hiện có nhiều công cụ giúp đơn giản hóa việc ngôn ngữ này gọi một thủ tục từ ngôn ngữ khác; ví dụ việc liên kết thư viện của C với mã lệnh Java cũng tương đối đơn giản. Hiểu rõ API là yêu cầu quan trọng.
2. Đáng để đứng trên vai người khổng lồ
Bạn hãy tưởng tượng mình là tín đồ của Erlang hay một ngôn ngữ mới nào khác. Bạn xác định rằng đây là nền tảng tốt nhất để viết ứng dụng hoàn toàn không có lỗi và ổn định. Không ai phản đối tình cảm này nhưng bạn có thể mất nhiều năm để viết lại toàn bộ mã lệnh Java hay PHP bằng ngôn ngữ mới nhất mà mình đã chọn. Chắc chắn là mã lệnh của bạn sẽ tốt hơn nhiều nhưng liệu có đáng với thời gian bỏ ra?
Khung phát triển cho phép chúng ta tận dụng tối đa công sức khó nhọc của những người đi trước. Có thể chúng ta không thích kiến trúc mà họ chọn và cũng bất đồng về các chi tiết được hiện thực nhưng tốt hơn mà nén những phàn nàn của mình để tìm cách sống chung với sự khác biệt. Việc thừa hưởng toàn bộ điều tốt và điều xấu của một nền tảng mã lệnh dễ dàng hơn nhiều nếu thông qua khung phát triển. Chọn con đường khó khăn là tự mình viết lại toàn bộ bằng ngôn ngữ mới thay vì chọn một trong những khung phát triển phổ biến sẽ không cho phép bạn nhanh chóng thưởng thức tinh hoa của ngôn ngữ mới so với cách đơn giản hơn là để khung phát triển và các API lo việc đó.
3. Kiến trúc mới quan trọng chứ không phải cú pháp
Khi hầu hết mã lệnh nối với nhau bằng các lệnh gọi API, bạn sẽ không có nhiều cơ hội để tìm tòi những "quái chiêu" của ngôn ngữ. Chắc chắn là bạn có thể trở thành chuyên gia về cách kích hoạt các trường tĩnh của đối tượng trong Java nhưng nếu bạn hình dung được cách tăng sức mạnh của Lucene hay JavaDB cũng như những mã lệnh khác thì tốt hơn nhiều. Bạn có thể dành nhiều tháng để cảm nhận cách tối ưu những thủ tục thông thường của trình biên dịch C hướng đối tượng nhưng để mã lệnh của bạn thực sự tuyệt vời thì nên học phần nhập và phần xuất trong thư viện mới nhất của Apple. Bạn sẽ học được sâu hơn các chi tiết tinh vi của khung phát triển thay vì cú pháp ngôn ngữ nền của nó.
Hầu hết mã lệnh của chúng ta dành phần lớn thời gian cho những vòng lặp của các thư viện. Vì thế, hiểu đúng các chi tiết của ngôn ngữ có thể hữu ích nhưng biết rõ sự vận hành của thư viện lại cực kỳ giá trị.
4. Sự thống trị của giải thuật
Học ngôn ngữ lập trình mới có thể cho phép bạn tung hứng dữ liệu một cách bí ẩn bằng các biến nhưng cũng chỉ đến vậy mà thôi. Khó khăn thực sự nằm ở chỗ làm thế nào để giải thuật chạy đúng và những công việc này thường được xác định, hiện thực bằng khung phát triển.
Nhiều lập trình viên biết rõ mối hiểm nguy và sự tiêu tốn thời gian nếu đi hiện thực lại cấu trúc dữ liệu và giải thuật chuẩn. Chắc chắn là bạn có thể tinh chỉnh phần nào theo nhu cầu của mình nhưng sẽ gặp phải nguy cơ mắc những lỗi tinh tế. Khung phát triển đã được kiểm nghiệm rộng rãi qua nhiều năm và là hiện thân cho sự đầu tư của cộng đồng vào nền tảng phần mềm. Chẳng có mấy ví dụ chứng tỏ sự hợp lý của việc "vượt rào" bằng cách vứt bỏ công sức khó nhọc của những người khác và tự mình phát triển lấy những giải thuật riêng.
Hướng tiếp cận đúng đắn là nghiên cứu khung phát triển và học cách sử dụng có lợi nhất cho mình. Nếu chọn sai cấu trúc dữ liệu, bạn có thể làm cho một công việc tuyến tính tiêu tốn thời gian bằng một hàm bậc bốn khi có cùng dữ liệu nhập; một gánh nặng to lớn khi công việc tiến triển.
5. Trình biên dịch và IDE thông minh sửa lỗi cú pháp
Có phải đặt dấu chấm phẩy sau câu lệnh cuối cùng của khối lệnh? Chấm phẩy là dấu phân cách hay dấu kết thúc? Những nhà thiết kế ngôn ngữ đã dành rất nhiều thời gian để đẽo gọt bộ phân tích cú pháp nhằm bảo đảm hiệu lực của những quy định này, thế rồi bạn đoán xem, chuyện đó giờ không cần phải quan tâm. Từng có thời cách đây chừng một thập niên thì vậy nhưng giờ đã có IDE (Integrated Development Environment - Môi trường phát triển tích hợp) lo việc đó. Chúng thường xuyên quan sát và thông báo khi bạn làm sai. Nhờ vậy, bạn chỉ còn mỗi một việc là dành toàn tâm cho mã lệnh.
Tính năng xử lý tự động đã tiết kiệm cho chúng ta nhiều công sức vì không phải quan tâm đến cú pháp lập trình nhàm chán. Tất nhiên là chúng không thể lo hết mọi chuyện mà vẫn cần chúng ta triển khai những cú pháp tinh tế tuy rằng hầu như trong toàn bộ thời gian làm việc thì chi tiết ngôn ngữ không phải là vấn đề.
IDE cũng hỗ trợ trong các khung phát triển dù chỉ cho các tiểu tiết như nhắc chúng ta thông số của phép gọi hàm hay thậm chí còn kiểm tra xem dữ liệu có đúng kiểu hay không. Ngoài những điều đó, chúng ta phải biết cách dùng cũng như cách kết hợp hàm với nhau. Đây là điểm mà bạn phải tập trung tâm ý khi cú pháp không còn quá quan trọng để có thể vận dụng hàm, thủ tục tạo ra giải pháp tinh vi.
6. Cú pháp đang biến mất trong các ngôn ngữ trực quan
Tuy điều này được tiên đoán từ nhiều năm nay nhưng nó chỉ xảy ra chậm chạp với vài loại mã lệnh chứ không phải tất cả. Một vài ngôn ngữ lập trình vẫn tiếp tục kiểu nặng về văn bản nhưng một số lại trở nên thiên về đồ họa, nghĩa là ngôn ngữ nền của máy tính không còn quá quan trọng nữa.
Bạn có thể dễ dàng thấy điều đó ở các bộ phát triển ứng dụng có giao diện đồ họa (GUI). Bạn có thể kéo thả các ứng dụng con (widgets) có sẵn trong giao diện người dùng suốt ngày mà không phải lo đến chuyện đó là C hay Java hay ngôn ngữ nào khác.
Những công cụ như AndroidBuilder cho phép bạn thoải mái kéo thả phần lớn thiết kế của mình còn AndroidBuilder thì cặm cụi viết mã XML và Java để thiết kế đó chạy được. Rất khó để nói rằng những ngôn ngữ trực quan như vậy sẽ là tương lai nhất là khi chúng nhiều lần làm cho các lời tiên đoán… trật lất nhưng dù sao thì các công cụ cũng sẽ phát triển theo hướng trực quan hơn nếu có thể. Điều này cũng có nghĩa rằng ngôn ngữ đã mất đi phần nào sức mạnh hay tầm quan trọng.
7. Mã là luật
Ngôn ngữ máy tính phần lớn thuộc loại bất khả tri. Chúng được thiết kế có tính mở, sẵn sàng đón nhận và hầu như mềm dẻo vô hạn. Chúng là phương tiện để thực hiện bất kỳ điều gì mà bạn muốn. Thỉnh thoảng bạn phải dùng vài ký tự lạ theo yêu cầu của cú pháp nhưng thực ra cũng chỉ cần vài cú gõ phím. Còn lại chủ yếu là mệnh đề điều kiện nếu-thì (if-then-else) và thỉnh thoảng cần thêm một số bit thông minh. Mọi ngôn ngữ sẽ vẫn giúp đạt kết quả mong muốn theo cách bạn mong muốn. Nếu có hạn chế thì đó là chúng được thiết kế để giữ cho mã lệnh càng ít lỗi càng tốt chứ không phải hạn chế những gì bạn muốn làm.
Khung phát triển là nơi chứa sức mạnh. Đây là nơi mà các kiến trúc sư phần mềm có thể quyết định điều gì được phép và điều gì bị cấm; nếu họ không muốn điều gì đó xảy ra thì phép gọi hàm tương ứng sẽ không có trong API. Nếu kiến trúc sư thích ý tưởng nào thì thường sẽ có rất nhiều phép gọi hàm và công cụ hỗ trợ. Một giáo sư luật của Harvard là Larry Lessig đã nói rằng "Mã lệnh là luật lệ".
Khung phát triển thiết lập những quy tắc riêng trên Internet và nếu đã chọn thì bạn phải chung sống với nó. Vài nền tảng blog khuyến khích sự liên kết với những nền tảng khác bằng phép gọi AJAX, trong khi một số nền tảng lại không hỗ trợ. Đó là lý do tại sao bạn phải tìm hiểu tường tận và chọn lựa khôn ngoan.
Đó là lý do chính yếu cho thấy tại sao khung phát triển thống trị mọi mặt cuộc sống của chúng ta, ngay cả những khoảnh khắc hiếm hoi mà chúng ta không hề lập trình.
Trần Quân
(theo PC World VN)
Tin liên quan:
|