Học lập trình ngược, hoặc vì vậy tôi đã trượt bài kiểm tra FizzBuzz. Bây giờ thì sao?


94

Một nền tảng nhỏ

Hôm nay tôi 28 tuổi và tôi chưa bao giờ được đào tạo chính thức về phát triển phần mềm, nhưng tôi có hai bằng cấp giáo dục đại học tương đương với Cử nhân Quan hệ công chúng và MBA điều hành tập trung vào Quản lý dự án. Tôi đã làm việc trên các lĩnh vực đó khoảng 6 năm sau đó, 2,5 năm trước tôi đã nghỉ việc / mất việc và quyết định chuyển hướng.

Sau một tháng suy nghĩ mọi thứ thông qua tôi quyết định bắt đầu tự do phát triển các trang web nhỏ trong WordPress. Tôi tự học theo cách của mình và hôm nay tôi có thể nói rằng tôi điều hành một sự nghiệp khiêm tốn nhưng thành công trong việc phát triển các chủ đề và plugin từ đầu cho khách hàng của mình - chủ yếu là các cơ quan thuê ngoài một số công việc phát triển của họ cho các trang web vừa / lớn.

Nhưng đôi khi tôi chỉ cảm thấy rằng việc không học đủ toán, hoặc không có hiểu biết chính thức về những điều thực sự cản trở tôi khi tôi phải cạnh tranh hoặc làm việc với các nhà phát triển có kinh nghiệm hơn. Tôi liên tục tìm cách để tìm hiểu thêm nhưng dường như tôi thiếu những điều cơ bản.

Thật không may, dành 4 năm nữa cho Khoa học Máy tính không phải là một lựa chọn ngay bây giờ, vì vậy tôi đang cố gắng học tất cả những gì có thể từ sách và tài nguyên trực tuyến. Phương pháp này sẽ không bao giờ khiến NASA thuê tôi nhưng tôi thực sự không quan tâm ngay bây giờ. Mục tiêu của tôi là đầu tiên vượt qua thanh và có thể tự gọi mình là một lập trình viên thực thụ.

Tôi hiện đang dành thời gian rảnh rỗi để học Java cho các lập trình viên (để nắm giữ ngôn ngữ mà mọi người nói là khó khăn / đòi hỏi), đọc các trích đoạn về Code Complete (để nắm bắt các thực tiễn tốt nhất) và cả Code: Ngôn ngữ ẩn của máy tính Phần cứng và phần mềm (để nắm bắt hoạt động bên trong của máy tính).

TL; DR

Vì vậy, tình huống hiện tại của tôi là: về cơ bản tôi có khả năng viết bất kỳ hệ thống hoàn chỉnh nào trong PHP (với sự trợ giúp của Google và một vài cuốn sách), tích hợp Ajax, SQL và không có gì, và có thể chậm hơn một chút so với một nhà phát triển có kinh nghiệm mong đợi do tất cả các nghiên cứu liên quan.

Nhưng tôi đã bị mắc kẹt ngày hôm qua khi cố gắng tìm ra (không phải Google) một giải pháp cho thử nghiệm FizzBuzz vì tôi không có toán tử mô đun if($n1 % $n2 == 0) phương thức ghi nhớ.

Bạn muốn đề xuất một cách tốt để giải quyết vấn đề nan giải này là gì? Những môn học / cuốn sách nào tôi nên học sẽ giúp tôi giải quyết vấn đề nhanh hơn và có thể "theo cách lập trình viên" hơn?

EDIT - Có vẻ như có một số nhầm lẫn về những gì tôi không biết để giải quyết FizzBuzz.

Có lẽ tôi đã không thể hiện đúng: Tôi biết các bước cần thiết để giải quyết vấn đề. Những gì tôi đã không ghi nhớ là toán tử mô-đun. Vấn đề là trong việc chuyển đổi toán học cơ bản sang chương trình, không phải là biết toán học cơ bản.

Tôi đã làm bài kiểm tra cho vui, sau khi đọc về nó trên Coding H khiếp sợ . Tôi chỉ quyết định đó là một đường so sánh cơ sở tốt giữa tôi và các nhà phát triển được đào tạo chính thức.

Tôi chỉ sử dụng điều này như một ví dụ về cách không xử lý toán học trong môi trường máy tính trước đây khiến tôi mất thời gian tìm kiếm những điều cơ bản như toán tử mô đun để có thể giải quyết các vấn đề đơn giản.


63
Khi tôi đọc điều này: I'm basically capable of writing any complete system in PHP (with the help of Google and a few books)và kết hợp điều này với bạn không biết if($n1 % $n2 == 0), tôi tự hỏi về sự tiếp xúc mà bạn đã có với những thứ được viết bằng PHP. Tôi nghĩ rằng hầu hết mọi thứ bạn làm đều vượt ra ngoài một phép tính modulo đơn giản. Bạn có thể cung cấp một số cái nhìn sâu sắc hơn về những gì bạn nghĩ rằng bạn có thể làm?
phant0m

10
Tôi cũng là một lập trình viên tự học .. đã ở đó hơn 10 năm rồi, tất cả các trang web, mọi lúc .. hồi đó không có lớp phát triển web nào cả ... tôi nghĩ có một số lợi ích khi tự học. bạn thực sự sẽ muốn tìm hiểu về các nguyên tắc và mẫu thiết kế OO cơ bản. họ sẽ giúp bạn giải quyết vấn đề sau khi tấn công các vấn đề .. Tôi thường thấy rằng tôi không phải lúc nào cũng có vocab mà người khác có, nhưng nếu bạn thích viết mã, và thích viết các giải pháp tao nhã, thì cuối cùng bạn sẽ có thể viết mã theo cách của bạn vào bất cứ điều gì bạn muốn
hanzolo

