Những gì một lập trình viên mới bắt đầu có thể làm. Ngôn ngữ, công nghệ và hướng đi để chọn

12 điều giúp bạn học tập và làm việc. Chúng tôi đã chọn ra hàng tá câu trả lời stackexchange hay nhất cho câu hỏi “Lập trình viên nên biết gì?” Cho bạn.

Nếu bạn mới bắt đầu viết mã, chắc hẳn bạn đã hơn một lần tự hỏi về mức độ cần thiết hiểu biết. Chúng tôi đã cố gắng thu thập cho bạn những câu trả lời hay nhất từ ​​stackexchange, điều này sẽ giúp bạn quyết định bộ cơ bản... Việc lựa chọn là phổ biến và không phụ thuộc vào ngôn ngữ, môi trường phát triển hoặc hệ điều hành bạn đang làm việc.

Mọi lập trình viên nên biết:

1. Các khái niệm chung và ý nghĩa của chúng. Ví dụ: các mẫu thiết kế, khả năng sử dụng, thử nghiệm, ngăn xếp, v.v.
2. Có hiểu biết về OOP.
3. Thông thạo ít nhất một ngôn ngữ. Không có gì lạ, chỉ có thể khởi tạo các biến, phương thức, v.v. Ngay từ bây giờ, bạn có thể học một cách nhanh chóng.
4. Cách đọc mã của người khác.
5. Học mọi lúc. Học cách sử dụng thông tin một cách chính xác. Sách, internet, bất cứ điều gì.
6. Các hệ thống kiểm soát phiên bản. Không phải tất cả mọi thứ đều cần thiết, điều chính là phải biết những điều cơ bản được tìm thấy trong mỗi thứ.
7. Khi nào cần giúp đỡ và khi nào không.
8. Vấn đề cần giải quyết. Các lập trình viên thường chi tiêu số lượng lớn thời gian cho những việc vặt vãnh.
9. Đôi khi quên đi lòng tự trọng và thừa nhận sai lầm, không nhận lỗi về mình.
10. Làm thế nào để suy nghĩ như một người dùng, không chỉ là một lập trình viên kỹ thuật. Điều quan trọng là phải hiểu rằng mọi người sử dụng phần mềm của bạn, vì vậy bạn muốn làm cho họ hài lòng.
11. Cách thư giãn. Nghỉ ngơi là chìa khóa để làm việc hiệu quả. Ý chí và cà phê là không đủ.
12. Cách làm việc theo nhóm. Một sự nghiệp thành công với tư cách là một lập trình viên là một nửa là làm việc với mọi người.

Rõ ràng rằng sự lựa chọn chỉ là một tập hợp ngắn của tất cả mọi thứ mà bạn phải học, vì vậy chúng tôi khuyên bạn không nên dừng lại và đừng sợ hãi trước những điều chưa biết. Luôn luôn khám phá các ngôn ngữ mới cho chính mình, giải quyết các vấn đề mới và đừng lo lắng nếu lúc đầu không có gì xuất hiện. Trở thành một lập trình viên có nghĩa là luôn bắt kịp xu hướng và bắt kịp các công nghệ mới trong ngành. Vì vậy, hãy cải thiện và mở rộng ranh giới của kiến ​​thức và kỹ năng của bạn.

Muốn nhận được nhiều hơn vật liệu thú vị Với giao hàng?

Tính cụ thể của kiến ​​thức và kỹ năng, tất nhiên, phần lớn được xác định bởi lĩnh vực mà một người làm việc. Một số viết ứng dụng cho thiết bị máy tính bảng, những người khác phát triển công cụ trang web, vẫn còn những người khác - đồ chơi, v.v. Tuy nhiên, có một số kỹ năng sẽ hữu ích cho bất kỳ lập trình viên nào.

Làm quen với máy tính

Đây là kỹ năng đơn giản và cơ bản nhất mà lập trình viên nào cũng có. Nó cung cấp cho một mối quan tâm sâu sắc đến công nghệ máy tính, do đó, đặt ra một số câu hỏi cho một chuyên gia tương lai: để bắt đầu, làm thế nào để cài đặt Windows? Làm thế nào để tìm và hack một món đồ chơi ưa thích? BIOS, lưu trữ, nhân hệ thống, OOP là gì? - và chúng ta đi ...

Sau đó, người thân, bạn bè, bạn gái, bạn gái của bạn bắt đầu phản đối bạn, họ nói rằng hãy cài đặt chương trình, dọn dẹp hệ thống khỏi virus, sắp xếp lại Windows, v.v. Lúc đầu, bạn thậm chí còn thích điều đó: thật tuyệt khi cảm thấy có năng lực trong lĩnh vực này hay lĩnh vực khác. Nhưng sau đó một câu hỏi hợp lý được đặt ra: tại sao không bắt đầu kiếm tiền từ việc này? Tất nhiên, lấy tiền từ bạn bè bằng cách nào đó là miễn cưỡng, nhưng bán kiến ​​thức và sự nhiệt tình của bạn cho một công ty nghiêm túc nào đó là một ý tưởng rất thực tế. Bạn chọn một ngôn ngữ lập trình hoặc một ngôn ngữ lập trình khác, bạn bắt đầu học và một lần nữa bạn cảm thấy mình giống như một noob hoàn chỉnh ..

Tất cả những thứ này để làm gì? Và thực tế là thế giới công nghệ thông tin là thế giới đồ chơi mà bạn nên muốn chơi cùng. Đó là với sự quan tâm đến những "đồ chơi" mà mọi thứ bắt đầu. Nếu anh ta không có ở đó, thì cũng không có lập trình viên.

Tiếng Anh

Tiếng Anh là không thể thiếu. Để học một ngôn ngữ lập trình, bạn sẽ xem qua rất nhiều tài liệu, video hướng dẫn và tài liệu hướng dẫn. Hầu hết (99%) nguồn chính được viết bằng tiếng Anh. Nếu bạn không biết nó, thì phạm vi tài liệu cho việc học tập sẽ giảm đi đáng kể. Theo đó, tốc độ học một ngôn ngữ lập trình sẽ giảm đi đáng kể.

