Mọi lập trình viên nên biết gì về lập trình?


52

Xin vui lòng, ở lại về các vấn đề kỹ thuật , tránh các vấn đề hành vi, văn hóa, sự nghiệp hoặc chính trị.


7
Xem thêm điều này cũng stackoverflow.com/questions/132798/ Lời
pramodc84

Loại câu hỏi này thực sự làm tôi khó chịu. Nó chỉ có thể nảy sinh từ tâm trí của một người nhìn thế giới dưới dạng đen trắng. Không phải mọi lập trình viên đều có cùng một công việc và nếu đó là mẫu số chung nhỏ nhất mà bạn đang tìm kiếm, các câu trả lời dưới đây cho thấy rằng bạn chỉ cần kết thúc với một danh sách các thú cưng.
Thuyền trưởng Sensible

Câu trả lời:


92
  1. Lỗi nằm trong mã của bạn , không phải trình biên dịch hoặc thư viện thời gian chạy.

  2. Nếu bạn thấy một lỗi không thể xảy ra, hãy kiểm tra xem bạn đã xây dựng và triển khai chính xác chương trình của mình chưa. (Đặc biệt nếu bạn đang sử dụng một IDE phức tạp hoặc khung xây dựng cố gắng che giấu các chi tiết lộn xộn khỏi bạn ... hoặc nếu bản dựng của bạn bao gồm nhiều bước thủ công.)

  3. Các chương trình đồng thời / đa luồng rất khó viết và khó kiểm tra hơn. Tốt nhất là ủy thác càng nhiều càng tốt cho các thư viện và khung công tác đồng thời.

  4. Viết tài liệu là một phần công việc của bạn là một lập trình viên. Đừng để nó cho "người khác" làm.

BIÊN TẬP

Vâng, quan điểm số 1 của tôi là quá cường điệu. Ngay cả các nền tảng ứng dụng được thiết kế tốt nhất cũng có phần lỗi và một số nền tảng ít được thiết kế tốt hơn cũng đầy rẫy. Nhưng ngay cả như vậy, bạn nên luôn nghi ngờ mã của mình trước và chỉ bắt đầu đổ lỗi cho trình biên dịch / lỗi thư viện khi bạn có bằng chứng rõ ràng rằng mã của bạn không có lỗi.

Quay trở lại những ngày tôi thực hiện phát triển C / C ++, tôi nhớ các trường hợp được cho là "lỗi" tối ưu hóa hóa ra là do tôi / một số lập trình viên khác đã làm những việc mà thông số ngôn ngữ nói không có kết quả. Điều này áp dụng ngay cả đối với các ngôn ngữ được cho là an toàn như Java; ví dụ, hãy nhìn kỹ vào mô hình bộ nhớ Java (JLS chương 17).


17
Tôi thích nói "Lỗi có thể nằm trong mã của bạn", vì tôi đã gặp các lỗi trong thư viện thời gian chạy một vài lần. Tôi vẫn chưa gặp phải một lỗi biên dịch. +1 dù sao đi nữa.
Chinmay Kanchi

29
Nếu bạn chưa bao giờ tìm thấy một lỗi trung thực trong trình biên dịch, thì bạn gần như không đủ phiêu lưu với mã hóa của mình. ;)
Mason Wheeler

8
@Chinmay, @ spudd86, @Mason - vâng ... và tôi cũng đã tìm thấy phần chia sẻ của tôi về trình biên dịch và lỗi thư viện trong hơn 30 năm lập trình. Nhưng theo kinh nghiệm của tôi, 99 +% lỗi hóa ra (ít nhất là một phần) lỗi mã của tôi. Câu trả lời của tôi cố tình phóng đại điều này để vượt qua điểm mà bạn nên luôn nghi ngờ mã của mình trước.
Stephen C

5
Tôi không có nỗi sợ phi lý mà mọi người có với lập trình đa luồng. Tôi nghi ngờ những người duy trì quan điểm này, không lập trình nhiều mã đa luồng. Nó không khó lắm đâu. +1 cho mọi thứ khác mặc dù.
Steven Evers

4
Nếu bạn đang làm việc trên trình biên dịch, thì lỗi có thể nằm ở cả mã của bạn và trình biên dịch;)
Legooolas

