Tôi không phải là một lập trình viên giỏi (về logic), tôi nên sửa nó như thế nào? [đóng cửa]


50

Ok, đây là vấn đề của tôi:

Tôi làm việc cho một công ty lớn, một số cách hạ cánh một công việc (thẳng thắn vì cuộc phỏng vấn rất dễ dàng). Không phải là tôi không biết công cụ của mình, tôi khá giỏi trong việc hiểu java, đó là các thư viện, v.v.

Nhưng, khi tôi cố gắng giải quyết một số vấn đề logic, tôi thấy thật khó để đưa ra giải pháp.

Ví dụ, conversion of decimal to romankhi tôi thấy giải pháp, tôi thấy đó là một vấn đề đơn giản. Nhưng tôi đã không thể thực hiện nó sau 1-2 giờ thử!

Tôi cảm thấy mình thật ngu ngốc và không đáng để trở thành một kỹ sư phần mềm. Khả năng giải câu đố nên đến với một lập trình viên tuyệt vời. Nhưng khi tôi cố gắng giải một số câu đố, tôi không thể tìm ra giải pháp và tôi chỉ cần google nó lên! .... và tôi ghét điều đó!

Khi gặp một vấn đề (như triển khai tính năng xyz) tại nơi làm việc, tôi khá nhanh nhạy với nó và tôn trọng nơi làm việc của tôi vì điều đó, nhưng tôi không tự hào về điều đó. Bởi vì khi tôi cố gắng giải quyết bất kỳ vấn đề thách thức khôn ngoan nào về mặt toán học hay logic, tôi đã dò dẫm. Tôi vẫn cảm thấy yêu những gì tôi đang làm (với tư cách là một kỹ sư) nhưng cảm thấy thực sự buồn khi tôi không thể giải quyết một số vấn đề logic khó khăn mà bạn bè tôi gặp phải.

