Kỹ thuật lập trình chung để tăng tốc thời gian mã hóa


20

Tôi đang chuẩn bị cho một cuộc thi lập trình nơi chúng tôi phải viết mã bằng C ++ và tất cả chỉ là về việc sản xuất mã làm việc trong một thời gian ngắn. Một ví dụ sẽ là sử dụng macro để lấy tối thiểu hai int hoặc sử dụng memsets để khởi tạo mảng (nhưng tôi được cho biết rằng bạn không nên sử dụng ở đây ).

Điều này dẫn đến câu hỏi, loại kỹ thuật mã hóa nào tồn tại để sử dụng trong một công việc thực tế?


26
Tôi đoán rằng các kỹ thuật bạn sử dụng trong một cuộc thi viết mã có thể không liên quan gì đến các kỹ thuật bạn sử dụng trong một công việc thực tế.
Doug T.

1
Tôi đã không yêu cầu các kỹ thuật tại một công việc thực sự, tôi đã yêu cầu các kỹ thuật trong một cuộc thi viết mã.
marktani

1
@DougT. Tôi đồng ý, các thủ thuật cho một cuộc thi viết mã không phải là chủ đề, nhưng tôi cũng nghĩ bạn có thể mở rộng để nói về năng suất trong môi trường làm việc và làm thế nào để bạn giảm thời gian tốt nhất cho mã khỉ
James

1
Tại sao bạn không nên sử dụng memsets để kích hoạt các mảng động?
James

3
Đừng sử dụng c ++. Sử dụng ngôn ngữ cấp cao nhất bạn có thể.
Kevin

Câu trả lời:


52

Cách để tạo ra mã làm việc nhanh là ... chậm lại. Thực hiện các bước rất nhỏ. Hãy chắc chắn rằng bạn biết mỗi bước là gì. Hãy chắc chắn rằng sau mỗi bước mã của bạn biên dịch và chạy.

Tốt nhất của tất cả, sử dụng Phát triển dựa trên thử nghiệm. Viết một bài kiểm tra thất bại. Viết mã vừa đủ để thực hiện bài kiểm tra. Tái cấu trúc để làm cho mã sạch, đảm bảo nó vẫn vượt qua tất cả các bài kiểm tra. Nói lại.

Nếu bạn không làm điều này, thì rất dễ dàng để viết một đống mã lớn, không hoạt động. Sau đó, bạn sẽ mất rất nhiều thời gian để tìm ra lý do tại sao nó không hoạt động.


21
Bạn nghiêm túc chứ? TDD cho cuộc thi lập trình?
Codism

1
@Codism: các câu hỏi đã được mở rộng để bao gồm các kỹ thuật áp dụng cho phát triển phần mềm thông thường.
Dima

2
TDD chắc chắn giúp làm cho mã của tôi tốt hơn, nhưng nó chưa bao giờ giúp tôi viết mã nhanh hơn. Một môi trường lập trình tương tác (ví dụ như bảng điều khiển Groovy, Lisp REPL, v.v.) đã là trình tiết kiệm thời gian lớn nhất trong trải nghiệm của tôi.
erturne

3
-1 cho TDD. Điều đó có ý nghĩa nếu dự án là dài hạn, không phải là một cuộc thi hackathon ngắn.
TheLQ

1
@TheLQ Chỉ vì bạn muốn dành toàn bộ thời gian của mình để sử dụng trình gỡ lỗi không có nghĩa là TDD là một gợi ý tồi.
byxor

29

Xem xét các thư viện tiêu chuẩn mạnh mẽ, đặc biệt là các thuật toán STL. Điều này sẽ giúp bạn tiết kiệm nhiều dòng mã và rất nhiều thời gian. Chìa khóa để chiến thắng các cuộc thi lập trình là trong lập trình ở mức càng cao càng tốt. Trong C ++, không có thư viện bên ngoài, điều này có nghĩa là các cuộc gọi STL thay vì các vòng lặp.


+1 - Tôi hoàn toàn đồng ý với điều này. Biết cách nhanh chóng viết mã trong STL là rất lớn trong các loại cạnh tranh này.
Jordan Parmer

23