Ngoài ra, bạn cần biết tiếng Anh để có thể hiểu được cú pháp của ngôn ngữ, cũng như có thể vượt qua cuộc phỏng vấn thành công.

Mức độ nói, nghe hiểu là phần thưởng bổ sung. Dưới cụm từ "biết tiếng Anh" có nghĩa là biết cái gọi là "tiếng Anh kỹ thuật". Đó là, bạn cần phải hiểu các bài báo và tài liệu chuyên ngành, và điều này khác xa với việc giao tiếp "trực tiếp" với người nước ngoài.

toán học

Toán học không đơn giản như học tiếng Anh. Sẽ chính xác hơn nếu nói rằng tư duy logic và trừu tượng phải được công bằng cấp độ cao... Toán học trong một trường đại học hoặc trường học phát triển những kỹ năng này, vì vậy giáo dục toán học là một điểm cộng lớn. Tuy nhiên, có rất nhiều lập trình viên không có nền tảng toán học. Thậm chí có những người không có giáo dục đại học nói chung. Điều này cho thấy rằng logic và tư duy trừu tượng có thể được phát triển không chỉ bằng các cấu trúc toán học.

Tất nhiên, có những lĩnh vực lập trình mà bạn cần biết các công thức cụ thể, nhưng, thứ nhất, điều này không phải ở đâu cũng có, và thứ hai, bạn có thể tự làm quen với chúng theo cách thức và chuyên biệt. chương trình toán học... Vật lý và toán học đặc biệt hữu ích nếu bạn muốn tạo ra các trò chơi máy tính chất lượng cao.

Hòa đồng

Hòa đồng là một trong những thuộc tính quan trọng của một lập trình viên giỏi. Thực tế là hầu hết các dự án nghiêm túc đều được viết trong một nhóm - điều này vừa thuận tiện hơn vừa nhanh hơn. Nếu bạn muốn làm việc cho một "văn phòng" ít nhiều nghiêm túc, bạn cần có khả năng giao tiếp với mọi người, đàm phán, tranh luận và thỏa thuận. Bạn cũng sẽ cần phải có khả năng hòa hợp với các sếp của mình, những người đôi khi sẽ hiểu về lập trình hơn bạn, và đôi khi sẽ không hiểu gì cả về vấn đề này.

Họ nói rằng có một câu chuyện hoang đường, sự bí bách và cô lập là một phần không thể thiếu trong bản chất của một lập trình viên. Hầu hết các lập trình viên đều là những người rất thú vị và hòa đồng. Và hermitism là một loại hình ảnh vốn có ở tất cả các thiên tài, bất kể ngành nghề nào, có thể là lập trình viên, nhà ngôn ngữ học, bác sĩ, v.v.

Đầu óc linh hoạt

Bản thân trí óc (khả năng vận hành với những kiến ​​thức cần thiết) là chưa đủ, nó cần phải linh hoạt. Trí óc linh hoạt cung cấp khả năng học hỏi (bổ sung kiến ​​thức, thay thế thông tin lỗi thời bằng thông tin mới). Có những người có vẻ ngoài thông minh, nhưng rất bảo thủ. Họ có tư duy logic tốt, nói rõ ràng và nhất quán, nhưng, than ôi, họ không thể học được điều gì đó mới. Nhưng ngược lại - cái đầu rất ham học hỏi, nó quan tâm đến mọi thứ, mọi thứ cần thiết, nhưng trong đầu có một mớ hỗn độn, tức là nó không thể kết nối tất cả thông tin tích lũy thành một vị trí tổng thể, cấu trúc nó.

Bạn luôn nên học lập trình. Bài kiểm tra quan trọng và khó khăn nhất về các kỹ năng của người mới bắt đầu sẽ là học ngôn ngữ lập trình đầu tiên. Hơn nữa, nó sẽ dễ dàng hơn, nhưng bạn cần nhớ rằng bạn hoàn toàn thư giãn trong Hoạt động chuyên môn sẽ không bao giờ thành công.

Công việc của một chuyên gia như vậy là sự kết hợp của các hành động kỹ thuật thuần túy với ngôn ngữ khác nhau lập trình và làm việc sáng tạo để tối ưu hóa chức năng của sản phẩm phần mềm cuối cùng. Chuyên gia tham gia vào việc thiết kế, tạo ra thuật toán của chương trình, viết mã của nó, kiểm tra hiệu suất.

Kỹ năng và kiến ​​thức chuyên môn cần thiết

Tất cả những điều trên đều có thể học được. Có, bạn cần phải phát triển không ngừng, nhưng kỹ năng viết mã cơ bản có thể được phát triển đến mức hoàn thiện chỉ trong một vài năm học trên một chương trình giáo dục phát triển tốt.

Một câu hỏi khác, những gì bạn cần biết để ứng tuyển cho một lập trình viên. Không thể ở đây trong vòng 2-5 năm để phát triển thành một chuyên gia nếu bạn tiếp cận giáo dục chuyên biệt với bộ tối thiểu kiến thức học đường. Muốn vượt lên trước các đối thủ, để có được lợi thế ngay từ khi bắt đầu sự nghiệp, mỗi lập trình viên (tương lai) nên bắt đầu thành thạo một nghề với cơ sở xuất sắc:

  • trong toán học (ở đây - logic, lý thuyết xác suất);
  • vật lý học;
  • tin học;
  • Tiếng Anh, tiếng Nga.

Một lập trình viên nên biết gì để làm việc cho tương lai (nghề nghiệp, mức lương, danh tiếng)? Bạn cần hiểu biết sâu sắc về kiến ​​trúc của môi trường phần mềm nơi bạn phải làm việc, các nguyên tắc viết mã, kiến ​​thức về các phương pháp tạo chương trình đơn giản nhất.

Bạn cần biết nhiều thứ: tiêu chuẩn lập trình, khái niệm thiết kế nhiệm vụ, phương pháp kiểm tra tài nguyên. Học sinh càng đắm chìm sâu vào nền tảng của toán học (phân tích, đồ thị), vị trí của anh ta càng mạnh, kho công cụ được sử dụng càng rộng.

Các kỹ năng bổ sung để giúp bạn cạnh tranh trên thị trường lao động