Tôi cảm thấy mất tinh thần :(

TL; DR: Tôi hiểu công cụ từ quan điểm thực tế (triển khai các tính năng trong sản phẩm của chúng tôi) nhưng khi cố gắng giải quyết vấn đề từ ProjectEuler, tôi đã nói xấu! Và tôi cần phải làm sắc nét bộ não của tôi!

Vì vậy, câu hỏi của tôi là:

  1. Làm thế nào tôi nên đi sửa nó? Tôi có nên bắt đầu với việc giải quyết (và buộc bản thân mình) các vấn đề về trình độ dự án không? Ngay cả khi phải mất hàng giờ để tôi giải quyết một số vấn đề cơ bản ?
  2. Hay tôi nên quay lại những điều cơ bản và học một số môn toán cơ bản?
  3. Tôi không thực sự tìm thấy niềm vui giải câu đố. Nhưng tôi muốn làm cho nó vui cho chính mình! Và tôi nghĩ nếu tôi hiểu họ theo cách tốt hơn, tôi sẽ thích nó!

Tái bút: Tôi chưa bao giờ được học về CS (sinh viên chưa tốt nghiệp của tôi). Nhưng đó không phải là một cái cớ để trở thành một nhà phát triển sucky.

Cảm ơn!


3
Nếu nó không vui giải câu đố cho bạn thì tại sao phải bận tâm!
V4Vendetta

3
Nó không vui vì tôi có thời gian khó khăn để giải quyết nó. Nếu tôi giỏi về nó, tôi chắc chắn tôi sẽ thích nó!
Giăng

1
Bạn luôn có thể thử này (cảnh báo, nghiêm túc gây nghiện nếu bạn đang vào giải quyết câu đố)
Benjol

2
Không đến tự nhiên. Ngay cả những kỹ năng cơ bản nhất cũng cần học hỏi. Tôi muốn đề xuất tính toán và cơ học cổ điển như sân chơi để đào tạo các khả năng cần thiết, nhưng nhiều môn học khác (bao gồm hoàn toàn phi toán học) có thể làm như vậy.
SK-logic

3
@John Khẳng định. Đó là một vấn đề khó khăn. Bạn không nên cảm thấy tồi tệ nếu bạn không thể giải quyết nó trong 5 phút. Một tiếng rưỡi để làm điều đó, sau khi đọc Wiki về các chữ số La Mã và chỉ bằng cách so sánh kết quả của nó với kết quả của việc thực hiện khác, tôi đã có thể sửa một lỗi. Tôi (giống như nhiều người khác) nghĩ rằng IL là một con số hợp lệ. Sai lầm. XXXIX là số đúng. Thêm vào đó, tôi đã phải xem các triển khai khác để tối ưu hóa nó (Tôi đã lưu trước bộ đệm II, III, XX, XXX, nhưng nó vô dụng). Đừng cảm thấy tồi tệ!
xanatos

Câu trả lời:


24

Đầu tiên, thật tuyệt vời khi bạn thấy đây là một điểm yếu trong kỹ năng của mình. Bạn thực sự biết nơi bạn cần cải thiện, điều này giúp cho việc đó dễ dàng hơn rất nhiều và cho thấy rằng bạn giỏi hơn bạn nghĩ.

Tôi tin rằng vấn đề chính của bạn, điều mà tôi đã thấy nhiều lần trước đây, là bạn không có "bộ công cụ giải quyết vấn đề". Khi gặp vấn đề, bạn sẽ làm gì? Làm thế nào để bạn đi về giải quyết nó? Tôi chậm môn toán, nhưng vì tôi biết cách sử dụng các công cụ toán học nhỏ cùng nhau, tôi đã học được phép tính.

Vì vậy, bên cạnh việc chỉ giải quyết vấn đề, bạn cần xem xét những công cụ và kỹ năng nào bạn mang đến khi bạn làm như vậy. Nếu bạn đang làm việc trên một tính năng mới tại nơi làm việc, bạn có ngồi xuống không có IDE, không có trình gỡ lỗi, không có tài liệu, không có internet và không có mã nguồn? Dĩ nhiên là không!

Có những công cụ để giải quyết vấn đề, bạn chỉ không biết chúng .... chưa . Bài viết trên wikipedia có một số liên kết đến các kỹ thuật giải quyết vấn đề. Nhưng công cụ quan trọng nhất là phương pháp khoa học . Bài viết trên wikipedia bao gồm một cách tiếp cận thực tế:

  1. Xác định một câu hỏi
  2. Thu thập thông tin và tài nguyên (quan sát)
  3. Hình thành một giả thuyết giải thích
  4. Kiểm tra giả thuyết bằng cách thực hiện một thí nghiệm và thu thập dữ liệu theo cách có thể lặp lại
  5. Phân tích dữ liệu
  6. Giải thích dữ liệu và rút ra kết luận đóng vai trò là điểm khởi đầu cho giả thuyết mới
  7. Công bố kết quả
  8. Thi lại (thường được thực hiện bởi các nhà khoa học khác)

Tất cả các vấn đề có thể được giải quyết theo cách này! Nhiều người không trải qua các bước này mặc dù. Nó giống như một nhà phát triển từ chối kiểm tra mã của mình. Ở tất cả. Anh ta sẽ có vấn đề để tìm ra lỗi thậm chí tồn tại.

Cuối cùng, công cụ chính khác để giải quyết vấn đề là chia nhỏ nó bằng các bước đơn giản . Ví dụ: vấn đề đầu tiên trong các ví dụ của Euler của dự án :

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

Chúng tôi có hai sự thật, và một vấn đề ở đây. Fact one chỉ cho chúng ta cách xác định bội số của ba hoặc năm dưới 10. 3 * 1,3 * 2,3 * 3,5 * 1 đều hợp lệ. 5 * 2 không phải vì nó bằng 10. Sau đó, thực tế hai cho chúng ta biết rằng chúng ta cộng chúng lại với nhau để có được 23.

Vì vậy, chúng tôi đã có một phương pháp tìm giá trị và chúng tôi có thể cộng chúng lại với nhau để lấy tổng của chúng tôi. Tất nhiên, chúng ta có thể nhìn vào thực tế và áp dụng một đảo ngược đơn giản của thứ tự. 3, 5, 6 và 9 là bội số của 3 hoặc 5. Đó là 3% 3, 5% 5, 6% 3, 9% 3 đều cho một mod bằng không. Vì vậy, một cách tiếp cận khác sẽ là chuyển qua 999 đến 1 và mô đun mỗi số với 3 và 5. Thu thập danh sách các giá trị và cộng chúng lại với nhau.

Tôi muốn đề xuất Nghệ thuật lập trình unix là một ví dụ tuyệt vời về việc sử dụng các công cụ nhỏ trong thế giới lập trình. Xâu chuỗi chúng lại với nhau cho phép bạn giải quyết các vấn đề rất phức tạp và tôi không thể đếm số lần các khái niệm này đã giúp tôi.


19

Nhiều lập trình viên cũng là "người giải câu đố" tự nhiên, nhưng có rất nhiều thứ để lập trình hơn thế. Nếu tất cả các lập trình viên tập trung vào giải quyết các vấn đề thuật toán thú vị, chúng tôi sẽ có rất nhiều phần mềm có thể giải quyết các vấn đề thú vị, nhưng không ai trong số họ có thể sử dụng hoặc bảo trì được.

Tôi thấy rằng có khá ít thử thách kiểu "giải câu đố" trong công việc của tôi. Hầu hết các thách thức là về nghiên cứu mã cũ, học API mới, thiết kế kiến ​​trúc của một số thành phần theo cách mà mọi người sẽ không thề với nó trong ba năm. Tất cả điều này là thách thức, nhưng không quá nhiều loại câu đố logic. Mặt khác, tôi có những đồng nghiệp dành phần lớn thời gian suy nghĩ về các thuật toán tối ưu hóa trình biên dịch, và những người rất giỏi về điều đó.

Tôi nghĩ điều quan trọng là các lập trình viên phải liên tục nghĩ về "làm thế nào tôi có thể làm tốt hơn những gì tôi làm?", Nhưng để trở thành một lập trình viên giỏi không nhất thiết đòi hỏi bạn phải giỏi giải câu đố.

Cá nhân, tôi nhận được giải pháp giải câu đố của mình bằng cách giải quyết "geocaches bí ẩn" .


Nhưng rất nhiều người khởi nghiệp nóng CHỈ căng thẳng về kỹ năng giải câu đố. Lấy facebook. Nếu tôi không giỏi giải câu đố, tôi thậm chí không đủ điều kiện để nộp đơn vào đó!
Giăng

6
Facebook có robot câu đố như một kiểm tra đầu tiên chỉ để tránh phải lọc qua hàng ngàn và hàng ngàn CV. Nếu bạn thực sự muốn làm việc cho FB, thì bạn cần có khả năng giải quyết những vấn đề đó, nhưng có rất nhiều nơi tốt để làm việc.
JesperE

câu trả lời tuyệt vời. cũng giúp tôi thoải mái ... =]
Hartley Brody