84
  • Cách đọc mã của người khác.
  • Mã không tồn tại nếu nó không được kiểm tra trong Hệ thống kiểm soát phiên bản.

8
+10000 nếu tôi có thể cho nhận xét kiểm soát phiên bản. Lịch sử và ghi nhật ký thay đổi là hoàn toàn không thể thiếu và là lý do bạn nên đặt mọi thứ trong kiểm soát phiên bản ngay từ đầu.
Legooolas

2
... và kho lưu trữ đã được đồng bộ hóa với ít nhất một vị trí khác. Quan trọng với DVCS, nhưng cũng với VCS tập trung.

Đối với vấn đề đó, mã không tồn tại trừ khi có một mục công việc tồn tại cho phép nhà phát triển viết nó.
Jesse C. Choper

2
Tôi sẽ cộng một cái để học cách đọc mã của người khác. Khó khăn hơn là hầu hết chúng ta nhận ra, nhưng là một phần thiết yếu của lập trình thành công.
bogeymin

cộng với một để học cách đọc mã của người khác.
itaboutcode

76

Tính toán dấu phẩy động không chính xác.



Nếu bất cứ ai không biết tôi đang nói về điều gì, hãy đọc liên kết của @ Adam. Đó là một bản tóm tắt tuyệt vời về những cạm bẫy của tính toán dấu phẩy động.
Chinmay Kanchi

1
Và nếu họ không biết họ có thể nằm trong nhóm những người hỏi về stackoverflow hàng ngày.
Brian R. Bondy

1
@Brian: Thật vậy. Tôi ước có một cách để xác định các câu hỏi được giải thích bằng số học dấu phẩy động. Bạn có thể tạo Ứng dụng Stack hiển thị một câu hỏi dấu phẩy động khác nhau mỗi ngày!
Adam Paynter

63

Đừng ngừng học hỏi.


1
Liên quan: Đừng ngừng tin tưởng.
Fishtoaster

3
Liên quan: Đừng ngừng suy nghĩ về ngày mai.
ocodo

7
Liên quan: Đừng dừng âm nhạc.
adamk

1
Liên quan: Đừng ngừng di chuyển! Đó là cuộc sống của bạn, hãy tiếp tục, hãy làm cho đúng, bạn phải làm cho đúng!
ocodo

44

Rằng điều số 1 bạn có thể làm để tăng chất lượng và khả năng duy trì mã của bạn là GIẢM NGAY LẬP TỨC.


4
KHÔ, vâng! Làm thế nào tôi có thể quên? ;-)
Maniero

Điều này rất quan trọng tôi đã trả lời với nó một lần nữa .

Tôi muốn nói: GIẢM GIÁ ĐIỀU KIỆN. Mỗi while / if / for là một lỗi tiềm năng.
zvrba

1
Bạn biết đấy, điều buồn cười về DRY là nó lặp đi lặp lại ở mọi nơi. :) +1
Billy ONeal

39

Kỹ năng khắc phục sự cố và gỡ lỗi

Họ hầu như không dành thời gian cho chủ đề này trong bất kỳ khóa học lập trình nào tôi đã tham gia, và theo kinh nghiệm của tôi, nó là một trong những yếu tố quyết định lớn nhất đến việc lập trình viên làm việc hiệu quả như thế nào. Dù muốn hay không, bạn dành nhiều thời gian hơn trong giai đoạn bảo trì ứng dụng của mình so với giai đoạn phát triển mới.

Tôi đã làm việc với rất nhiều lập trình viên, những người gỡ lỗi bằng cách thay đổi ngẫu nhiên mọi thứ mà không có chiến lược nào để tìm ra vấn đề. Tôi đã có cuộc trò chuyện này hàng chục lần.

Lập trình viên khác: Tôi nghĩ chúng ta nên thử xem nó có sửa nó không.
Tôi: Được rồi, giả sử rằng nó đã sửa nó. Điều đó cho bạn biết nguồn gốc của vấn đề là gì?
Lập trình viên khác: Tôi không biết, nhưng chúng tôi phải thử một cái gì đó .


2
Tôi đã định đăng bài này. Rất nhiều công việc của một lập trình viên đang sửa lỗi và rất nhiều người có xu hướng không có khả năng làm điều đó (đặc biệt là trong mã của người khác).
Dov