Kỹ năng nào giúp bạn nhanh chóng chinh phục thị trường việc làm uy tín?

  • Khả năng làm việc theo nhóm của một chuyên gia CNTT là 50% thành công trong quá trình đào tạo của anh ta trong bất kỳ lĩnh vực nào (kiến trúc mạng, ngôn ngữ lập trình khác nhau).
  • Kiên trì, bền bỉ, không có khả năng bỏ cuộc.
  • Một tư duy phân tích + tư duy phản biện sẽ cho phép bạn ưu tiên loại bỏ những nhiệm vụ bất khả thi. Khả năng tiết kiệm thời gian của khách hàng là điểm cộng quan trọng nhất của một chuyên gia.
  • Cách tiếp cận theo nhịp điệu (tính nhất quán của tính cách) sẽ giúp đạt được thành công nhanh hơn.
  • Tính đặc thù của nghề - làm việc trong điều kiện cách ly với xã hội - quyết định một số thói quen của lập trình viên, mà trong tương lai có thể làm giảm hiệu quả của anh ta. Vì vậy, các kỹ năng giao tiếp tích cực và khả năng trình bày ý tưởng của bạn, thói quen nhận thức về các thuật toán và dịch vụ phổ biến cũng là những kỹ năng hữu ích.

Những gì một người mới bắt đầu nên biết

Công việc của một lập trình viên là sự phát triển không ngừng của tri thức. Nền tảng lý thuyết và thực hành được hình thành trong quá trình đào tạo, nhưng quá trình hình thành không kết thúc ở đó - các kiến ​​thức khác nhau phải được cập nhật và đào sâu theo hướng hẹp. Nhưng điều này có nghĩa là bạn không thể bắt đầu với một bộ kiến ​​thức và kỹ năng tối thiểu? Đối với một người mới bắt đầu, để có một bản sơ yếu lý lịch tốt, chỉ cần:

  • kỹ năng viết chương trình bằng 2-3 ngôn ngữ phổ biến (Python, JavaScript, HTML được coi là tối ưu cho một chuyên gia mới bắt đầu);
  • kiến thức và hiểu biết về thuật toán, cơ sở dữ liệu, các mẫu lập trình;
  • khung học tập (môi trường phần mềm cho các nền tảng điều hành khác nhau - Windows, iOS).
Ngày 10 tháng 3 năm 2016 lúc 09:56 sáng

Những gì một lập trình viên phải làm để có được một công việc trong lĩnh vực tài chính

  • Blog ITI Capital,
  • Phát triển trang web

Trong blog của chúng tôi trên Habré, chúng tôi viết rất nhiều về các công nghệ được sử dụng trong lĩnh vực tài chính. Các sàn giao dịch chứng khoán ngày nay sử dụng phần mềm và phần cứng tiên tiến nhất - cả để xây dựng cơ sở hạ tầng giao dịch và để tạo ra các hệ thống giao dịch trực tuyến.

Ngày nay, các nhà toán học, vật lý và lập trình đang có nhu cầu ở đây. Mọi người có thể tạo các thuật toán giao dịch và tạo phần mềm chất lượng cao dựa trên chúng. Đến lượt mình, nhiều lập trình viên muốn thử sức mình với ngành tài chính - ngành này có thể mang đến sự kết hợp hấp dẫn giữa các nhiệm vụ thú vị và mức lương cao.

Hôm nay chúng ta sẽ nói về những kỹ năng bạn cần phải có để có được công việc tại công ty HFT, ngân hàng đầu tư, quỹ đầu cơ hoặc công ty môi giới. Khi chuẩn bị chủ đề, tài liệu từ các trang web và quantstart.com đã được sử dụng.

Ngôn ngữ

Một trong những ngôn ngữ lập trình phổ biến nhất trong lĩnh vực tài chính trong nhiều năm là C. Bạn cần biết nó không chỉ để hỗ trợ mã kế thừa mà còn để tổ chức công việc với các API trong hệ thống giao dịch điện tử và trao đổi dữ liệu với các nhà cung cấp.

C ++ được gọi là "ngôn ngữ chủ đạo của Phố Wall" vì điều quan trọng nhất đối với hệ thống giao dịch là tốc độ. Cho dù một chương trình giao dịch có thể được suy nghĩ và gỡ lỗi tốt đến đâu, nếu tại một thời điểm nào đó nó dành thêm mili giây cho việc "thu gom rác", nó có thể dẫn đến thua lỗ nghiêm trọng. Điều tương tự cũng áp dụng cho cơ sở hạ tầng trao đổi - tất cả các loại cổng truyền dữ liệu và "đầu nối" với các hệ thống khác nhau.

Do đó, các lập trình viên C ++ đang có nhu cầu lớn trong các công ty trong lĩnh vực tài chính - bao gồm cả trên chính các sàn giao dịch. Và tình trạng này sẽ tiếp diễn cho năm dài về phía trước - ai đó cần duy trì cơ sở hạ tầng hiện tại.

Đối với một trong những bài viết trước của chúng tôi, chúng tôi đã nói chuyện với một chuyên gia người Nga về việc tạo ra các hệ thống giao dịch, người, trong những tình huống cần tốc độ tối đa, hãy sử dụng các công nghệ sau:

C ++ và C thuần túy rất thích hợp cho những tác vụ này. Nó cũng xảy ra rằng rô bốt nhanh hầu như được tạo ra trong trình hợp dịch - ở đây cần đề cập đến cơ chế đọc và ghi dữ liệu trực tiếp vào bộ nhớ của card mạng, bỏ qua các cơ chế tiêu chuẩn để làm việc thông qua trình điều khiển, cũng như làm việc với "phần cứng lập trình siêu nhanh" như FPGA.

Theo người tạo ra tài nguyên QuantStart và nhà giao dịch chuyên nghiệp Michael Halls-Moore, ngày nay một lập trình viên cao cấp với 5-7 năm kinh nghiệm về C ++ có thể kiếm được £ 500-700 mỗi ngày ở London. V Các công ty Nga Các chuyên gia C ++ cũng đang có nhu cầu cao. Ngoài ra, những nhà phát triển này thường được tuyển dụng bởi các nhà giao dịch chuyên nghiệp, những người có thể tạo ra một chiến lược giao dịch thành công nhưng cần sự trợ giúp của người có thể lập trình nó.

