Có phải là khôn ngoan cho một nhà phát triển cấp cao dành thời gian nghiên cứu lắp ráp? [đóng cửa]


33

Rõ ràng là kiến ​​thức về công cụ cấp thấp là rất quan trọng trong công việc của chúng tôi.

Nhưng trong tình huống bạn đang phát triển phần mềm thương mại ở cấp độ cao khi bạn đã có một hướng được chọn nhưng không có bất kỳ kỹ năng lắp ráp nào, thì có hợp lý hơn không khi tập trung vào nghiên cứu những thứ liên quan đến hướng của bạn? Hoặc có một lý do nào đó bạn nên dành một chút thời gian để tìm hiểu những điều cơ bản ở cấp độ thấp?

Khi nào thì quá muộn, và khi nào thì không? Và nếu không quá muộn, vậy thì làm thế nào để học tập một cách tối ưu (theo nghĩa là không dành quá nhiều thời gian để có được chiều sâu và hiểu biết)?


Rất nhiều câu hỏi trong một bài :)
Shamim Hafiz

Tôi rất thích ngôn ngữ hội từng bước. Ban đầu rất nhiều chương trình noobie-ish, nhưng tác giả rất thú vị. Tôi thấy có một ý tưởng chung là hữu ích và tôi chủ yếu viết JavaScript.
Erik Reppen

Ngôn ngữ đầu tiên (được dạy) của tôi là một phương ngữ lắp ráp. Tôi có thể thấy nó sẽ hữu ích như thế nào (theo rất nhiều cách mà người khác đã chỉ ra), và nó giúp bạn cung cấp đầu vào khác nhau cho các thành viên còn lại trong nhóm.
Jamie Taylor

Câu trả lời:


43

Không thể tin rằng không ai đã đề cập đến việc gỡ lỗi ...

Tôi đã không viết một dòng mã lắp ráp trong nhiều năm nay. Nhưng tôi đọc nó hợp lý thường xuyên. Gỡ lỗi cấp độ cao rất tốt khi bạn có thông tin về nguồn và ký hiệu, nhưng khi thư viện ưa thích của bạn đưa ra một ngoại lệ chưa được xử lý trên các máy của khách hàng, đã quá muộn để yêu cầu đưa nó vào giấy phép ...

Nhưng tôi vẫn có thể mở trình dịch ngược và xem logic cấp cao của bạn cuối cùng đã làm gì , theo dõi dữ liệu xấu về nguồn gốc của nó, tìm ra ai đã thay đổi thanh ghi điều khiển FPU ...

Điều này đã tiết kiệm thịt xông khói của tôi thường xuyên hơn tôi nghĩ về. Và không bao giờ là quá muộn để tìm hiểu - có rất nhiều tài liệu tham khảo và hướng dẫn tuyệt vời trên 'Net, và bất kỳ chương trình nào chạy trên máy của bạn đều có thể cung cấp môi trường thực hành.


10
+1 và tôi sẽ nâng cấp nó nhiều hơn nếu tôi có thể. Mỗi nhà phát triển nghiêm túc cần có khả năng đọc ASM cho điều này nếu không có lý do khác.
Mason Wheeler

3
Hệ quả của điều này là tối ưu hóa. Biết làm thế nào trình biên dịch chuyển mã của bạn thành hội đồng có thể giúp bạn làm cho nó nhanh hơn đáng kể!
lambacck

3
+1 Hội là một trong những ngôn ngữ duy nhất buộc bạn phải hiểu cách bộ xử lý thực sự hoạt động. Nó giúp bạn trong sự phát triển của bạn với ngôn ngữ cấp cao. Phải đọc: blogs.msdn.com/b/ericlippert/archive/2010/09/30/...

Biết được máy tính cơ bản là điên cuồng hữu ích, cho dù để gỡ lỗi, tối ưu hóa, hoặc tò mò tuyệt. Nghiêm túc, học cách đọc ít nhất một hoặc hai họ ngôn ngữ lắp ráp. Ngay cả khi bạn không bao giờ đọc nó hoặc viết nó sau khi học nó, nó sẽ ảnh hưởng đến cách bạn hiểu mọi thứ trong tương lai. Bây giờ, nếu bạn không muốn viết bằng ngôn ngữ khác, điều đó có thể hơi nhiều ...
Michael Trausch