56
Liên quan đến stuck b/c I didn't memorize %vấn đề, đáng lưu ý rằng có nhiều cách khác để làm điều này: (giả sử $ n2! = 0) if (is_int ($n1 / $n2))hoặc if (($n1 / $n2) == (int) ($n1 / $n2))Biết từ khóa là một điều, và biết cách diễn đạt các ý tưởng cơ bản khi không có giải pháp tích hợp là khác.
Grossvogel

18
@grossvogel Chính xác! Một trong những lý do khiến mọi người thích Fizzbuzz là có rất nhiều cách để giải quyết nó. Đây không chỉ là một mẹo để xem bạn có biết toán tử mô đun không. Một kỹ năng lập trình chính là khả năng dịch một vấn đề từ dạng mà nó được nêu thành dạng phù hợp nhất với kiến ​​thức / công cụ / tài nguyên / v.v. của bạn
octern

18
Không biết toán tử mô đun không phải là lý do để thất bại FizzBuzz. Khi bạn tìm thấy một cái gì đó thiếu bạn phải có khả năng làm việc xung quanh nó.
Loren Pechtel

Câu trả lời:


144

Trong trường hợp của bạn, vì bạn tự học và đã có những gì dường như là một cách tiếp cận tốt, lành mạnh và không có BS để học. Vẫn còn một số gợi ý ...

Tập luyện giúp hoàn hảo hơn

Tôi nghĩ bạn nên đi sâu vào các bài tập progamming, như:

Thậm chí lấy các câu hỏi thi trong quá khứ của các trường đại học nổi tiếng xung quanh bạn, hoặc của các cuộc thi lập trình địa phương (hoặc từ xa). Ví dụ, chúng tôi có một câu hỏi hay ở Pháp dành cho các lập trình viên trung học khao khát được gọi là Prologin , và nó cung cấp cho mỗi năm một loạt câu đố hay. ).

Để biết thêm: Tôi có thể tìm câu đố và thách thức lập trình ở đâu?

Sách cổ điển và tài liệu tham khảo

Chúng tôi cũng có thể đề xuất một danh sách rất dài những cuốn sách tuyệt vời , nhưng tôi muốn nói câu trả lời của Zen là không có cách nào đúng để giác ngộ.

Thật khó để nói cho bạn biết cái nào đứng đầu danh sách. Vì vậy, hãy tiếp tục đọc một tấn công cụ để tìm hiểu những cạm bẫy chung để tránh và thực hành tốt nhất để làm theo, như bạn đang làm chính xác bây giờ.

Để biết thêm:

Đẩy các giới hạn

Ngoài ra, tìm kiếm vật liệu gây trầy xước, như:

Không nhất thiết phải được lấy làm ví dụ về những việc cần làm hiện nay, nhưng đáng để cố gắng tìm hiểu xem cái quái gì đang xảy ra trong đó.

Hệ thống ngang hàng là động lực

Bạn cũng có thể muốn ẩn nấp (và tham gia vào) các cộng đồng sau để cải thiện kỹ năng của mình dần dần bằng cách đối đầu với những người khác.

Giáo dục bán thời gian

Nếu bạn không có thời gian hoặc động lực để tham gia vào một khóa học 4 năm khác hoặc một cái gì đó tương tự (thậm chí có thể không cần thiết hoặc bổ ích, và đắt tiền), bạn có thể xem xét tìm kiếm tài liệu giảng dạy trực tuyến. Tất nhiên, những điều này không giới hạn trong khoa học máy tính.

Nhờ vào nỗ lực ban đầu của MIT OpenC thuyếtWare , hiện có hàng tấn trường đại học phù hợp và bạn có thể tìm thấy rất nhiều tài liệu khóa học cấp đại học miễn phí. Không phải lúc nào bạn cũng dễ dàng điều hướng và đọc qua nó, nhưng một số được thực hiện khá tốt. Để bắt đầu từ mặt đất lên và đi lên khá cao, hãy xem xét cũng nhìn vào Học viện Khan .

Một số người đi xa hơn một chút và cung cấp các khóa học trực tuyến thực sự miễn phí, nơi bạn có quyền truy cập tương tự vào tài liệu của khóa học, nhưng họ cũng cung cấp các bài giảng nhịp độ và tự đánh giá thường xuyên. Ví dụ, hãy truy cập Coursera hoặc Udacity .

Hầu hết những người ở trên thường xuất bản các bài giảng của họ trên Youtube hoặc iTunesU, vì vậy bạn sẽ tìm thấy nhiều tài liệu nếu khao khát kiến ​​thức của bạn chưa được giải tỏa bởi tất cả các liên kết trước đó.

Nếu bạn muốn một cái gì đó cung cấp trải nghiệm gần gũi hơn với trường đại học "thực sự", bạn có thể xem xét các trường đại học từ xa, cũng cho phép bạn làm việc bán thời gian, nhưng yêu cầu bạn phải theo kịp tiến độ, và phải tự đánh giá và kết thúc kỳ thi năm (đôi khi tại chỗ), như với OpenUniversity và các biến thể quốc tế của nó.

Đam mê giúp bạn tiếp tục

  • Tìm một dự án thú cưng: tạo của riêng bạn hoặc tham gia một hoặc nhiều dự án phần mềm hiện có và đóng góp.
  • Mã, mã, mã. Và sau đó mã thêm một số.