C # và Java cũng đã được sử dụng bởi các tổ chức tài chính khác nhau trong một thời gian. Chủ yếu là các ngân hàng lớn cho cơ sở hạ tầng giao dịch của họ. Những ngôn ngữ này được sử dụng để xây dựng giao diện frontend và xử lý dữ liệu.

Trong thị trường tài chính Nga, các chuyên gia biết C ++ và C # được đánh giá rất cao - trong blog của chúng tôi trước đó, chúng tôi đã nói về việc ai, nhờ những công cụ này, đã có thể tìm được việc làm trong các công ty tài chính và sau đó bắt đầu tạo hệ thống giao dịch. Dưới đây là những gì mà người hùng của tài liệu khuyên dành cho các lập trình viên muốn kiếm việc làm trong lĩnh vực tài chính trong tương lai:

Đối với những người đang bắt đầu hành trình giao dịch hoặc bằng cách nào đó quan tâm đến lĩnh vực này, tôi khuyên bạn nên chuyển sự chú ý của họ sang các nền tảng và ngôn ngữ cấp cao như .NET và Java. Ngôn ngữ thứ hai rất phổ biến ở các thị trường chứng khoán phương Tây, cho đến nay chúng ta còn ít hơn, nhưng có triển vọng tốt cho việc phổ biến rộng rãi hơn ngôn ngữ này. Điều này có nghĩa là các lập trình viên Java sẽ có nhu cầu trong các công ty tài chính, quỹ và nhà môi giới. Xét cho cùng, .NET là một nền tảng khá đóng, cũng có toàn bộ dòng những hạn chế. Nó không phù hợp lắm cho giao dịch HFT và độ trễ thấp.

Nhưng cả .NET và Java đều có thể được sử dụng để tạo ra các sản phẩm phần mềm hoàn chỉnh khá nhanh chóng. Nhược điểm chính là chúng không phải là nhanh nhất (nếu đếm được bằng micro giây).


Các ngân hàng thường sử dụng các ngôn ngữ kịch bản như Python, MATLAB và R để làm nguyên mẫu các mô hình lượng tử trong các quỹ đầu cơ và các nhà giao dịch lượng tử.

Các nhà giao dịch lượng tử và các nhà phát triển ứng dụng tài chính thường viết mã nguyên mẫu của họ bằng các ngôn ngữ kịch bản. Sau đó, các nguyên mẫu này đã được các nhà phát triển chuyên về lĩnh vực này mô tả bằng các ngôn ngữ nhanh hơn như C ++.

Hệ thống máy khách-máy chủ

Hệ thống giao dịch được phân phối theo định nghĩa. Hầu hết tất cả các công ty, từ các công ty nhỏ đến các ngân hàng đầu tư lớn, đều xây dựng hệ thống của họ bằng cách sử dụng Giao thức TCP và UDP - đôi khi trong giao dịch, tốc độ quan trọng hơn việc đảm bảo cung cấp dữ liệu.

Do đó, các nhà phát triển ứng dụng giao dịch cần phải hiểu rõ về các lớp socket cho C: socket (), bind (), thăm dò ý kiến ​​() và select (). Hầu như không bao giờ cần thiết phải làm việc trực tiếp với chúng, vì đã có nhiều thư viện làm sẵn cho việc này, tuy nhiên, chỉ cần hiểu cách tương tác với chúng hoạt động là điều cần thiết.

Ngoài ra, đối với các nhà phát triển phần mềm tài chính, một điểm cộng là kiến ​​thức về các giao thức truyền dữ liệu được sử dụng trong lĩnh vực này, chẳng hạn như ,.

Dòng

Sự sáng tạo hệ thống máy khách-máy chủ và lập trình đa luồng trong tài chính đi đôi với nhau. Tất cả điều này ngụ ý, ví dụ, viết một máy chủ TCP tiêu chuẩn, máy chủ cân bằng tải, máy chủ hiệu suất cao- một nhà phát triển muốn tạo phần mềm trong một công ty tài chính phải có khả năng làm điều này. Bạn cũng nên hiểu khái niệm pthreads (), fork (), mutexes và semaphore là gì. Nếu bạn đang sử dụng Java, bạn cũng cần hiểu các phương pháp đồng bộ hóa tồn tại cho ngôn ngữ này.

Cơ sở dữ liệu

Cơ sở dữ liệu là trung tâm của hệ thống tài chính, vì vậy các nhà phát triển cần có kiến ​​thức sâu về SQL. Kiến thức về các toán tử lựa chọn đơn giản sẽ không đủ - thường xuyên trong quá trình làm việc, bạn sẽ phải loay hoay tạo các thủ tục lưu trữ, xử lý các chỉ mục, v.v. Bạn cũng cần hiểu sự khác biệt giữa các khóa cấp bảng, cấp trang và cấp hàng.

UNIX
Hệ thống giao dịch thường sử dụng nền tảng UNIX (thường là Solaris và Linux). Đối với Windows, theo quy định, các thiết bị đầu cuối giao dịch có giao diện đồ họa được tạo ra, trong khi UNIX được sử dụng để phát triển "động cơ" của phần mềm giao dịch.

Điều này có nghĩa là các nhà phát triển chỉ cần hiểu các lệnh tail, sed, grep, awk, tr và top là gì. Sẽ tốt hơn nếu kỹ thuật viên biết cách làm việc với vi, vim hoặc emacs và không bị đe dọa bởi các sự cố do định cấu hình sai $ LD_LIBRARY_PATH.

Kỹ năng gỡ lỗi

Khả năng phân tích các tệp lõi bằng dbx hoặc gdb sẽ rất hữu ích trong sự nghiệp lập trình tại các tổ chức tài chính. Nhu cầu như vậy nảy sinh không thường xuyên, nhưng nếu nó xảy ra, tốt hơn là bạn có thể tự mình làm mọi thứ.

Sự kết luận