9

Hãy để tôi cảnh báo bạn, bạn càng biết nhiều, bạn càng nhận ra bạn biết ít như thế nào.

Đừng nản lòng vì điều đó. Tiếp tục học hỏi và cố gắng làm việc trên các lĩnh vực bạn nhận ra là thiếu.

Bây giờ đến câu hỏi của bạn. Đề nghị của tôi sẽ là bắt đầu làm việc với các vấn đề trên dự án eule r.

Lý do của tôi cho điều này là đơn giản, bắt đầu từ câu hỏi phổ biến nhất, đây thường là những vấn đề dễ giải quyết hơn.

Khi bạn phải đối mặt với một vấn đề, hãy thử và giải quyết nó, tự mình giải quyết nó, thử các cách tiếp cận khác nhau. Cách thức hoạt động của dự án euler cho phép bạn kiểm tra và kiểm tra câu trả lời của mình.

Nếu bạn quyết định rằng bạn không thể giải quyết vấn đề này, hãy bắt đầu nghiên cứu vấn đề (không tìm câu trả lời). Không thử lại.

Khi bạn giải quyết vấn đề, dự án euler có một phần nơi họ chỉ cho bạn câu trả lời tốt nhất cho mỗi lần thực hiện ngôn ngữ. Đi qua câu trả lời của họ bằng ngôn ngữ ưa thích của bạn, hiểu giải pháp của họ và suy nghĩ đã đi vào đó.

Bây giờ hãy đóng câu trả lời họ cung cấp và tự mình thử lại cho đến khi bạn giải quyết lại.

Nếu bạn thực hành đủ, logic và suy nghĩ để giải quyết những vấn đề này sẽ ngày càng dễ dàng hơn với bạn.


4

Hầu hết các công việc lập trình không đòi hỏi nhiều logic. Nhưng đây có thể không phải là công việc bạn thích.

Là một hướng dẫn chung, cố gắng học các thuật toán và cấu trúc. Tôi có thể tư vấn cho Hướng dẫn thiết kế thuật toán của Skiena. Một khi bạn biết những điều này bạn sẽ bắt đầu phân loại vấn đề. Điều này trông rất giống vấn đề nhân viên bán hàng du lịch, ở đây tôi có thể sử dụng một cây, ở đây tôi có thể sử dụng tìm kiếm nhị phân ...

Project Euler có một loạt các câu đố. Rất nhiều trong số này có thể dễ dàng thực hiện được với một kiến ​​thức toán học cơ bản. Những người khác dễ dàng giải quyết hơn khi bạn biết một vài thuật toán.


2