(và nhận đủ nhãn cầu nhìn vào mã của bạn để chỉ trích bạn và đưa ra những quan điểm khác nhau)

Người Pháp nói:

C'est en tha thứ que que cho tôi.

Tiếp tục làm những gì bạn đang làm, và cuối cùng bạn sẽ là một chuyên gia. Mất thời gian và công việc.

Xem thêm Tôi đang gặp khó khăn trong việc học hỏi để có thêm gợi ý.


Tái bút: Mặc dù đây là một công cụ gây tranh cãi rất nhiều cho các cuộc phỏng vấn và không giúp xác định các ứng cử viên tốt, nhưng tôi thường sử dụng FizzBuzz để ít nhất loại bỏ những "người xấu" vô cùng. Vì vậy, có được crankin 'về điều thực hành này! :)


3
C'est siêu ça! :) Cảm ơn vì danh sách. Dự án Euler và các câu đố có vẻ rất tốt đẹp. Và tôi đã sử dụng một số trang SE khác. Sẽ lao vào nó.
moraleida

@moraleida: Vui mừng bạn thích câu trả lời. Không có gì.
haylem

Về PS của bạn: Tôi không thực sự lo lắng về các cuộc phỏng vấn ngay bây giờ, vì tôi thực sự không muốn trở lại làm nhân viên. Tôi đã làm bài kiểm tra cho vui, sau khi đọc về nó trên Coding H khiếp sợ. Tôi chỉ quyết định đó là một đường so sánh cơ sở tốt giữa tôi và các nhà phát triển được đào tạo chính thức. :)
moraleida

4
+1 chỉ vì lý do tại sao FizzBuzz được sử dụng ngay khi kết thúc ... Tôi thường thấy các bình luận ở đây hoặc trên blog về những người chỉ trích nó vì họ cho rằng các công ty đang sử dụng nó để xác định siêu mã hóa. (Đối với các công ty đó: Bạn đang làm sai!)
Izkata

1
Điều này được liệt kê trên một số liên kết, nhưng tôi cảm thấy nó đảm bảo một cuộc gọi ra: tôi cũng sẽ tìm kiếm xung quanh rosettacode.org . Nó có một số lượng lớn các vấn đề khác nhau được giải quyết trong một số lượng lớn ngôn ngữ lập trình. Đó là cách thực hành tốt trong việc đọc mã, cũng quan trọng như viết nó, cũng như một cách tuyệt vời để xem nhiều cách tiếp cận khác nhau để giải quyết cùng một vấn đề. Và nếu bạn tìm thấy một vấn đề chưa được giải quyết bằng ngôn ngữ bạn biết hoặc muốn học, thì đó là một thách thức lập trình cho bạn ngay tại đó.
Mark Reed

60
I didn't have the if($n1 % $n2 == 0) method memorized.

Tôi đã không viết mã được lâu (bắt đầu tự dạy SQL khoảng 27 tháng trước và bắt đầu viết mã ở Perl khoảng 20 tháng trước), nhưng câu trích dẫn ở trên nghe có vẻ như một số điều mà tôi đã nghe từ các sinh viên cũ:

Làm thế nào tôi có thể ghi nhớ kỹ thuật tích hợp nào để sử dụng cho mọi vấn đề?

Tôi đã không ghi nhớ liệu tôi nên thêm hoặc nhân xác suất, hoặc sử dụng "n chọn k" hoặc sử dụng giai thừa.

Đợi tí! Bạn nói rằng x bằng 2 ngày hôm qua! Bây giờ nó bằng không?!

Được rồi, cái cuối cùng có lẽ hơi khó khăn ... nhưng điểm tôi đang cố gắng thực hiện là giải quyết vấn đề không phải là ghi nhớ . Nếu đúng như vậy, thì một số thiên tài có thể lập trình một máy tính để giải quyết mọi vấn đề, và không ai trong chúng ta sẽ phải suy nghĩ lại (thật là một thế giới địa ngục sẽ ...).