Thị trường chứng khoán là một ngành công nghệ cao đang phát triển tích cực, điều này làm cho việc làm việc trong lĩnh vực này trở nên rất hấp dẫn đối với các chuyên gia CNTT muốn phát triển kỹ năng của họ. Đồng thời, để tham gia vào dự án thú vị không cần thiết cho một kỹ sư đi du lịch nước ngoài - các công nghệ mới đang được giới thiệu tích cực bằng tiếng Nga thị trường chứng khoán... Trong một trong những tài liệu trước đây của chúng tôi, chúng tôi đã nói về việc tạo ra thiết bị đầu cuối SmartX và hệ thống giao dịch nhà môi giới Ma trận, trong quá trình phát triển mà bạn có thể tham gia.

Tóm lại, một lời khuyên nữa: đừng quá lo lắng về việc biết "nhà bếp" bên trong của các quy trình và khái niệm giao dịch từ lĩnh vực tài chính. Tất nhiên, đây có thể là một lợi thế bổ sung, nhưng sự thiếu hụt kinh tế và kiến ​​thức khó có thể làm tổn hại lập trình viên giỏi tìm một công việc trong một công ty tài chính.

P. S. Gửi tới nhóm phát triển ITinvest cho công việc thiết kế bên trên

Văn bản này xuất hiện như một phản ứng trước phản ứng tiêu chuẩn của "các lập trình viên thực sự" để đáp lại lời tôi nói rằng tôi là một lập trình viên 1C. "Ah-ah, 1c-nickname, nhưng bạn là loại lập trình viên nào vậy, tốt nhất là một người viết kịch bản. Hãy tìm hiểu kỹ bộ phận kế toán của bạn và vì lý do nào đó, hãy tự coi mình là lập trình viên. Một lập trình viên thực thụ biết anh ta nên biết bao nhiêu?"

Khi tôi quan tâm hỏi chính xác những gì mà một NHÀ LẬP TRÌNH THỰC SỰ nên biết, tôi thường nhận được câu trả lời về một số vấn đề cụ thể của chính proger mà tôi đang nói chuyện vào lúc này. Hơn nữa, chúng được trình bày gần như là bản chất thực sự của tất cả các chương trình như vậy. Đại loại là - "Nếu bạn không biết cách sử dụng semaphores trong Delphi, bạn không phải là một lập trình viên." Hoặc - "nếu bạn không biết cách sắp xếp bảng băm, bạn không phải là một lập trình viên." Tôi cảm thấy mệt mỏi với điều này, tôi lục tung trên Internet và quyết định thu thập trong một bài đăng tất cả mọi thứ mà một NHÀ LẬP TRÌNH THỰC SỰ nên biết theo ý kiến ​​của chính các NHÀ LẬP TRÌNH THỰC SỰ. Danh sách được chia nhỏ theo phần kiến ​​thức dưới hình cắt

TOÁN HỌC

Phương pháp số, phân đôi / phương pháp Newton, liên và ngoại suy, splines, phương pháp Gauss / Jacobi / Seidel, phân hủy QR và LU, SVD, OLS, phương pháp Runge-Kutta, phương pháp Adams, công thức Newton-Cotes, phương pháp Ritz, phương pháp Bubnov -Galerkin, chênh lệch hữu hạn / phương pháp phần tử, FFT / STFT, hội tụ và ổn định, l-bfgs và các phương pháp gần như Newton khác, adagrad, PARAFAC, cassowary, phương pháp điểm bên trong, phương pháp biến phân cho suy luận Bayes, nesterov, phân biệt tự động, xen kẽ ít nhất hình vuông, điều mà mọi nhà khoa học máy tính nên biết về số học dấu phẩy động của Goldberg, Nocedal & Wright / Boyd & Vandenberghe

Các thuật toán, Knut-Graham-Patashnik / Zorich / Vinberg, Spivak / Dummit-Foote, phân tích toán học, đại số tuyến tính, phân tích phức tạp, phân tích hàm, hình học vi phân, lý thuyết số, phương trình vi phân / phương trình tích phân / giải tích các biến thể / điều khiển tối ưu, hàm sinh, chuỗi, tổ hợp, lý thuyết xác suất / thống kê toán học / quy trình ngẫu nhiên / lý thuyết xếp hàng, chuỗi Markov , biến đổi tích phân (Fourier, Laplace, Wavelet), NZQRCHOS, matpackets (Mathematica, Maple), lý thuyết phạm trù

Lý thuyết thông tin, nén, Huffman, RLE, BWT, LZ, mã sửa lỗi, nén mất dữ liệu (hình ảnh, âm thanh, video), entropy thông tin, công thức Shannon, độ phức tạp Kolmogorov, vấn đề entropy tối đa, phân kỳ kullback-leibler, elias / shannon-elias mã hóa

Toán học rời rạc, K2, định lý Post, mạch điện, ô tự động hữu hạn (DFA và NDKA), ô tự động Kalashnikov, ô tự động di động

Mật mã, Schneier / Yaschenko, nguyên tắc Kerkhoffs, đối xứng (DES, AES), không đối xứng (RSA), chất lượng PRNG, thuật toán Diffie-Hellman, đường cong elip, băm (MD5, SHA, CRCn), DHT, sức mạnh mật mã, các cuộc tấn công tiền điện tử (kiện tướng tấn công), WEP / WPA / WPA2 và các cuộc tấn công chống lại chúng, chữ ký kỹ thuật số và chứng chỉ, PKI, HTTPS / SSL, bằng chứng không có kiến ​​thức, lược đồ ngưỡng, murmurhash / cityhash, DKIM

Điện toán lượng tử, thuật toán Shor, mật mã lượng tử

CƠ SỞ LẬP TRÌNH CHUNG

Đa luồng, triết gia ăn uống, bế tắc / sống động / tình trạng chủng tộc / đói, nguyên tử, hướng dẫn khóa bộ xử lý, mô hình bộ nhớ / rào cản / đặt hàng, CAS hoặc LL / SC, chờ / khóa / không có vật cản, vấn đề ABA, ghi vùng chứa không có khóa, spin-lock, TLS / dữ liệu mỗi luồng, luật Amdahl, OpenMP, MPI, bản đồ-giảm, phần quan trọng / mutex / semaphore / biến điều kiện, WaitForSingleObject / WaitForMultipleObjec ts, luồng xanh / coroutine, pthreads, tương lai / trì hoãn / lời hứa, mô hình diễn viên, máy chủ tham số, RDD (như được thấy trong sparks), SGD như mưa như trút nước, không chờ đợi, có ngăn xếp so với không ngăn xếp