1
@Mason: Tôi không biết liệu "mọi nhà phát triển nghiêm túc" có cần đọc ASM không. Nếu bạn đang viết JavaScript hoặc sử dụng ngôn ngữ lập trình được xây dựng trên một khung dày (như .NET hoặc Java), tôi sẽ không coi việc có thể đọc ASM là điều cần thiết để trở thành một nhà phát triển nghiêm túc. Điều đó đang được nói, có một sự hiểu biết về cách máy tính thực hiện các hướng dẫn ở mức rất thấp có thể khá hữu ích, ngay cả trong các ngôn ngữ và môi trường lập trình bậc cao.
Scott Mitchell

15

Bạn không cần phải học ngôn ngữ lắp ráp, bạn chỉ cần hiểu cách thức hoạt động của nó. Bạn cần biết XOR là gì và tính nhị phân trong giấc ngủ của bạn, v.v. Nhưng tôi chưa bao giờ cần mã lắp ráp trong công việc của mình.

Vì vậy, như bạn nói, kiến ​​thức về các công cụ cấp thấp là quan trọng, nhưng kiến ​​thức thực tế về lắp ráp thì không.


1
Tôi thứ hai. Bạn có thể kiếm được một chương trình sống tốt và không bao giờ phải đọc / viết ASM. Có một số vị trí yêu cầu nó. Đọc một bãi chứa sau khi một điều kiện cuộc đua trong mã của bạn đã làm giảm quá trình. Hoặc nếu bạn viết các chương trình rất chuyên sâu (như song song hóa GPU / OpenCL). Tỷ lệ phần trăm công việc dev nơi bạn sẽ được yêu cầu để thực hiện các tác vụ này là rất nhỏ.
yzorg

11

Nếu bạn thực sự không có kỹ năng lập trình cấp thấp, tôi rất khuyên bạn nên học một số thời gian rảnh rỗi. Bạn không cần phải trở thành một chuyên gia về nó; chỉ cần đạt đến một mức độ thành thạo Bạn phải tự làm rất nhiều công việc toán học, thay vì phụ thuộc vào trình biên dịch hoặc thư viện để làm việc đó cho bạn. Nó sẽ giúp bạn hiểu khả năng đọc trong lập trình, vì hầu hết các lệnh lắp ráp tương ứng với một lệnh của bộ xử lý. Bạn phải tự mình quản lý sự phức tạp trong các chương trình lớn hơn một chút, mà không có lợi ích của những thứ như thế if...else. Điều này sẽ giúp bạn viết các chương trình cấp cao đơn giản hơn, vì kinh nghiệm lắp ráp sẽ dạy cho bạn cách đọc dễ dàng hơn nhiều.

Ngoài ra, hãy nhớ rằng lắp ráp không phải là một ngôn ngữ! Đây là một thuật ngữ chung, về cơ bản có nghĩa là tập lệnh của bộ xử lý đã được trừu tượng hóa thành ngôn ngữ tượng trưng. Các bộ xử lý khác nhau có các tập lệnh khác nhau và do đó các ngôn ngữ lắp ráp khác nhau. Khi bạn học 'lắp ráp', bạn học một quy trình, không phải ngôn ngữ.


8

Bạn sẽ luôn được hưởng lợi từ việc lên đỉnh dưới vỏ bọc và hiểu thêm một chút về những gì nằm dưới sự trừu tượng mà bạn đang đứng trên đỉnh. Như một giáo sư đại học của tôi đã từng nói "Tất cả các lập trình viên giỏi đều hiểu phần cứng" - bạn không cần phải tạo và điều khiển các mạch, nhưng bạn nên nắm bắt được những gì đang diễn ra ở đó - nó sẽ chỉ làm bạn tốt hơn

Hãy thử Thiết kế và Tổ chức Máy tính


1