Bây giờ, đúng là bất kỳ nỗ lực trí tuệ nào bao gồm ít nhất một chút ghi nhớ. Cụ thể, nếu bạn định viết mã bằng PHP, thì bạn nên hiểu các kiểu dữ liệu cơ bản (số, chuỗi, mảng), những điều cơ bản mà bạn có thể làm với chúng (đối với các số: cộng, trừ, nhân, chia và mô-đun; cho các chuỗi: nối, ghép, thay thế và ít nhất là một số kiến ​​thức về biểu thức chính quy, cho các mảng: nối, xử lý các phần tử, tách các phần tử, lặp, đếm các phần tử, v.v. (câu lệnh if / then / other, vòng lặp foreach, vòng lặp, v.v.).

Sau đó, khi bạn gặp sự cố, hãy sử dụng sự cố để cung cấp ngữ cảnh cho những công cụ bạn cần. Đối với FizzBuzz, bạn cần biết khi nào một số chia hết cho 3, 5 hoặc 15. Được rồi, vậy chúng ta đang xử lý các số .... công cụ cơ bản nào cho phép chúng ta biết khi một số nguyên chia hết cho một số khác? Vâng, các nhà điều hành mô-đun. Vì vậy, sử dụng đó. (Tất nhiên, nếu số của bạn là $n, bạn có thể thích và xem chữ số cuối cùng $nlà 0 hoặc 5, và / hoặc nếu các chữ số $ncộng với một số chia hết cho 3, nhưng tôi lạc đề ...) Bạn cần phải làm điều này cho mỗi số từ 1 đến 100, vì vậy để tránh bị hầm đường hầm, hãy sử dụng một foreachvòng lặp.

Tinh thần của câu chuyện là nếu một mặt bạn nói "về cơ bản tôi có khả năng viết bất kỳ hệ thống hoàn chỉnh nào trong PHP" và mặt khác bạn không thể mã hóa FizzBuzz, thì khẳng định đầu tiên là không chính xác. Một số sinh viên tính toán trước đây của tôi đã thề lên xuống rằng họ hiểu các khái niệm, nhưng họ không thể làm các vấn đề trong bài kiểm tra ... hoặc các vấn đề bài tập về nhà ... hoặc các vấn đề bài kiểm tra. Họ đã sai về sự hiểu biết của họ là tốt.

Dừng việc bào chữa và tìm hiểu những điều cơ bản.


6
Tôi không ghi nhớ, tôi chuyển hóa và biến những điều này thành một phần của trực giác của tôi. Luôn tìm cách mở rộng điều đó.
ncmathsadist

@ncmathsadist - Vâng, mở rộng trực giác là chìa khóa, nhưng ngay cả trực giác cũng phải dựa vào việc ghi nhớ một số lượng nhỏ các khái niệm và sự kiện rất cơ bản.

đối với bản ghi, bạn không cần phải nhân một số với 3 và sau đó thêm các chữ số để xem nó có chia hết cho 3 không, bạn chỉ cần thêm các số đó. ví dụ: 864, 8 + 6 + 4 = 18 chia hết cho 3 và 864
Oztaco

@ lá68 - Duh! [tát trán] bạn hoàn toàn chính xác ... hãy chỉnh sửa!

27

Bạn có thể nghĩ FizzBuzz là một vấn đề đồ chơi; khi nào tôi sẽ cần sử dụng toán tử mô đun trong một chương trình thực. Nhưng thực sự bạn sử dụng nó mọi lúc. Ba ví dụ phổ biến:

  1. Bạn đang hiển thị một bảng và bạn muốn xen kẽ các màu nền cho các hàng khác nhau. Bạn kiểm tra xem một hàng chẵn ( row_number % 2 == 0) và hiển thị một màu cho các hàng chẵn và một cho các hàng lẻ.
  2. Bạn có một bộ sưu tập các đối tượng mà bạn đang lặp qua và bạn muốn in ra một bảng có N đối tượng trên mỗi hàng; thì tiêu chí khi nào cần thêm ngắt dòng là (item_number% N == 0). Tôi thực sự đã có một câu hỏi SO về hành vi chính xác này mặc dù trong ngôn ngữ tạo khuôn mẫu đó, điều kiện if item_number % N == 0được viết là tương đương ( if item_number|divisbleby: N).
  3. Bạn đang thực hiện một số thao tác mà bạn muốn nhóm thành một giao dịch chỉ được cam kết khi nhóm đạt đến một kích thước nhất định vì lý do hiệu quả. Có thể bạn đang sử dụng API dữ liệu google và bạn không muốn chi phí xác thực / tiêu đề HTTP để tạo một giao dịch mới cho mỗi hoạt động, vì vậy bạn đang gộp chúng lại thành các nhóm gồm 50 hoạt động. Hoặc bạn đang lưu hồ sơ vào cơ sở dữ liệu của mình và muốn thực hiện giao dịch khi có kích thước hợp lý. Một cái gì đó như if cur_item_number % 50 == 0 then commit_data.

Chắc chắn có những cách khác để làm tất cả những điều này. Nhưng bạn có thể thực hiện fizz buzz mà không cần sử dụng toán tử mô đun hoặc so sánh phép chia float với phép chia số nguyên. Ví dụ, đối với FizzBuzz bạn có thể làm một cái gì đó giống như mã giả sau đây.

div_by_3_rem = 0
div_by_5_rem = 0
for(i = 0; i< 50; i++) {
    if(div_by_3_rem == 0 && div_by_5_rem == 0) {
       print "FizzBuzz"
    } elif(div_by_3_rem == 0) {
       print "Fizz"
    } elif(div_by_5_rem == 0) {
       print "Buzz"
    } else {
       print i
    }
    div_by_3_rem += 1
    div_by_5_rem += 1
    if(div_by_3_rem == 3) {
       div_by_3_rem = 0
    }
    if(div_by_5_rem == 5) {
       div_by_5_rem = 0
    }
}

Để kết luận, nếu bạn muốn trở thành một lập trình viên tuyệt vời vào một ngày nào đó, đừng nhảy vào học một cuốn sách ngôn ngữ. Có, một cuốn sách PHP / Java sẽ giúp bạn nhận được câu trả lời từ google / stackoverflow và các chương trình nửa hoạt động nhanh hơn nhiều so với bất kỳ điều gì khác. Nhưng để thực sự có thể biết cách viết các chương trình tối ưu chất lượng và suy nghĩ như một lập trình viên, bạn cần tiếp xúc với một cuốn sách CS thực sự.

Bắt đầu với một cuốn sách CS giới thiệu ngôn ngữ lập trình và nền tảng CS, với ví dụ nổi tiếng về Cấu trúc và diễn giải các chương trình máy tính (sẽ dạy Scheme - một phương ngữ Lisp) hoặc có thể là một thứ khác như Think Python Cách nghĩ như máy tính Nhà khoa học (mà tôi chưa đọc). Cả hai đều miễn phí trực tuyến.

Cuối cùng bạn cần đọc một cuốn sách thuật toán tốt, tốt nhất là Thuật toán của CLRS (không miễn phí), mặc dù cuốn sách thuật toán trực tuyến miễn phí nàycó thể là một sự thay thế chi phí thấp (mặc dù nếu bạn chỉ có thể mua CLRS). Cuốn sách thuật toán sẽ dạy bạn cách suy nghĩ giải quyết các vấn đề máy tính và giới thiệu cho bạn một loạt các cấu trúc dữ liệu (Mảng / Danh sách liên kết / Heaps / Cây nhị phân / Cây B / Cây HashTables) và các thuật toán quan trọng mà bạn cần biết cách sử dụng tối ưu . Bạn không cần phải ghi nhớ mọi bằng chứng hoặc biết cách viết hoàn hảo mọi thuật toán (ai đã từng sử dụng Heap Fibros); nhưng theo trực giác bạn nên biết hai vòng lặp lồng nhau là O (N ^ 2); các loại so sánh tốt nhất là O (N lg N), tìm kiếm nhị phân là O (lg N), có thể tìm thấy trung vị trong O (N), tại sao cơ sở dữ liệu đĩa cứng sử dụng B-Plants, v.v.). Ở mức tối thiểu, kiến ​​thức vững chắc về cuốn sách thuật toán sẽ giúp bạn vượt qua các cuộc phỏng vấn lập trình kỹ thuật của google / facebook. Khi đọc sách lập trình, đừng chỉ đọc lướt / đọc; bạn'