Khả năng tính toán, Máy turing, thuật toán Markov bình thường, Máy đăng bài, Phương trình Diophantine Matiyasevich, Hàm lambda của Giáo hội, Hàm đệ quy một phần Kleene, Lập trình tổ hợp Scheinfinkel, Brainfuck, Tương đương vũng lầy Turing, vấn đề dừng và khả năng tự ứng dụng, tính đếm được của một tập các hàm tính toán, Thuật toán RAM Tarski, bộ giải SAT / SMT, lý thuyết hệ thống hình thức, chứng minh tương tác, định lý Levin-Cook, 3SAT, PSPACE = NPSPACE,

Thuật toán và tối ưu hóa tổ hợp, Kormen / Skiena / Sedgwick / Knut / Aho-Hopcroft-U lman / Papadimitriu / Shriver-Goldberg / Prep arata-Sheimos / e-maxx.ru, cấu trúc dữ liệu, thuật toán, độ phức tạp, biểu tượng Landau, định lý Akra- Buzz, cân bằng không gian thời gian, các lớp phức tạp, các vấn đề NP-đầy đủ, ILC, đồ thị và cây, luồng mạng, ma trận Kirchhoff, cây tìm kiếm (đặc biệt là RB-tree và B-tree), phát hiện tắc, đống, bảng băm và hàm băm lý tưởng , Lưới Petri, thuật toán nông dân Nga, phương pháp Karatsuba và phép nhân ma trận Winograd-Strassen, sắp xếp, thuật toán tham lam và ma trận, lập trình động, lập trình tuyến tính, thuật toán khác biệt, thuật toán ngẫu nhiên và thuật toán tìm kiếm mờ, số giả ngẫu nhiên, logic mờ, gusfield (cây hậu tố, căn chỉnh chuỗi), tìm kiếm mô-típ, dòng quét, bộ nhớ đệm ẩn, sắp xếp kênh, bố cục VEB, tối ưu hóa gốc, thuật toán cho đồ thị động, mô hình tính toán (máy RAM / máy con trỏ / cây quyết định, v.v.), a các thuật toán trong phân cấp bộ nhớ / thuật toán phát trực tuyến, xử lý chuyển tiếp thời gian, phạm vi & xếp hạng, cây LSM, cây ab được đệm, cây toku, cấu trúc liên tục, cấu trúc succint, cấu trúc tổn hao (bộ lọc bloom / bloomier, bảng băm có kết quả dương tính giả ), băm nhạy cảm với địa phương, cân bằng không gian thời gian trên bảng băm, chiến lược lập lịch

Học máy, Tibshirani / Bishop, phương pháp tiếp cận mô hình AI, đào tạo lại / xác nhận chéo, mạng Bayes, mạng nơ-ron, mạng Kohonen, máy Boltzmann hạn chế, dốc xuống / leo đồi, tối ưu hóa ngẫu nhiên (phương pháp Monte Carlo, phương pháp ủ, thuật toán di truyền, kiến thuật toán), SVM, tăng độ dốc, phân tích cụm, phân tích thành phần chính, LSH, học tăng cường, MDP, truy xuất thông tin / khai thác dữ liệu / xử lý ngôn ngữ tự nhiên, thị giác máy, Szeliski, OpenCV, xử lý hình ảnh, OCR, Bộ lọc Sobel, Dòng thác Haar, Khung Viola-Jones, SURF, giới thiệu về tâm sinh lý của thị giác, IPython / pandas / scikit-learning, (ME) HMM, CRF, vấn đề sai lệch nhãn, NN xếp chồng, LeToR, máy phân tích nhân tử, mã tự động, RNN / CNN, các vấn đề riêng lẻ là tốt hơn thay vì NLP (lập mô hình ngôn ngữ, phát hiện đồng tham chiếu, phân đoạn văn bản, gắn thẻ POS, phân tích cú pháp theo xác suất, dịch máy thống kê, sửa lỗi chính tả, trả lời câu hỏi, NER, phát hiện cụm từ, tóm tắt văn bản ization, nhận dạng giọng nói, trích xuất dữ liệu, phân tích tình cảm), tính toán softmax hiệu quả, kỹ thuật / lựa chọn tính năng, ước tính chất lượng, Manning / Jurafsky / McCallum / Koehn, các chủ đề tiềm ẩn (LDA, nhà hàng chineese, pLSI), tọa độ song song, nguyên âm wabbit, NLTK , học có cấu trúc, thuật toán EM, phân kỳ tương phản, giải phẫu não tối ưu, truyền niềm tin, học bán giám sát, học quy nạp vs chuyển đổi, thủ thuật hạt nhân, các cặp phân biệt / sinh sản (như đã thấy bởi Ng & Jordan), trình tự để trình tự học, đóng gói , phân tích biểu đồ xã hội, hệ thống đề xuất / lọc cộng tác, học tập đa phương thức

CÁC NGUYÊN TẮC CHUNG CỦA VIỆC VIẾT CHƯƠNG TRÌNH

Kiến trúc và kiểu mã, McConnell / Fowler / LeBlanc / Gamma / Alexandrescu-Sutter / Booch, lập trình phòng thủ, mẫu, SOLID / GRASP / KISS DRY SPOT / YAGNI, UML, OOP (Smalltalk), OOD / OOA, số liệu mã, chú Bob

Phương pháp phát triển, Waterfall / RUP / Agile / Scrum / Kanban / XP, TDD / BDD, CASE