Tôi thường xuyên tham gia các cuộc thi ACM, hy vọng một số lời khuyên này sẽ giúp bạn:

  • Như những người khác đã nói, làm quen với ngôn ngữ , trong C ++, đặc biệt là STL, nó có cả hai chức năng phổ biến mà bạn muốn sử dụng (binary_search, min, max) và cấu trúc dữ liệu mạnh mẽ để tiết kiệm thời gian của bạn (ngăn xếp để tránh đệ quy thẳng , xếp hàng cho BFS, thậm chí ưu tiên cho Dijkstra nếu bạn thích theo cách đó).

  • Xác định danh mục của vấn đề, nếu đó là toán học, lập trình động, lý thuyết đồ thị, v.v. Hãy tự hỏi: Bạn quen thuộc với loại vấn đề đó như thế nào? Sau khi làm điều này, bạn nên đưa ra quyết định liên quan đến thứ tự mà bạn sẽ giải quyết chúng , đi đôi với điểm tiếp theo ...

  • Bạn muốn hiểu vấn đề hoàn toàn trước khi gõ, giải quyết vấn đề đúng , trong các cuộc thi đầu tiên của tôi, tôi đã nghĩ rằng nếu tôi không gõ thì tôi đã lãng phí thời gian; Sau đó tôi thấy rằng đây là một sai lầm.

  • Đừng nghĩ rằng bình luận là lãng phí thời gian, ít nhất là trong mã "thông minh", bạn không muốn gỡ lỗi từng dòng một để xem điều gì sai (đó là một sự lãng phí thời gian thực sự), giá trị rõ ràng .

  • niềm vui .


6
+1 để hiểu vấn đề hoàn toàn trước khi gõ. Mặt khác, bạn đang lãng phí thời gian của nhóm (cuộc thi ACM là 3 người một máy tính)
Codism

Câu trả lời tốt đẹp. :)
Jared Farrish

13

Chà, nghe có vẻ như bạn chỉ biết C chứ không biết C ++ chút nào. Những câu hỏi này dễ dàng được trả lời bởi một người có kiến ​​thức làm việc cơ bản về ngôn ngữ.

Một ví dụ sẽ là sử dụng macro để lấy tối thiểu hai số nguyên

Chỉ cần sử dụng một chức năng? std::minđã tồn tại.

hoặc sử dụng memsets để khởi tạo mảng

std::array<T, N> đã khởi tạo nội dung của nó.

Những loại kỹ thuật mã hóa tồn tại để sử dụng tại một công việc thực tế?

Bước đầu tiên là biết ngôn ngữ bạn đang sử dụng.


Tôi đang cố gắng để biết ngôn ngữ tôi đang sử dụng, đó là lý do tại sao tôi hỏi câu hỏi này! Cảm ơn cho đầu vào về điều này .
marktani

7
Oh. Tôi đã hiểu nhầm câu hỏi của bạn rồi. Tôi muốn giới thiệu một cuốn sách . Chúng tôi vui lòng chỉ trình bày những cuốn sách đáng đọc, thay vì những cuốn sách dạy C rác.
DeadMG

10

Ngoài việc biết ngôn ngữ, hãy biết các công cụ của bạn, đặc biệt là trình soạn thảo của bạn. Tôi đã mã hóa được hơn 15 năm một cách chuyên nghiệp và tôi đã thấy các lập trình viên tuyệt vời đã chậm lại vì các lệnh biên tập duy nhất họ sử dụng là các phím con trỏ và crtl-x / c / v ..

Trình chỉnh sửa của bạn có hỗ trợ một lần nhấn phím để xóa một dòng không? Để thụt lại một dòng? Di chuyển giữa các chức năng / phương thức? chọn khối / dán? đánh dấu trang? Di chuyển bằng lời nói? Trình soạn thảo có thể tự động tạo các lớp / phương thức / hàm không? Nó có hỗ trợ các mẫu mà bạn có thể tạo trước thời hạn không? Tái cấu trúc nhanh? Ghi macro?

Biết trình soạn thảo của bạn rất có thể tăng tốc thời gian phát triển.


1
amen Tôi chỉ làm việc với một anh chàng mới rất nhanh ... và sử dụng vim. Nó hiệu quả với anh ta vì anh ta đã dành thời gian để học cách sử dụng nó.
gbjbaanb

Ngoài ra ... nếu trình chỉnh sửa của bạn không hỗ trợ hầu hết mọi tính năng được liệt kê ở đây - hãy tìm trình chỉnh sửa tốt hơn.
Abhi Beckert

phỏng vấn trong tài liệu google ... kinh nghiệm tồi tệ nhất vì lý do này.
UmNyobe

6

Nghĩ trước khi hành động. Tốt hơn là suy nghĩ và lập kế hoạch trước khi viết một lớp thực hiện hơn là sau ba lần thất bại. Ngoài ra, suy nghĩ trong khi bạn hành động - thực hiện mọi thứ trong các bước nhỏ giúp đơn giản hóa rất nhiều quá trình phát triển.

Chỉ viết mã bạn cần tại thời điểm này. Đó là, đừng bắt đầu viết mã với tâm lý như: " Tôi sẽ cần các chức năng này sau này để tôi có thể viết các nguyên mẫu của chúng trong khi tôi làm việc đó ". Mọi thứ thay đổi, kế hoạch thay đổi. Bạn sẽ kết thúc với mã mà thậm chí có thể không sử dụng được. Thật lãng phí thời gian.