Tôi cũng muốn giới thiệu một cuốn sách về công nghệ phần mềm (Mã hoàn chỉnh hoặc Lập trình viên thực dụng) sau khi bạn tìm hiểu về sách CS và thuật toán, sẽ dạy cách thực hành tốt nhất về cách viết mã tốt có thể duy trì (tên rõ ràng; chỉ nhận xét khi cần thiết ; giữ mã cùng nhau, tái cấu trúc khi cần thiết, sử dụng kiểm soát phiên bản, v.v.).


4
Nhận xét tốt nhất chưa; trong khi tôi thấy rất nhiều người nói luyện tập, luyện tập, luyện tập, đó không phải là hướng đi. Thực hành làm cho hoàn hảo họ nói nhưng điều đó chỉ thực thi các hành vi xấu. Đối với OP: Tiếp xúc với các khái niệm khác, tìm hiểu lý do tại sao một quicksort được ưa thích hơn một bong bóng. Chỉ có thực hành hoàn hảo làm cho hoàn hảo. Nhận khóa học CS đó.
Pieter B

2
Cảm ơn bạn đã đăng mã ví dụ đó, tôi đã nghĩ rằng tôi sẽ phải tự làm điều đó. - Chúng ta có thể xây dựng bất kỳ mạch logic phức tạp nào chỉ sử dụng cổng NAND; chúng tôi có các ngôn ngữ với rất ít thao tác đơn giản được hoàn thành; chúng ta không cần những toán tử ưa thích để giải quyết vấn đề. Giải quyết vấn đề không chỉ là Biết các công cụ phù hợp, có thể giải quyết vấn đề, tìm ra giải pháp hiệu quả cho kiến ​​thức của chính bạn là điều tạo nên một lập trình viên.
chọc

22

Nhưng tôi đã bị mắc kẹt ngày hôm qua khi cố gắng tìm ra (không phải google) một giải pháp cho thử nghiệm FizzBuzz vì tôi không có phương thức if ($ n1% $ n2 == 0) được ghi nhớ.

Không ai ghi nhớ điều đó. Bạn phải tự mình nghĩ ra nó. Nếu bạn biết toán tử mô đun và bạn biết nó làm gì, thì nó thực sự phù hợp với vấn đề FizzBuzz.

Tôi sẽ đi ra ngoài một chi ở đây và thường đề nghị rằng vấn đề là PHP. Tôi muốn nói rằng Java là ngôn ngữ tồi tệ nhất từng được thiết kế và PHP là ngôn ngữ tồi tệ nhất từ ​​trước đến nay , bởi vì ngay cả những người tạo ra nó cũng thừa nhận rằng nó không bao giờ được thiết kế. Thật khó để học các thực hành kỹ thuật phần mềm tốt khi môi trường của bạn thực tế là định nghĩa về cách không làm điều đó. Và tùy thuộc vào một khuôn khổ để hoàn thành mọi thứ không phải là nói nhiều.

Tôi hiện đang dành thời gian rảnh rỗi để học Java cho lập trình viên (để nắm bắt ngôn ngữ mà mọi người nói là khó / đòi hỏi)

Java là một trong những ngôn ngữ dễ nhất và tồi tệ nhất trong sự tồn tại. Nó chỉ có một điều: kế thừa thủ công được thu gom rác. Nếu bạn bè hoặc cố vấn của bạn nói rằng Java khó, thì hãy tìm những người bạn mới. C ++ là một ngôn ngữ khó khăn mà bao gồm rất nhiều khái niệm, và rằng không ai sẽ tranh chấp. Bạn cũng có thể làm C #, trong đó ít nhất có một số thuốc generic và lambdas.

Bạn sẽ học cách viết mã như thế nào, khi ngôn ngữ của bạn được thiết kế và triển khai bởi những người không thể viết mã và bạn phụ thuộc vào các khung cho mọi thứ bạn làm?


14
@moraleida: Không có gì xấu hổ khi tìm kiếm cú pháp cho một toán tử mà bạn không có lý do để sử dụng.
DeadMG

2
@moraleida: trong trường hợp đó tôi đồng ý không có vấn đề thực sự. Tôi không nghĩ rằng bất kỳ chuyên gia, người phỏng vấn hay nói cách khác, nên nhớ nếu bạn không thể đặt ngón tay vào cú pháp chính xác cho một ngôn ngữ khác, miễn là bạn có thể diễn đạt rõ ràng ý định của bạn là gì.
haylem