Công cụ phát triển, IDE, IntelliSense, trình gỡ lỗi (VS / Olly / WinDbg / kdb / gdb) và trình theo dõi (strace / ltrace), định dạng thông tin gỡ lỗi DWARF, trình tháo gỡ và trình dịch ngược (IDA / HexRays / Reflector), hệ thống kiểm soát phiên bản (SVN, GIT ), hợp nhất / chi nhánh / thân cây, hệ thống đặt tên tệp và nhánh, tích hợp liên tục, ant, phạm vi mã, phân tích tĩnh (lint, cppcheck), phân tích động (valgrind, fuzzing), xác minh và xác thực phần mềm (Frama-C, RAISE (RSL) ), Coq), lập hồ sơ, trình theo dõi lỗi, tài liệu mã, xây dựng hệ thống (CMake), trình quản lý gói (NuGet)

Khung, Qt, moc và siêu thông tin, khái niệm tín hiệu vị trí, Summerfield-Blanchet / Schlee, PoCo, thư viện công nghiệp: GMP, i18n, lapack, fftw, pcre

Thiết kế GUI và trình bày thông tin, Ruskin / Tufty, khả năng sử dụng, khái niệm cơ bản về thiết kế và kiểu chữ, định luật Fitts, khái niệm cơ bản về bố cục, LaTeX, thuật toán trực quan hóa dữ liệu (như đã thấy trong d3), kết xuất subpixel

Kiểm tra, kiểm tra đơn vị, chức năng, tải, kiểm tra tích hợp, kiểm tra giao diện người dùng, mocks / sơ khai / gián điệp, vật cố định, mùi và mẫu thử nghiệm (Osherove / Meszaros)

NGÔN NGỮ LẬP TRÌNH

Hiểu biết chung về ngôn ngữ lập trình, ngữ pháp, hệ thống phân cấp Chomsky, định lý Myhill-Nerode, bổ đề bơm và bổ đề Ogden, đại số Kleene, NDKA → DFA, các bài toán khó giải theo thuật toán trong các ngôn ngữ chính thức, Dragonbook, Friedl, regexps và độ phức tạp của chúng, PCRE, BNF, Boost .Spirit + Karma + Qi / Ragel, LL, LR / SLR / LALR / GLR, PEG / packrat, yacc / bison / flex / antlr, phân tích mã tĩnh, biên dịch / dịch ngược / obfuscation / deobfing, Clang / LLVM / XMLVM / Emscripten , GCCXML, OpenC ++, xây dựng máy ảo, JiT / AoT / GC, DSL / DSEL, thay thế trên ngăn xếp, thuật toán kiểm tra kiểu / suy luận kiểu, trình phân tích cú pháp CYK, thiết kế và triển khai trình biên dịch nâng cao bởi Manynick

Hợp ngữ, Zubkov / Hyde / Drepper / Kaspersky / Fog / Abrash, x86, FPU / MMX / SSEn / AVX, cú pháp AT&T và Intel, masm32, macro, ngăn xếp, trình quản lý heap / heap, quy ước gọi, mã hex, biểu diễn dữ liệu máy , IEEE754, little / big endian, SIMD, phần cứng ngoại lệ, ngắt, bộ nhớ ảo, đảo ngược, ngắt ngăn xếp và đống, lập trình định hướng trả về, shellcode chữ và số, lỗi L1 / L2 / RAM / trang và thời gian của chúng, ngôn ngữ hợp ngữ ARM

C ++, tiêu chuẩn, Comeau, 1TBS, Stroustrap / D & E / Josattis / Vanderwood, Dewhurst / Meyers / Sutter, RAII / copy-and-swap / exception-an toàn, quy tắc năm, Alexandrescu / Abrahams-Gurtova, loại xóa , CRTP, NVI, SFINAE, tra cứu Koenig, thiết bị Duff, Boost, Sik-Lumsdein / Karlsson, TR trên hiệu suất C ++, kiểm tra Stepanov, vấn đề chuyển tiếp / ngữ nghĩa di chuyển, SPECS, GotW, Meyer "s singleton, cppgm

Trình biên dịch C ++, các tính năng triển khai của tiêu chuẩn, các hạn chế triển khai, các tính năng nội tại, sự khác biệt thư viện tiêu chuẩn(container, rand), ABI, thực hiện các chức năng ảo, kế thừa ảo, ngoại lệ, RTTI, chuyển đổi, con trỏ hàm và phương thức; tối ưu hóa, sao chép tách (RVO, NRVO), kích thước trên các nền tảng khác nhau, định nghĩa trình biên dịch và môi trường, __declspec, khóa trình biên dịch, tối ưu hóa cơ sở trống, liên kết tĩnh và động, xử lý, biên dịch phân tán, tiêu đề được biên dịch trước, đơn vị biên dịch đơn, (nghiêm ngặt) răng cưa / hạn chế, nội tuyến / _forceinline, dễ bay hơi, đánh giá nhanh các hàm toán học thông qua bithacks, trình liên kết & trình tải của Levine

Lập trình ứng dụng, C # / F #, Schildt / Troelsen / Richter, chung, năng suất, linq / plinq, phản chiếu, AST, WCF, WinForms / WPF / Silverlight, AOP, khung ghi nhật ký, lắp ráp .NET, Scala, Horstmann / Oderski, đối sánh mẫu, macro / quasiquotes

Lập trình chức năng, Haskell / Ocaml / Scheme / Alice hoặc Oz, SICP / TaPL / YAHT / Cấu trúc dữ liệu chức năng thuần túy / Trường Harrison, HOF (bản đồ / nếp gấp / bộ lọc), hệ thống kiểu Hindley-Milner, monads, typeclasses, ADT, các loại phụ thuộc , lười biếng / hăng hái, lập trình logic (Prolog hoặc Mercury), lập trình đồng thời (Erlang hoặc Oz)

Ngôn ngữ lập trình web và kịch bản, Khóa học chứng chỉ Flanagan / Zend PHP5 + Hướng dẫn học, Apache / nginx, CGI / FastCGI, PHP / Zend Framework / ReactPHP / Zend Engine / Doctrine hoặc Propel / CodeIgniter hoặc Symphony hoặc Yii, Python / Django / Twisted, Ruby / RoR, ASP.NET MV *, JavaScript / jQuery / React / Google Closure / ExtJS / node.js, OOP trong JavaScript, HTML5, CSS3 / bố cục bảng và khối, RSS, canvas / WebGL, Ajax / WebSockets, câu hỏi bảo mật (XSS, SQL injection, CSRF), tải trọng cao, sự cố C10k, SWIG, CDN, Shadow DOM, xếp hàng trình duyệt, đặt giá thầu / giao dịch thời gian thực, phát hiện bất thường, kiến ​​trúc ứng dụng trang đơn, thiết bị thu thập thông tin web, biểu đồ web / xã hội đi bộ ngẫu nhiên, asm .js và biên dịch sang js, v8 / spidermonkey internals, PaaS / IaaS, SPDY