+1 Tôi đã chuyển từ javascript / php sang C # và yêu thích việc chuyển qua mã. Tôi ước rằng các ngôn ngữ gõ động có thể làm tốt hơn việc này.
Evan Plaice

Một hành vi kỳ lạ khác là lập trình viên khẳng định rằng mọi phần trong chương trình của anh ta đều đúng trong khi kết quả nếu bị lỗi. "-Bạn không cần in mảng trên bàn điều khiển để kiểm tra xem nó có được sắp xếp không vì dòng trên là Array.sort ()." "-Vâng ... bạn biết đấy, nó không hoạt động. Phải có điều gì đó sai ở đâu đó. Bạn không thể bảo vệ mã của mình vào thời điểm này!"
gawi

2
Tôi nghĩ rằng điểm gỡ lỗi để xác nhận các giả định của bạn trên chương trình của bạn. Đôi khi, bạn cần phải đi câu cá cho một số manh mối. Điều này phải được thực hiện một cách có hệ thống. Nó hoàn toàn hợp lệ để thử một cái gì đó có thể cho bạn biết một cái gì đó mới. Tôi làm điều đó thường xuyên.
gawi

37
  1. Đừng khéo léo; được rõ ràng
  2. Sử dụng trước khi sử dụng lại.
  3. Tên vấn đề.
  4. Một chức năng làm 1 điều và làm nó tốt.
  5. Nhỏ thì tốt hơn lớn.

2
Bạn có thể làm rõ "Sử dụng trước khi sử dụng lại". Tôi chưa từng nghe điều đó trước đây.
Tjaart

34

Những thứ cơ bản. Hiện tại các lập trình viên học các công nghệ không phải là khái niệm. Nó sai.


Có và không. Bạn có vẻ như mọi giáo sư tôi từng có ở trường đại học ... tất cả những người này không bao giờ tạo ra một phần mềm trong suốt cuộc đời của họ. Kiến thức, không có kỹ năng là vô ích trong nghề nghiệp của chúng tôi.
Steven Evers

4
+1, rất đúng. Vâng, đây là điều mà các loại tháp ngà muốn nói, nhưng nó không làm cho nó trở nên ít đúng với phần còn lại của chúng ta trong các chiến hào.
MAK

2
Cơ bản như chính tả? Its wrongnên it's wrong, ví dụ.
Konerak

2
Không, những điều cơ bản như không quan tâm đến lỗi đánh máy mà quan tâm đến các vấn đề lập trình.
clrod

5
Thật dễ dàng để tìm hiểu các bước để làm một cái gì đó và thường rất khó để tìm ra khi nào bạn nên sử dụng nó và quan trọng hơn là khi bạn có thể sử dụng nó nhưng không nên. Sách giáo khoa đặc biệt tệ trong việc chỉ ra cách thức nhưng không phải tại sao (và tại sao không).
HLGEM

27

Mọi lập trình viên nên biết rằng anh ta luôn đặt giả định vào mã, ví dụ: "con số này sẽ tích cực và hữu hạn", "mã này sẽ có thể kết nối với máy chủ mọi lúc trong nháy mắt".

Và anh ta nên biết rằng anh ta nên chuẩn bị khi những giả định đó bị phá vỡ.


6
đặc biệt nêu rõ những người có assert()- ở mọi nơi. assert()sẽ giúp bạn ghi lại các giả định của mình và cứu bạn khi bạn sai.
Dustin

@Dustin +1 Không có cách nào bạn có thể nhớ tất cả các giả định của mình - ghi lại chúng theo chương trình và bạn sẽ được thông báo chính xác khi chúng biến thành các giả định sai.
Skilldrick

1
... Trừ khi được biên dịch bằng NDEBUG.

19

Mỗi lập trình viên nên biết về thử nghiệm.


6
Nó không hoạt động trừ khi bạn đã thử nghiệm nó.
JD Frias

17

Tìm hiểu các khái niệm . Bạn có thể Google cú pháp.


Về mặt lý thuyết, ngoại trừ Google rất tệ trong việc tìm kiếm cú pháp cụ thể : Tìm kiếm các cụm từ như "tham chiếu đối tượng" hoặc "điều này" đưa ra một kết quả đáng kinh ngạc và tìm kiếm các thành ngữ như "$?" không có kết quả nào cả
l0b0

16