5
Đồng ý ở hầu hết các điểm, nhưng tại sao bạn lại coi Java là 'ngôn ngữ tồi tệ nhất từng được thiết kế'? Tôi không phải là một fan hâm mộ lớn của Java, nhưng điều này nghe có vẻ rất quan tâm.
Casey Kuball

7
-1 để sử dụng câu hỏi như một cái cớ để bash PHP khi nó không liên quan đến những gì được hỏi.
StasM

1
@Darthfett: Tôi có thể viết một bài luận về điều đó. Hãy đến trò chuyện SO C ++ và bạn có thể đọc nó: P
DeadMG

11

Tôi nghĩ rằng bạn phải có một cái nhìn khó khăn về lý do tại sao bạn bị mắc kẹt khi cố gắng tìm ra FizzBuzz. Vì vậy, giả sử, bạn nhớ có một toán tử $ncho bạn biết nếu nó chia hết cho một số. Và bạn gặp xui xẻo khi quên nó là gì. Tốt thôi, tại sao bạn không tiến hành thử làm theo bất kỳ cách nào khác? Nếu bạn biết bất cứ điều gì về mã, bạn sẽ có thể tìm thấy hàng tá cách khác để làm điều đó. Một số trong số chúng có thể trông kỳ lạ - ví dụ như đặt nhiều bội số của 5 vào một mảng và sau đó kiểm tra xem $ncó nằm trong số chúng không - và đó là một giải pháp tồi, nhưng nó vẫn sẽ là một giải pháp. Tuy nhiên, bạn đang nói rằng bạn không có bất kỳ thứ gì, bạn chỉ bị mắc kẹt. Nó có thể là một triệu chứng của một vấn đề lớn hơn.

Có hai điều trong lập trình mà bạn cần học.

  1. Túi thủ đoạn. Cách đọc tệp trong PHP, cách phân tích cú pháp XML trong Java, cách kết nối với cơ sở dữ liệu trong Python. Một số người ghi nhớ nó, nhưng trên thực tế những điều này chỉ đáng ghi nhớ nếu bạn sử dụng chúng mỗi ngày. Nếu không, bạn chỉ cần đi đến các tài liệu và tìm kiếm nó. Những thứ này không có bất kỳ chất nào ngoại trừ dạng chữ của chúng - bạn chỉ cần biết câu thần chú cụ thể phát ra như thế nào và kết quả sẽ ra sao.
  2. Tư duy. Đây là điều quan trọng nhất. Đây là cách bạn lập trình, và điều này không liên quan gì đến việc ghi nhớ. Bạn cần hiểu làm thế nào để giải thích những điều bạn muốn thực hiện với máy tính, những cách nào để thực hiện nó và sử dụng chúng trong những trường hợp cụ thể nào. Bây giờ, được cung cấp các công cụ hiện đại và tài liệu hiện đại, người ta có thể viết toàn bộ CMS bằng PHP bằng cách sử dụng phương pháp "túi thủ thuật", nhưng một khi bạn gặp phải một nhiệm vụ không có giải pháp làm sẵn, bạn sẽ bị "mắc kẹt".

Từ mô tả của bạn có vẻ như bạn đã bắt đầu với phần đầu tiên, nhưng hơi thiếu phần thứ hai. Khóa học CS tốt thường giúp ích rất nhiều cho điều đó, nhưng không phải là cách duy nhất. Cố gắng giải quyết các vấn đề khác nhau và đọc về cách giải quyết những vấn đề này, đọc những cuốn sách cơ bản được trích dẫn ở đây - tất cả những điều đó sẽ giúp ích. Khi bạn đã có suy nghĩ của lập trình viên, bạn sẽ khám phá ra rằng việc sử dụng một túi mánh khóe mới sẽ không còn là vấn đề nữa. Bạn sẽ phải google ở ​​đây và ở đó, tất nhiên, nhưng bạn sẽ không bao giờ bị mắc kẹt.


1
Hãy đọc và đọc về cách giải quyết những vấn đề này . Thực tế, hãy xem xét các giải pháp khác nhau cho cùng một vấn đề. Cố gắng hiểu từng người trong số họ, so sánh những gì họ có điểm chung và những gì họ làm khác nhau. Hiểu những điều đó và bạn sẽ tự động chọn những cách suy nghĩ khác nhau xung quanh cùng một vấn đề.
chọc

Tôi sẽ đồng ý hoàn toàn về tư duy. Một khi bạn nắm bắt được tư duy và các khái niệm, việc học các cấu trúc ngôn ngữ cơ bản sẽ dễ dàng hơn nhiều, và bạn sẽ bắt đầu nghĩ đến các cách khác để làm mọi việc như một vấn đề tất nhiên. (Chẳng hạn như đối với fizzbuzz, tất cả các số chia hết cho 5 sẽ kết thúc bằng 5 hoặc 0, do đó không cần toán hạng mô đun trên phần đó)
JohnP

9

Bạn có được sự phát triển tốt theo cách bạn có được bất cứ điều gì khác: thực hành. Có một khái niệm hay trong thế giới lập trình gọi là mã kata . Đây thực chất là một bài tập trong đó bạn viết mã giải pháp cho một vấn đề tương đối nhỏ, phân tích cái gì tốt và cái xấu, loại bỏ tất cả và làm lại. FizBuzz là một kata theo đúng nghĩa của nó. Vì vậy, làm điều đó, và làm nhiều hơn nữa. Khi bạn tìm thấy những thứ dường như không tốt hoặc chỉ không hoạt động, hãy nghiên cứu và tìm hiểu kỹ về nó. Đặt câu hỏi trên các trang web Hỏi & Đáp, đọc các bài báo và blog, xem cách người khác xử lý việc này và sau đó thực hành những gì bạn đã học.