CƠ SỞ DỮ LIỆU

Cơ sở dữ liệu / Hệ thống phân tán, Gruber / Date, ANSI SQL, T-SQL, ODBC, MySQL / PostgreSQL / MS SQL / BDB / SQLite / Sphinx, Thủ tục được lưu trữ, Trình kích hoạt, Codd Algebra / A, Hướng dẫn D, Biểu mẫu thông thường, Tối ưu hóa và truy vấn thực thi, cấu trúc dữ liệu chỉ mục, giao dịch và ACID, định lý CAP của Brewer, DB đồ thị, lưu trữ tài liệu, lưu trữ cột rộng, lưu trữ khóa-giá trị, lý thuyết hệ thống phân tán, CRDT, vấn đề phân chia mạng, giao thức đồng thuận, lý thuyết sharding / sao chép, ORM (C ++ ODB), ERD, OLAP, web ngữ nghĩa, triplestore, RDF / Turtle, SPARQL, OWL, Bản thể học tích hợp ngữ nghĩa, trình lý luận, DBpedia, bảng lớn / hbase vs. dynamicodb / cassandra / riak, 2 / 3PC, mập mạp / người giữ vườn thú, bầu cử lãnh đạo (paxos / bè), hdfs / gfs / glusterfs, giải mã trùng lặp, phát hiện nhân quả (đồng hồ vectơ / tem), đại biểu R / W, cân bằng tải, thiết bị chỉ mục công cụ tìm kiếm, nguồn cung ứng sự kiện, CRDT, thiết kế giao thức và các nguyên tắc truyền thông, về mặt tiến hóa, khả năng mở rộng, độ tin cậy, thiết kế API

Hệ điều hành

Hệ điều hành, Silberschatz / Richter / Solomon-Russinovich / R obabchevsky / Vakhalia / Stevens / Tanenbaum / Lov e / Linux Kernel Internals, trình quản lý bộ nhớ, trình quản lý heap và thiết bị của nó (LAL / LFH / slab), trình quản lý thiết bị, trình quản lý quy trình, ngữ cảnh chuyển đổi, chế độ thực và được bảo vệ, tệp thực thi (PE / ELF / Mach), đối tượng hạt nhân, cơ chế gỡ lỗi (strace / ptrace / dtrace / pydbg, API gỡ lỗi) và minidumps, bash, ngăn xếp mạng và máy chủ hiệu suất cao, netgraph, CR0, IPC , hệ thống con cửa sổ, hệ thống bảo mật: ACE / ACL và quyền truy cập, công nghệ ảo hóa, RTOS (QNX), lập trình trình điều khiển, IRQL, IRP, hệ thống tệp, BigTable, NDIS / miniport / FS trình điều khiển / trình điều khiển bộ lọc, Mm-, Io-, Các chức năng Ldr, DKOM và rootkit, GDT / IDT / SDT, Windows / Linux / BSD kernel, POSIX, TRIM

Định dạng, XML / XSLT / XPath / XMLStarlet / DOM / SAX, RTF / ODF, JSON / BSON / bencode, YAML, JPEG / PNG / WebP, AVI / MPEG / RIFF / WAV / MP3 / OGG / WebM, SVG, Unicode, mã hóa byte đơn / UTF-8 / UTF-16 / UCS-2 / UTF-32, độ dài chuỗi Unicode và các vấn đề so sánh, base64, markdown

Mô hình dựa trên thành phần, Rogerson / Tavares, COM / OLE / ActiveX / COM + / DCOM RPC, ATL, Căn hộ, Monikers, MIDL, XPCOM, CORBA, TAO, D-Bus

Mạng, Stevens, mô hình OSI / mô hình Internet, Ethernet, TCP / IP, cửa sổ TCP, thuật toán Nagle, ổ cắm, bộ đệm giao thức / Thrift / Avro / ASN.1, AMQP, ICMP, định tuyến / BGP / OSPF, ARP, tấn công Mitnick, syn lũ, HTTP / FTP, P2P / DHT, DHCP, SMB / NBNS, IRC / XMPP, POP3 / SMTP / ESMTP / IMAP, DNS, WiFi / WiMax / GSM / CDMA / EDGE / Bluetooth / GPS, ACE, Wireshark

PHẦN CỨNG

Phần cứng, Horowitz Hill / Titze-Schenk, điện tử bán dẫn / spintronics / quang tử, bóng bán dẫn, bộ kích hoạt, mạch điện, vi mã, công nghệ bộ xử lý, tổng hợp logic, phân tích thời gian tĩnh, FPGA, Verilog / VHDL / SystemC, SISAL, Arduino, bộ nhớ thiết bị (ROM → EEPROM, RAM, SSD, HDD, DVD), phân loại RISC / CISC, Flynn "s (ID), phương pháp tiếp cận Princeton và Harvard, kiến ​​trúc bộ xử lý, kiến ​​trúc x86, VID / PID

Bộ xử lý, pipelining, siêu phân luồng, thuật toán Tomasulo, thực thi suy đoán, dự đoán nhánh tĩnh / động, tìm nạp trước, nhiều bộ đệm kết hợp, dòng bộ đệm / bộ nhớ cache bỏ lỡ, chu kỳ đồng hồ, vòng bảo vệ, bộ nhớ trong hệ thống đa xử lý (SMP / NUMA), bộ nhớ định thời , hướng dẫn sử dụng tối ưu hóa intel, bộ đếm hiệu suất
___________________________________

Chà, ấn tượng đến mức nào? Tôi tự hỏi liệu có ít nhất MỘT NGƯỜI trên thế giới thực sự biết tất cả những điều này không?