Cấp độ cơ bản:
Chúng ta hãy nhìn vào mọi thứ ở mức độ đơn giản nhất và cơ bản nhất.
Đối với môn toán, ta có:
2 + 3 = 5
Tôi đã học về điều đó khi tôi còn rất, rất trẻ. Tôi có thể nhìn vào các yếu tố cơ bản nhất: hai đối tượng và ba đối tượng. Tuyệt quá.
Đối với lập trình máy tính, hầu hết mọi người có xu hướng sử dụng ngôn ngữ cấp cao. Một số ngôn ngữ cấp cao thậm chí có thể "biên dịch" thành một trong những ngôn ngữ cấp cao thấp hơn, như C. C sau đó có thể được dịch sang ngôn ngữ hội. Ngôn ngữ hội sau đó được chuyển đổi thành mã máy. Nhiều người nghĩ rằng sự phức tạp kết thúc ở đó, nhưng nó không: CPU hiện đại lấy mã máy làm hướng dẫn, nhưng sau đó chạy "micro code" để thực sự thực hiện các hướng dẫn đó.
Điều này có nghĩa là, ở cấp độ cơ bản nhất (xử lý các cấu trúc đơn giản nhất), chúng ta hiện đang xử lý mã vi mô, được nhúng trong phần cứng và hầu hết các lập trình viên thậm chí không sử dụng trực tiếp, cũng không cập nhật. Trên thực tế, không chỉ hầu hết các lập trình viên không chạm vào mã vi (cao hơn 0 cấp so với mã vi), hầu hết các lập trình viên không chạm vào mã máy (cao hơn 1 cấp so với mã vi), thậm chí không lắp ráp (cao hơn 2 cấp so với mã vi) ( ngoại trừ, có lẽ, cho một chút đào tạo chính thức trong thời gian học đại học). Hầu hết các lập trình viên sẽ dành thời gian chỉ cao hơn 3 cấp.
Hơn nữa, nếu chúng ta nhìn vào hội (mức độ thấp như mọi người thường nhận được), mỗi bước riêng lẻ thường được hiểu bởi những người đã được đào tạo và có tài nguyên để diễn giải bước đó. Theo nghĩa này, hội đơn giản hơn nhiều so với ngôn ngữ cấp cao hơn. Tuy nhiên, hội đơn giản đến mức thực hiện các nhiệm vụ phức tạp, hoặc thậm chí là các nhiệm vụ tầm thường, rất tẻ nhạt. Ngôn ngữ cấp trên giải phóng chúng ta khỏi điều đó.
Trong một luật về "kỹ thuật đảo ngược", một thẩm phán tuyên bố rằng ngay cả khi về mặt lý thuyết mã có thể được xử lý một byte một lần, các chương trình hiện đại liên quan đến hàng triệu byte, do đó, một số loại bản ghi (như bản sao mã) phải được tạo ra như vậy một nỗ lực để được khả thi. (Do đó, phát triển nội bộ không được coi là vi phạm quy tắc luật bản quyền "không tạo bản sao".) (Có lẽ tôi đang nghĩ đến việc tạo ra các hộp mực Sega Genesis trái phép, nhưng có thể đang nghĩ về điều gì đó được nói trong vụ kiện Game Genie. )
Hiện đại hóa:
Bạn có chạy mã có nghĩa là cho 286s? Hay bạn chạy mã 64 bit?
Toán học sử dụng các nguyên tắc cơ bản kéo dài hàng thiên niên kỷ. Với máy tính, mọi người thường coi đầu tư vào thứ gì đó hai thập kỷ là lãng phí tài nguyên vô ích. Điều đó có nghĩa là Toán học có thể được kiểm tra kỹ lưỡng hơn rất nhiều.
Tiêu chuẩn của các công cụ được sử dụng:
Tôi đã được dạy (bởi một người bạn đã đào tạo lập trình máy tính chính thức hơn tôi) rằng không có trình biên dịch C không có lỗi nào đáp ứng các thông số kỹ thuật C. Điều này là do ngôn ngữ C về cơ bản đảm nhận khả năng sử dụng bộ nhớ vô hạn cho mục đích ngăn xếp. Rõ ràng, một yêu cầu bất khả thi như vậy phải được đưa ra từ khi mọi người cố gắng tạo ra các trình biên dịch có thể sử dụng được làm việc với các máy thực tế có bản chất hữu hạn hơn một chút.
Trong thực tế, tôi đã thấy rằng với JScript trong Windows Script Host, tôi đã có thể hoàn thành rất nhiều đối tượng sử dụng tốt. (Tôi thích môi trường vì bộ công cụ cần dùng thử mã mới được tích hợp vào các phiên bản hiện đại của Microsoft Windows.) Khi sử dụng môi trường này, tôi thấy rằng đôi khi không có tài liệu nào dễ tìm thấy về cách thức hoạt động của đối tượng. Tuy nhiên, sử dụng đối tượng là rất có lợi, dù sao tôi cũng làm như vậy. Vì vậy, những gì tôi sẽ làm là viết mã, có thể là lỗi như một tổ ong bắp cày và làm như vậy trong một môi trường hộp cát độc đáo nơi tôi có thể nhìn thấy các hiệu ứng và tìm hiểu về hành vi của đối tượng trong khi tương tác với nó.
Trong các trường hợp khác, đôi khi chỉ sau khi tôi phát hiện ra một đối tượng hoạt động như thế nào, tôi mới thấy rằng đối tượng (đi kèm với hệ điều hành) có lỗi và đó là một vấn đề đã biết mà Microsoft đã cố tình quyết định sẽ không được khắc phục .
Trong các kịch bản như vậy, tôi có dựa vào OpenBSD, được tạo bởi các lập trình viên bậc thầy tạo ra các bản phát hành mới theo lịch, thường xuyên (hai lần một năm), với một hồ sơ bảo mật nổi tiếng "chỉ có hai lỗ hổng từ xa" trong hơn 10 năm không? (Ngay cả họ cũng có các bản vá errata cho các vấn đề ít nghiêm trọng hơn.) Không, không có nghĩa là. Tôi không dựa vào một sản phẩm có chất lượng cao như vậy, bởi vì tôi đang làm việc cho một doanh nghiệp hỗ trợ các doanh nghiệp cung cấp cho mọi người máy sử dụng Microsoft Windows, vì vậy đó là điều mà mã của tôi cần phải hoạt động.
Tính thực tiễn / khả năng sử dụng yêu cầu tôi làm việc trên các nền tảng mà mọi người thấy hữu ích và đó là một nền tảng nổi tiếng về bảo mật (mặc dù những cải tiến to lớn đã được thực hiện từ những ngày đầu của thiên niên kỷ mà các sản phẩm của cùng một công ty tệ hơn nhiều) .
Tóm lược
Có nhiều lý do tại sao lập trình máy tính dễ bị lỗi hơn và được cộng đồng người dùng máy tính chấp nhận. Trong thực tế, hầu hết các mã được viết trong các môi trường sẽ không chấp nhận các nỗ lực không có lỗi. (Một số trường hợp ngoại lệ, chẳng hạn như phát triển các giao thức bảo mật, có thể nhận được một chút nỗ lực hơn về vấn đề này.) Bên cạnh những suy nghĩ thường thấy về lý do các doanh nghiệp không muốn đầu tư nhiều tiền hơn và bỏ lỡ thời hạn nhân tạo để làm cho khách hàng hài lòng, có tác động của sự tiến bộ của công nghệ chỉ đơn giản là nếu bạn dành quá nhiều thời gian, bạn sẽ làm việc trên một nền tảng lỗi thời bởi vì mọi thứ thay đổi đáng kể trong vòng một thập kỷ.
Chính thức, tôi có thể nhớ lại đã rất ngạc nhiên khi thấy một số hàm rất hữu ích và phổ biến ngắn đến mức nào, khi tôi thấy một số mã nguồn cho strlen và strcpy. Chẳng hạn, strlen có thể là một cái gì đó như "int strlen (char * x) {char y = x; while ( (y ++)); return (yx) -1;}"
Tuy nhiên, các chương trình máy tính thông thường dài hơn thế nhiều. Ngoài ra, rất nhiều chương trình hiện đại sẽ sử dụng mã khác có thể được kiểm tra ít kỹ lưỡng hơn, hoặc thậm chí được biết là có lỗi. Các hệ thống ngày nay phức tạp hơn nhiều so với những gì có thể dễ dàng nghĩ ra, ngoại trừ bằng cách vẫy tay rất nhiều chi tiết vụn vặt như "chi tiết được xử lý bởi các cấp thấp hơn".
Sự phức tạp bắt buộc này, và sự chắc chắn khi làm việc với các hệ thống phức tạp và thậm chí sai, khiến lập trình máy tính trở thành phần cứng rất nhiều để xác minh hơn rất nhiều toán học, nơi mọi thứ có xu hướng sôi sục đến mức đơn giản hơn rất nhiều.
Khi bạn phá vỡ mọi thứ trong toán học, bạn có được những mảnh riêng lẻ mà trẻ có thể hiểu được. Hầu hết mọi người tin tưởng toán học; ít nhất là số học cơ bản (hoặc, ít nhất là, tính).
Khi bạn thực sự phá vỡ chương trình máy tính để xem những gì đang diễn ra, bạn sẽ gặp phải việc triển khai các tiêu chuẩn và mã bị hỏng cuối cùng được thực thi bằng điện tử, và việc triển khai vật lý chỉ là một bước so với vi mã mà hầu hết các nhà khoa học máy tính được đào tạo đại học Sẽ không dám chạm vào (nếu họ thậm chí còn biết về nó).
Tôi đã nói chuyện với một số lập trình viên đang học đại học hoặc những sinh viên tốt nghiệp gần đây, những người hoàn toàn phản đối quan niệm rằng mã không có lỗi có thể được viết. Họ đã viết ra khả năng này và mặc dù họ thừa nhận rằng một số ví dụ ấn tượng (mà tôi đã có thể đưa ra) là một số lập luận thuyết phục, họ coi những mẫu đó là những con sáo hiếm có thể biểu hiện được, và vẫn bác bỏ khả năng có thể đếm được về việc có các tiêu chuẩn cao hơn như vậy. (Một thái độ rất, khác nhiều so với nền tảng đáng tin cậy hơn nhiều mà chúng ta thấy trong toán học.)