- Học tập liên tục, suốt đời là một thành phần thiết yếu của sự nghiệp phát triển Phần mềm. Nếu bạn quan tâm đến việc tiếp tục tìm hiểu về lập trình và cách cải thiện nghề của mình thì có, đôi khi bạn nên học lắp ráp vì nó sẽ đưa bạn đến một ngôn ngữ và cách viết mã hoàn toàn mới. Vì lý do tương tự, tôi khuyên bạn nên thử nghiệm nhiều ngôn ngữ / phong cách lập trình bao gồm Ruby / Python (ngôn ngữ động), Haskell / F # (ngôn ngữ chức năng thuần túy), Lisp / Scheme (ngôn ngữ chức năng), v.v ...

Tôi sẽ nói rằng đã quá muộn nếu bạn không còn hứng thú tìm hiểu thêm về nghề lập trình. Ví dụ: nếu bạn đã đạt đến đỉnh cao trong sự nghiệp, nơi bạn có thể sớm chuyển từ lập trình sang một lĩnh vực khác như Quản lý, Kỹ thuật hệ thống, Bán hàng / Tiếp thị, v.v. Nếu bạn nghĩ rằng bạn có thể muốn chuyển sang một lĩnh vực mới trong vài năm tới tôi sẽ tập trung nhiều hơn vào các kỹ năng cần thiết để phát triển trong lĩnh vực đó, thay vì vào nghề lập trình.


1

Bạn nên biết nó là gì và máy tính đang làm gì. Học cái gì đó như Knuth MIX sẽ giúp bạn. Chủ yếu là có thể đánh giá hiệu quả của mã của bạn. Đi lấy Nghệ thuật lập trình máy tính và đọc nó. Nó sẽ làm cho bạn một lập trình viên thông minh hơn.


1

Có hợp lý hơn không khi tập trung vào nghiên cứu những thứ liên quan đến hướng đi của bạn? Hoặc có một lý do nào đó bạn nên dành một chút thời gian để tìm hiểu những điều cơ bản ở cấp độ thấp?

Câu trả lời:

  1. Nếu bạn không có kế hoạch thay đổi hướng của mình sang lập trình hệ thống nhúng, không có lý do gì để học cách giả mạo. Thậm chí nghĩ rằng lắp ráp là CPU phụ thuộc vào bạn có thể học một số điều cơ bản nhưng kiến ​​thức của bạn sẽ dựa trên kiến ​​trúc CPU và tập lệnh cho CPU đó.
  2. Giả sử bạn mã cho Windows. Nếu muốn học cấp độ thấp hơn ngôn ngữ cấp cao có thể có lợi cho hướng đi hiện tại của bạn, tôi khuyên bạn nên tìm hiểu Windows I sâu, API Windows, quản lý bộ nhớ Windows, v.v. Chỉ cần tìm hiểu hệ điều hành / Nền tảng bạn đang mã hóa.
  3. Cải thiện kỹ năng của bạn trên ngôn ngữ cấp cao hiện tại của bạn, chẳng hạn như quản lý bộ nhớ, thu gom rác, v.v. Nếu bạn muốn đi cấp thấp.

0

Tôi nghĩ rằng bạn đạt đến một điểm giảm lợi nhuận khi sự nghiệp của bạn thăng tiến. Đó là, bạn nên học ngôn ngữ lắp ráp sớm, vì nó dẫn đến sự hiểu biết cơ bản tốt hơn về mọi thứ xuất hiện sau đó. Tuy nhiên, nếu bạn đã ở trong lực lượng lao động và có một vài năm kinh nghiệm, bạn sẽ có cảm giác về cách mọi thứ hoạt động, vì vậy việc tìm hiểu các chi tiết thực tế có thể không cung cấp cho bạn nhiều thông tin chi tiết .


0