Biết những gì bạn đang làm. Không có gì tệ hơn là cố gắng nhớ các chức năng và tính năng cơ bản của ngôn ngữ và / hoặc thư viện hoạt động như thế nào. Làm quen với (các) công cụ bạn sử dụng.



4

Đã có nhiều câu trả lời rồi, tôi vẫn muốn thêm ý kiến ​​của mình.

Để tăng tốc mã hóa của bạn, hãy trở thành một người đánh máy cảm ứng với tốc độ nhanh đến mức trong khi gõ bạn có thể tập trung cả vào logic và mã. Có nhiều phần mềm để học đánh máy (Typing Master, Rapid Typing, KTouch, gTypist chẳng hạn), sử dụng chúng

Tôi đã thấy nhiều lập trình viên có kinh nghiệm vẫn còn đánh máy hai ngón tay. Điều này dẫn đến mã khó chịu không có tài liệu và mã thực sự khó hiểu với macro và tên loại viết tắt.



Câu trả lời chính xác. Tôi sẽ thêm rằng những người nhìn vào bàn phím thay vì màn hình thường gõ rác trước khi họ nhận ra và phải quay lại. Hoặc họ sẽ gõ vào cửa sổ sai. Và điều đáng buồn là, họ không nhận ra điều này làm họ chậm lại đến mức nào.
Dave Markle

2

Phát triển phần mềm là một trong những hoạt động 80-20 kinh điển đó - tức là 80% công việc đầu tiên chiếm 20% thời gian và 20% công việc cuối cùng chiếm 80% thời gian.

Do đó, chìa khóa để tăng tốc công việc của bạn nói chung là, để nỗ lực cải thiện hiệu suất của bạn cho 20% nỗ lực đó. Đây thường là giai đoạn gỡ lỗi và công việc để gắn kết mọi thứ lại với nhau và làm cho nó có thể sử dụng được.

Bạn có thể cải thiện điều này bằng cách chăm sóc nhiều hơn trong giai đoạn đầu. Lập kế hoạch và thiết kế công việc ngay từ đầu của một dự án có vẻ như lãng phí thời gian khi bạn muốn tham gia vào chương trình khó tính, nhưng chúng có thể tiết kiệm một lượng lớn thời gian sau này.

Mọi người sẽ nói về các phương pháp cụ thể như TDD hoặc BDD. Điều này thật tuyệt, nhưng nếu bạn không thực hiện chúng bây giờ, chúng sẽ khiến bạn mất một chút thời gian để điều chỉnh, vì vậy chúng có thể không phải là thứ bạn muốn bắt đầu cho một cuộc thi lập trình. Nhưng dừng lại để lên kế hoạch cho những gì bạn đang làm trước khi bạn lao vào và thực hiện nó sẽ gặt hái được phần thưởng cho dù thế nào đi chăng nữa. Và dù sao họ cũng là những bước đầu tiên hướng tới TDD và BDD. Đây là nơi bạn muốn bắt đầu.


-2

Nếu đó là một cuộc thi lập trình thực tế, đừng sử dụng C ++. Sử dụng ngôn ngữ kịch bản RAD nhanh, tương tác. Đây là một cái gì đó VB6 hoàn toàn thống trị tại. Đi trước với các thư viện bạn viết sẵn. Chia tách chuỗi, đảo ngược mảng, tìm kiếm, sắp xếp, đồ họa thô sơ, điều khiển bảng điều khiển.

Nếu đó là cho công việc, làm chính xác ngược lại. Tìm hiểu những gì ở đó, sử dụng một ngôn ngữ vững chắc (C ++ là tốt), nhận xét mọi thứ, v.v. Hai loại môi trường không thể xa nhau hơn.


3
Tôi không phải là một trong những người downvoters, nhưng tôi cho rằng họ có thể -1 bạn vì câu hỏi là về lập trình nhanh hơn trong C ++ .
Gordon Gustafson

9
VB6? Nghiêm túc? Bạn đến từ quá khứ?
Konamiman

2
@Konamiman: heh, đúng rồi Tôi không thể biết anh ấy có nghĩa là "Tôi đang chuẩn bị, trong C ++, cho một cuộc thi lập trình" hay "Tôi đang chuẩn bị cho một cuộc thi lập trình C ++". Oh tốt, chip nằm ở nơi họ có thể. Tuy nhiên, không có gì vượt qua môi trường RAD rất nhanh cho các cuộc thi lập trình, trong đó mỗi giây đều có nghĩa đen.
Bryan Boettcher

Tôi chỉnh sửa câu hỏi để làm rõ.
marktani

Trên RAD: Delphi 6 sẽ là cược tốt nhất sau đó, có thể.
mlvljr
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.