Trong quá trình thực hiện thực hành này, bạn sẽ tìm hiểu thêm bao nhiêu nền tảng toán học / lý thuyết mà bạn có thể cần. Nếu bạn va vào các khái niệm mà bạn không thể quấn lấy đầu, thì hãy đọc về chúng và kiến ​​thức tiên quyết của chúng và quyết định từng trường hợp nếu bạn muốn tham gia một khóa học hoặc những gì bạn có để mở rộng nền tảng lý thuyết.


1
Mã kata này có vẻ tuyệt vời quá!
moraleida

8

... bởi vì tôi không có phương thức if ($ n1% $ n2 == 0) được ghi nhớ.

Tôi đang giải thích điều đó có nghĩa là, bạn không biết và / hoặc không nhớ toán tử mô đun. Nếu đây là trường hợp, nơi để bắt đầu là xem xét các cấu trúc ngôn ngữ trong ngôn ngữ bạn đang sử dụng. Xem lại bất cứ điều gì bạn không 'biết lạnh' và học bất cứ điều gì bạn không biết.


4
+1. Trong khi các câu trả lời khác nói về cách trở thành một thợ thủ công giỏi hơn, thì việc biết công cụ nào thực sự tồn tại thậm chí còn quan trọng hơn. Bạn đã bao giờ thử tháo một ốc vít bị hỏng mà không dễ dàng ra chưa? Có nhiều cách khác để nói về nó, nhưng đó là một cái tát trán khi cuối cùng bạn học được công cụ được tạo ra cho nó. Tôi muốn nói rằng OP nên xem qua bất kỳ danh sách các nhà khai thác PHP nào từ lâu và chơi xung quanh với những người không quen thuộc.
Tim Lehner

5

Tiếp tục viết mã, tiếp tục học hỏi. Cuối cùng, với đủ sự cống hiến, bạn sẽ nhìn vào FizzBuzz và tự hỏi tại sao bạn thậm chí phải nghĩ về nó. Rất nhiều công ty thực hiện một câu hỏi theo kiểu FizzBuzz như một phần rất sớm của các cuộc phỏng vấn của họ, vì vậy thất bại lần này có nghĩa là bạn ít nhất đã học được điều gì đó về quy trình tuyển dụng.

Chỉ cần tiếp tục viết mã, đưa ra ý tưởng dự án và nghiên cứu.


4

Tôi có thể khuyên bạn nên học JavaScript trước Java, C ++ không? Lý do cho bạn:

  1. Được sử dụng trong thiết kế mặt trước (jQuery, một số plugin WordPress, nguồn cấp dữ liệu Twitter, tải cơ sở dữ liệu vào trình duyệt của bạn thông qua JSON mà không cần nhiều công việc phụ trợ, xác thực mẫu, v.v.)
  2. Có thể được sử dụng phía máy chủ thông qua Node.js
  3. Có thể được sử dụng để xây dựng các ứng dụng lai cho iOS, Android, Win8, v.v.
  4. Nghiên cứu JS sẽ giúp bạn hiểu rõ hơn về hiệu suất trang web trong các trình duyệt và thiết bị khác nhau
  5. JS được thiết kế để thân thiện với người mới hơn
  6. Bạn đã biết HTML & CSS (tôi hy vọng;), vì vậy điều đó giúp với JS

Tài nguyên người mới miễn phí

http://www.codecademy.com/tracks/code-year
https://stackoverflow.com/tags/javascript/info
Tôi có thêm khoảng 10 liên kết, nhưng SE sẽ không cho phép tôi đăng chúng cho đến khi tôi đạt được 10 rep.

Học C ++, Java, v.v. cũng hữu ích, nhưng IMHO không có tác động đến tất cả các chương trình web như JS, vì bạn có thể sử dụng nó ở cả mặt trước và mặt sau. Chúc vui vẻ!



1
và khi bạn đã sẵn sàng để có một công việc: jobety.com
bắt đầu từ

3

Bạn có thể tìm và giúp đỡ người khác, ví dụ như give.code (tiết lộ: trang web của tôi) hoặc Code for America hoặc bất cứ điều gì. Đây là một cách tuyệt vời để tiếp xúc nhiều hơn với các vấn đề không phải là trang web PHP và cảm thấy tốt.

Khi bạn có một vấn đề cần giải quyết - hoặc giúp giải quyết, hoặc chỉ cần hiểu - việc chọn mã xuất hiện một cách tự nhiên trên đường đi. Có một mục tiêu là cách tốt nhất để học một cái gì đó.


1
Tuyệt vời! Đây thực sự là một cách tốt đẹp để học tập!
moraleida

0

Vì vậy, bạn không thể giải quyết vấn đề FizzBuzz. Thỏa thuận lớn. Bây giờ bạn có thể, và tôi cá là bạn sẽ không bao giờ quên tất cả vô số cách. Cố gắng đừng quá háo hức để xây dựng cho mình một lập trình viên tồi chỉ đơn giản vì bạn không thể giải quyết một vấn đề ngu ngốc ngoài đỉnh đầu.