Tư duy phản biện và logic. bạn không thể làm bất cứ điều gì tốt mà không có nó.


14

Kiểm tra đơn vị. Đây là một cách tuyệt vời để mã hóa các giả định của bạn về cách sử dụng mã.



13

Điều đó khó hơn bạn nghĩ.

Mặc dù thật dễ dàng để kết hợp một thứ gì đó hoạt động khi sử dụng bình thường, đối phó với đầu vào sai, tất cả các trường hợp cạnh và góc, chế độ thất bại có thể, v.v ... đều tốn thời gian và có lẽ sẽ là phần khó nhất của công việc.

Sau đó, bạn phải làm cho ứng dụng trông cũng tốt.


3
Tôi nghĩ rằng đây là nguồn gốc của câu nói cũ '90% công việc chiếm 90% thời gian. 10% cuối cùng chiếm 90% thời gian còn lại '
GSto

Tôi nghĩ rằng rất nhiều người có xu hướng liên tục đánh giá thấp sự phức tạp. "X khó đến mức nào?" - những lời cuối cùng nổi tiếng: /
Roman Starkov

@ Tôi không muốn làm việc 180%, 100% là tốt đối với tôi!
adamk

13

Kiến thức tên miền. Thông số kỹ thuật không bao giờ là 100%; biết tên miền thực tế mà bạn đang phát triển sẽ LUÔN LUÔN tăng chất lượng sản phẩm.



11

Con trỏ, rõ ràng. :)


3
Con trỏ chỉ thực sự cần thiết trong một tập hợp ngôn ngữ cho một tập hợp nhỏ các tác vụ. Đối với hầu hết các tác vụ, bạn có thể (và có thể) lập trình như thể khái niệm con trỏ không tồn tại.
Chinmay Kanchi

14
@Chinay Kanchi số Con trỏ nên được mọi người hiểu.
thay thế

5
Điều đó thực sự phụ thuộc vào những gì bạn có nghĩa là con trỏ. Nếu bạn có nghĩa là con trỏ kiểu C mà bạn có thể thao tác (đó là những gì tôi giả định), tôi sẽ lập luận rằng một lập trình viên Java / C # / Python không cần biết gì về chúng. Nếu bạn có nghĩa là con trỏ như trong "tài liệu tham khảo" của Java, nghĩa là, một con trỏ không thể sử dụng được, thì có, một số kiến ​​thức về chúng là cần thiết, nếu chỉ để ngăn bạn trượt lên.
Chinmay Kanchi

@mathepic Bạn sẽ bị lung lay đến cốt lõi của mình nếu bạn học được bao nhiêu sinh viên CS tốt nghiệp mỗi năm mà không hiểu điều đầu tiên về con trỏ. Nếu tôi không đi theo vị trí của mình vào mỗi mùa hè, tôi thậm chí sẽ không được dạy về con trỏ trong C hoặc tài liệu tham khảo trong Java ...
Mike B

5
@Chinmay: Một lập trình viên Python / Java / C # không hiểu khái niệm con trỏ sẽ bị mất. L = [[]] * 2; L[0].append(42) Ngôn ngữ khác nhau sử dụng tên gọi khác nhau, nhưng gián tiếp là điều cần thiết ở khắp mọi nơi.

11

Mã hoàn thành 2 - bìa để che


bạn thực sự nên biết điều này trước khi bạn chấp nhận tiền để lập trình. Nếu bạn tìm thấy điều mà bạn không biết trong đó, hãy xem xét một sự thay đổi nghề nghiệp hoặc một giai đoạn học tập tự định hướng mạnh mẽ để giúp bạn vượt qua tất cả. Và sau đó xin lỗi đồng nghiệp của bạn. Và nó chỉ bao gồm những điều cơ bản về lập trình.
Tim Williscroft

11

Dữ liệu quan trọng hơn mã.

Nếu dữ liệu của bạn thông minh, mã có thể bị câm.

Mã câm là dễ hiểu. Dữ liệu thông minh cũng vậy.

Hầu như mọi sự đau buồn về thuật toán mà tôi từng có là do dữ liệu ở sai vị trí hoặc bị lạm dụng ý nghĩa thực sự của nó. Nếu dữ liệu của bạn có ý nghĩa hãy đặt ý nghĩa đó vào hệ thống loại .