Tôi rất tin rằng bạn mới bắt đầu với hành trình lập trình của mình, vì vậy điều đầu tiên nếu bạn mất một chút thời gian để nắm bắt và làm cho đúng thì dường như đó không phải là vấn đề. Sự khác biệt duy nhất mà nó tạo ra là với mỗi lần thử là bạn học được thứ gì đó như WoW! ! điều cuối cùng tôi đã làm không có ý nghĩa gì cả vì tôi cần số thập phân và không gấp đôi

Nếu việc giải câu đố không khiến bạn quan tâm thì bạn đừng đi tìm vấn đề đó, có những vấn đề logic khác xuất hiện khi bạn biết cơ sở mã của mình, bạn có thể chọn làm việc với chúng và đưa ra bất kỳ chỉnh sửa được đề xuất nào cho người cố vấn hoặc lãnh đạo của bạn . (đừng lo lắng nếu bạn thực hiện một số sai lầm, họ sẽ giúp bạn biết lý do tại sao phương pháp của bạn bị lỗi, vì vậy hãy là người quan sát sắc sảo và người lắng nghe thích hợp)

Sẽ mất một thời gian để bạn ổn định và sau đó có thể bạn sẽ tiếp tục bắn vào tất cả các xi-lanh. Không cần phải nói tránh sự thôi thúc tìm kiếm giải pháp trên google hoặc SO, hãy nỗ lực từ phía bạn và chỉ kích hoạt trình duyệt của bạn khi bạn nghi ngờ hoặc hoàn toàn không biết gì


1

Tất cả, biết điểm yếu của bạn là một thế mạnh thực sự, do đó bạn biết phải học gì để có một trò chơi tốt hơn.

Lời khuyên của tôi sẽ là, đọc rất nhiều mã giải quyết các vấn đề logic. Mọi người đều có phong cách riêng trong việc giải các câu đố, đọc mã có thể gợi ý cho bạn về cách bạn có thể học để làm điều này. Ngoài ra, việc có thể hiểu mã cũng có thể chỉ cho bạn lý thuyết toán học mô tả vấn đề, do đó, trên đường đi, bạn cũng sẽ tìm hiểu về các vấn đề tiềm ẩn.

Chúc mừng, Carlo


1

Tôi cảm thấy tôi nên thêm vào điều này.

Như câu trả lời đã chọn đã nêu, biết điểm yếu của bạn là một lợi thế rất lớn và có một số công cụ cơ bản để học các kỹ thuật giải quyết vấn đề. Tuy nhiên, điều tôi nghĩ là thiếu câu trả lời, chỉ đơn giản là tìm cách thực hành những vấn đề khó khăn - rất nhiều. Hãy ngoan cố về việc hoàn thành đầy đủ mọi vấn đề bạn cố gắng. Đọc mã, rất nhiều mã, là tốt, cũng như đọc sách về chủ đề giải quyết vấn đề, nhưng viết mã gần như quan trọng hơn.

Theo một số cách, chúng tôi chia sẻ cùng một điểm yếu (mặc dù, nó không tệ như bạn nghĩ). Để rèn luyện kỹ năng giải quyết vấn đề của mình, tôi luôn làm việc với một số vấn đề về Euler hoặc HackerRank của dự án. Nếu đó là một vấn đề dễ dàng, tôi chọn 7 ngôn ngữ lập trình và cố gắng giải quyết nó trong tất cả các ngôn ngữ. Đối với các vấn đề khó hơn, tôi có thể chọn 3 ngôn ngữ rất khác nhau, chỉ để giữ thời gian cho vấn đề hợp lý. Đối với tất cả các vấn đề, một khi tôi đưa ra giải pháp, tôi tìm kiếm các giải pháp mà người khác đã đưa ra và đảm bảo tôi hiểu chúng. Nếu bạn không hiểu một số giải pháp, bạn luôn có thể đăng lên StackOverflow hoặc thậm chí ở đây để Lập trình viên Stack Exchange hoặc một cái gì đó và tôi chắc chắn có ai đó trên trang web có thể trả lời câu hỏi của bạn (hiếm khi không có).

Về cơ bản, mặc dù, hãy chắc chắn rằng bạn đang thực hành, và không chỉ đọc, và thực hành rất nhiều. Cũng giống như thể thao, suy nghĩ rõ ràng cần có thời gian và nỗ lực.

Một điều khác bạn có thể làm để giúp hỗ trợ cách bạn nghĩ về các vấn đề là viết bộ kiểm tra cho các vấn đề bạn giải quyết trước. Bạn không thể viết một bài kiểm tra tốt cho một vấn đề mà không hiểu đầy đủ về nó. Nếu bạn làm điều này cho các ngôn ngữ khác nhau, điều này có lợi thế là dạy cho bạn các kỹ thuật kiểm tra khác nhau cùng một lúc.

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.