Tôi không biết việc sử dụng lắp ráp sẽ như thế nào. Nhưng ít nhất thực hiện một số chương trình bằng một ngôn ngữ như C sẽ có lợi. Gần đây tôi đã phải thực hiện một số chương trình trong C và tôi đã thấy nó khá là khai sáng. C loại bỏ phần lớn sự trừu tượng có trong các ngôn ngữ cấp cao hơn. Những trừu tượng đó không đến mà không có chi phí. Bạn phải quản lý nhiều chi tiết cấp thấp hơn trong C, trong đó ở ngôn ngữ cấp cao hơn, các chi tiết đó đang được quản lý cho bạn. Bằng cách thực hiện một số chương trình trong C, bạn sẽ phải nhận thức được những chi tiết đó. Vì vậy, khi bạn trở lại với ngôn ngữ hàng ngày, bạn vẫn sẽ có nhận thức đó và sẽ đánh giá cao hơn những gì đang thực sự xảy ra. Điều đó sẽ giúp làm cho bạn một lập trình viên tốt hơn.


0

Trong nghề Dạy học, ít nhất là tại Vương quốc Anh, giáo viên phải có trình độ vượt xa những gì họ dạy. Một giáo viên Trung học (Trung học) sẽ có bằng cấp về môn học họ dạy, và các giáo viên tiểu học (Tiểu học) cũng có bằng cấp, và phải thành thạo tất cả các môn chính cho đến cấp độ GCSE tốt (trung học phổ thông bài kiểm tra xuất cảnh?, không có tương đương trên thực tế của Hoa Kỳ).

Tại sao? Bởi vì để dạy một cái gì đó tốt, hoặc thực sự sử dụng một cái gì đó tốt, bạn phải hiểu nó. Điều này đòi hỏi phải hiểu cấu trúc cơ bản, chuỗi các quyết định trước khi bạn làm việc với nó dẫn đến nó. Để hiểu đúng về mã cấp cao, bạn phải hiểu lớp được xây dựng, cách thức hoạt động, điểm mạnh và điểm yếu của nó nằm ở đâu. Điều này là đệ quy, để hiểu lớp bên dưới, bạn cũng phải hiểu lớp bên dưới.

Cuối cùng, đây là lý do tại sao các khóa học đại học / cao đẳng đàng hoàng về Điện toán yêu cầu khả năng toán học tốt trước mọi thứ khác, vì đó thực sự là bước đi cuối cùng.

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

Nếu bạn thiếu kiến ​​thức trong các lĩnh vực này, thì sự hiểu biết của bạn bị tổn hại bên dưới nó. Càng gần với cấp độ bạn vận hành một lớp khác, điều quan trọng hơn là phải có một nền tảng trong nó.

Vì vậy: Bạn có cần biết trình biên dịch mã như một lập trình viên cấp cao không?  Nó sẽ giúp.


0

Nó đã từng rất quan trọng trong cuộc sống trước đây của tôi với tư cách là một bậc thầy siêu máy tính. Hồi đó tôi cảm thấy bạn không hiểu máy móc cho đến khi bạn đã viết ít nhất vài trăm dòng trình biên dịch, và sửa lại nó để cố gắng giảm hiệu năng. Vì rất ít lập trình viên muốn đi sâu đến thế, nó khiến tôi thực sự không thể thiếu. Và tôi vẫn có một ngôn ngữ chung khi nói chuyện với các loại thiết kế CTNH.

Nhưng, thực sự nhu cầu / lợi ích cho việc này chủ yếu là một vài thập kỷ qua. Giữa các tiến bộ của trình biên dịch và tiến bộ thực thi CTNH, có rất ít phạm vi để có thể chơi anh hùng bằng cách viết trình biên dịch chương trình nữa. Mặc dù tôi nghĩ nó hữu ích để hiểu cách mọi thứ hoạt động. Tôi có kế hoạch dạy cho những đứa trẻ của tôi (sinh viên năm nhất chuyên ngành CS) lập trình một trình biên dịch rất đơn giản trên một máy ảo đơn giản, để chúng có cảm giác về những gì đang diễn ra. Hy vọng rằng chúng ta có thể chơi với những thứ như unrolling, pipelining phần mềm, cache, và tìm nạp trước, tải dưới cùng, v.v. Vì vậy, ít nhất họ sẽ biết rằng ở một mức độ nào đó, công cụ này đang diễn ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.