2
Bạn đã cho tôi tất cả các cách cho đến khi bạn nói "loại hệ thống."

10

Ngôn ngữ và môi trường nào phù hợp nhất cho công việc. Và nó không phải luôn luôn là yêu thích của bạn.


10

Phân chia và chinh phục. Đó thường là cách tốt nhất để giải quyết bất kỳ loại vấn đề thực tế nào từ lập lịch đến gỡ lỗi.


8

Kỹ năng thực sự được thể hiện ở khả năng thực hiện tốt một thiết kế đơn giản, chứ không phải ở khả năng làm cho một thiết kế phức tạp hoạt động cả.

Kỹ năng này xuất phát từ việc làm chủ nhiều hơn các nguyên tắc cơ bản, không phải là thông thạo về ma trận. Một lập trình viên có trình độ cao không được xác định bởi khả năng mã hóa những gì người khác không thể (sử dụng các hàm cấp cao hơn, lập trình chức năng nâng cao, những gì bạn có) mà thay vào đó là khả năng tinh chỉnh mã hóa hoàn toàn trần tục. Lựa chọn phân rã thích hợp của chức năng giữa các lớp; xây dựng trong sự mạnh mẽ; sử dụng các kỹ thuật lập trình phòng thủ; và sử dụng các mẫu và tên dẫn đến tài liệu tự lớn hơn, đây là bánh mì và bơ của lập trình có năng lực cao.

Viết mã tốt mà bạn hoặc người khác có thể quay lại sau một tuần hoặc một năm và hiểu cách sử dụng, sửa đổi, nâng cao hoặc mở rộng mã đó là rất quan trọng. Nó giúp bạn tiết kiệm thời gian và nỗ lực tinh thần. Nó làm tăng các bánh xe năng suất bằng cách loại bỏ các rào cản mà bạn sẽ vấp ngã trước đây (có thể làm gián đoạn quá trình suy nghĩ của bạn, hoặc có thể mất hàng giờ hoặc nhiều ngày nỗ lực từ công việc khác, v.v.) Giúp bạn dễ dàng tập trung vào các vấn đề khó khăn hơn và đôi khi nó làm cho những vấn đề khó khăn biến mất

Trong một từ: thanh lịch. Mỗi lớp, mọi phương thức, mọi điều kiện, mọi khối, mọi tên biến: phấn đấu cho sự thanh lịch.


8

Không bao giờ đổ lỗi cho người dùng những gì có thể được sửa chữa với trải nghiệm người dùng sạch hơn hoặc tài liệu tốt hơn. Thông thường, các lập trình viên tự động cho rằng người dùng là một thằng ngốc không thể làm gì đúng, khi vấn đề là trải nghiệm tổng thể kém hoặc thiếu giao tiếp. Các chương trình được sử dụng và đối xử với người dùng một cách khinh miệt là bỏ lỡ điểm lập trình ngay từ đầu.


6

Mỗi lập trình viên nên biết cách sử dụng trình gỡ lỗi và biết cách sử dụng nó tốt .




4

Đánh giá ngắn mạch, mặc dù đó là một trong những điều đầu tiên họ dạy cho bạn về các toán tử boolean.


4

Cách ước tính chính xác thời gian một tính năng sẽ mất để thực hiện. Quan trọng hơn, làm thế nào để truyền đạt bạn không nhảm nhí khi bạn gửi ước tính đó.


2
hoặc tìm hiểu làm thế nào để tiếp khách tốt và truyền đạt bạn không phải là khách mời ...;)
Billy Coover

4

Các vấn đề về phong cách mã hóa:

  • vấn đề thụt đầu dòng nhất quán,
  • sử dụng nhất quán không gian trắng (ví dụ như xung quanh các nhà khai thác),
  • vị trí nhất quán của {} s vấn đề,
  • vấn đề định danh được lựa chọn tốt,
  • Vân vân.

... và các vấn đề thiết kế tốt.

Lý tưởng nhất, lập trình viên học những điều này trước (hoặc trong) đánh giá mã đầu tiên của anh ấy / cô ấy. Trong trường hợp xấu nhất, lập trình viên học được chúng khi ông chủ bảo anh ta / cô ta thực hiện một số thay đổi không tầm thường đối với một số mã khủng khiếp một cách vội vàng.

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.