Đó là một vấn đề. Khác là bạn dường như cảm thấy một chút đằng sau đường cong học lập trình. Như những người khác đã nói, tiếp tục viết mã và tiếp tục đọc. Bạn càng làm, bạn sẽ nhận được càng tốt. Nó đơn giản như vậy. Bắt đầu với bất cứ điều gì bạn cảm thấy là lỗ hổng lớn nhất trong nền của bạn và tiến hành từ đó.


(Điều này có nghĩa là âm thanh nâng cao. Không chắc chắn tôi đã thành công ở đó. Lol.)
Nick Spreitzer

0

Tôi không nghĩ rằng tôi từ chối giới thiệu ai đó cho thuê vì họ không biết đó là nhà điều hành mô-đun cung cấp rằng:

  1. Họ biết rằng đó là một nhà điều hành của một số loại.
  2. Họ có thể cho tôi biết "mô-đun" là gì khi tôi nhắc họ.

Nó không phải luôn luôn (mặc dù thường)%, và một số ngôn ngữ là lạ. Và chết tiệt, sau một thập kỷ, tôi không thể thành thật nói rằng tôi biết tất cả các toán tử perl (và tàu vũ trụ làm gì nữa?) Và tôi luôn có thể nhớ các toán tử bitwise một cách hoàn hảo. Đã vài năm kể từ khi tôi làm bất cứ điều gì thậm chí sẽ yêu cầu những thứ đó.

Điều gì có thể khiến tôi ngần ngại giới thiệu ai đó sẽ là nếu điều đó khiến họ có một cuộc tấn công hoảng loạn vì bỏ lỡ câu hỏi / bài kiểm tra đó. Điều đó có thể cho tôi ấn tượng rằng họ hơi quá xanh (trừ khi đó là một vị trí rất nhập cảnh). Không ai cần một người nào đó (hoặc cảm thấy cần phải) ghi nhớ những điều đó. Bạn cần một người hiểu các khái niệm rộng lớn hơn. Sẽ không có ai quan tâm nếu bạn tìm kiếm trên google, nhưng bạn sẽ phải tự tin khi phỏng vấn rằng biết% không phải là vấn đề lớn và bạn cũng biết sử dụng "toán tử" làm từ khóa khi bạn làm google nhanh Tìm kiếm.

Ngoài ra, đây chỉ là một ý tưởng ... nhưng nếu trường đại học cộng đồng địa phương của bạn có chương trình compsci, các khoản tín dụng khác của bạn sẽ chuyển hết và bạn có thể chỉ cần khoảng 20 tín chỉ cho bằng 2 năm. Gần như có thể hoàn thành nó trong một học kỳ. Họ sẽ cho bạn làm một khóa cấu trúc dữ liệu, cũng hy vọng các thuật toán ... có thể giúp bạn mạnh hơn một chút.


-1

Đây là một khóa học mẫu: http://www.ox.ac.uk/admissions/undergradiated_cifts/cifts/computer_science/computer_science_.html

Tôi khuyên bạn nên đọc phần sau: Lập trình hướng đối tượng (rất phổ biến, được sử dụng ở mọi nơi, đây là nơi java xuất hiện) Đồng thời (để viết các chương trình java không gặp sự cố bí ẩn trong thế giới thực, tìm hiểu về các bế tắc) Các khái niệm cơ sở dữ liệu (hầu hết các ứng dụng cần lưu dữ liệu, lý thuyết rất quan trọng ở đây) Mô hình lập trình (đọc về ít nhất một ngôn ngữ không oops, tốt nhất là chức năng, để mở rộng suy nghĩ của bạn và tìm hiểu nội dung mới)

Khi tôi nhìn vào 4 năm giáo dục khoa học comp, thành thật mà nói tôi nghĩ rằng chỉ có một số ít các khóa học mà bạn cần phải thực hiện nghiêm túc.

Các cấu trúc dữ liệu và thuật toán (và bạn cần toán học ở đây để thực sự tốt và được các lập trình viên khác thực hiện nghiêm túc), mạng máy tính và hệ điều hành là điều quan trọng nhất. Các đối tượng khác liên quan đến mã cấp thấp hơn, như có thể mã trong lắp ráp được cho là không quá quan trọng đối với bạn. Kỹ thuật và kiểm thử phần mềm đưa bạn đến những khái niệm hữu ích và bạn có thể tiếp thu nó theo thời gian.

Chỉ cần tải xuống bản pdf giải thích các khái niệm này một cách trực quan và bạn sẽ tiếp tục theo cách của mình.

Trong một số khóa học khoa học comp, ít nhất là ở tôi, năm đầu tiên là giới thiệu về tất cả các lĩnh vực kỹ thuật, như cơ khí, điện, dân dụng, v.v. cho hầu hết các lập trình viên ứng dụng hiện nay. Vì vậy, nhiều kỹ sư xung quanh ngày nay thực sự chỉ có 3 năm học khoa học comp thực sự (Hy vọng điều này làm bạn cảm thấy tốt hơn :)

Mấu chốt của câu trả lời: bạn có thể dành chút thời gian để học mỗi ngày, nói một tiếng hoặc lâu hơn, và trong một khoảng thời gian trở thành một lập trình viên khá giỏi. Hãy tiếp tục học hỏi. Và nhớ viết một số mã hàng ngày.


-3

Đối với tôi, chiến lược của tôi là tôi chỉ tấn công vấn đề có liên quan đến những gì tôi đang làm việc, vì vậy lời khuyên của tôi là bạn không cần phải học tất cả, chỉ cần đọc những điều có liên quan đến những gì bạn đang làm, bởi vì nếu bạn cố gắng học tất cả cùng một lúc thì có xu hướng bạn bị lạy và kết thúc việc lập trình ghét.

Sự thanh bình

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.