졸업 후 큰 공장에서 제안을 받고 싶습니까? 이러한 컴퓨터 지식 시스템을 완전히 소유해야합니다!


저자 | 북쪽 프로그래밍 가이드

제작 | 프로그래밍 가이드 (ID : cs_dev)

헤드 사진 | Visual China에서 CSDN 다운로드

머리말

왜 갑자기이 주제에 대해 쓰고 싶습니까?

최근 많은 새로운 독자들이 백그라운드에서 '대학에서 Java 나 C ++를 공부하면 어떤 직업을 찾는 것이 더 좋은지? 프론트 엔드 나 백엔드를 배우는 것이 더 낫습니까? Vue 나 React를 배워야합니까? . .

당시의 모습을 본 것처럼 새 컴퓨터 공학을 전공 한 신입생으로서 별도의 글을 쓰고 이야기를 해야겠다는 생각이 들었고, 대학 4 년제 컴퓨터 공학 학생들이 배워야 할 것이 무엇인지 핵심 포인트라고 생각합니다.

같은 대학 4 년 동안 졸업 후 일부 학생들이 수확기를 제공 할 수있는 이유 모든 종류의 SP와 SSP는 부드럽습니다. 일부 학생들은 학교에서 많은 웹 사이트를 작성했습니다. 그들은 많은 프로젝트 경험을 가지고 있지만 하나를 찾았습니다. 일이 어렵습니다.

후자가 진지하게 공부하지 않았다고 말할 수 없으며 아마도 노력의 방향이 잘못되었을 것입니다.

말할 것도없이 주제로 바로 가자.

본문

인간 지식의 경계는 계속해서 확장되고 있습니다. 말 그대로 배움은 끝이 없습니다. 이것은 컴퓨터 분야에도 적용됩니다. 컴퓨터 자체는 자연 과학이 아니라 인공 과학입니다.

매년, 심지어 매달 새로운 프로그래밍 프레임 워크가 지속적으로 출시되고 있으며, 대머리를 배운 후에는 학습을 마칠 수 없으며 하나씩 배울 필요가 없습니다.

그리고 많은 1 차 및 2 차 제조업체가 서비스 검색, RPC, KV, DB, 메시지 대기열, 로그, 모니터링 등과 같은 자체 내부 작업을 사용한다는 것을 알게 될 것입니다.

따라서 이러한 대기업에 채용 할 때 특정 틀을 배우지 않았기 때문에 매달리지 않을 것이지만, 어쨌든 많은 것을 다시 배워야합니다.

그들은 당신의 기본 지식, 문제 해결 경험 및 더 다재다능한 똑똑함에 더 많은 관심을 기울일 것입니다.

대신 일부 소규모 회사에서는 Spring, Vue, Redis ... 이러한 프레임 워크 또는 구성 요소를 알아야 할 수 있습니다.

Tencent JD

알리 JD

모 아웃소싱 JD

위는 텐센트, 알리바바, 아웃소싱 회사의 채용 JD (직무 설명)인데, 당연히 텐센트 알리바바는 탄탄한 기본 프로그래밍 기술과 빠른 학습 능력에 관심이있어 육성 가능성이 있음을 의미합니다.

아웃소싱 회사는 xx 데이터베이스, Spring 등을 알아야합니다. 어느 것이 더 나은지 평가하지 말고 BAT에 가고 싶다면 적어도 JD에 대한 능력을 향상시키는 지름길입니까?

여기서는 컴퓨터 프로그래밍에 대한 지식을 크게 세 부분으로 나눕니다.

  • 기본 지식

  • 도메인 별 지식

  • 프레임 워크 및 개발 기술

기본 지식은 데이터 구조, 알고리즘 및 운영 체제와 같이 모든 방향에 종사하는 소프트웨어 엔지니어가 마스터해야하는 소프트웨어 엔지니어를 말합니다.

도메인 별 지식은 특정 세분화 방향에 참여할 때 습득해야하는 지식입니다. 예를 들어 게임 엔진이되기 위해서는 그래픽을 마스터해야합니다. 프론트 엔드가 되려면 브라우저 렌더링 원칙과 세 가지 프론트 엔드를 마스터해야합니다. 알고리즘 엔지니어는 더 많은 수학적 지식이 필요합니다. .

결국 컴퓨터에는 많은 종류가 있고 공부할 세분화 방향을 선택해야하는데, 모든 것을 배우면 아무것도 잘하지 못할 것입니다.

기본 지식

이제 큰 환경은 상대적으로 성급합니다. 기본에 마음을두고 Python을 직접 배우고, 기계 학습에 참여하고, 플래시 게임을 작성하고, 쇼핑몰이되는 것을 좋아하는 사람은 거의 없습니다.

직업을 찾을 때면 항상 인터뷰를 읽고 빠른 결과를 요약하고 싶습니다.

그러나 훌륭한 컴퓨터 과학 학생으로서 다양한 프로그래밍 프레임 워크 (프레임 워크 빌드 제외)에 어떻게 참여할 수 있으며 SpringBoot 또는 SSH를 배울 지 여부는?

그는 알고리즘과 기본 과목에 시간을 보내는 것을 좋아하지 않습니까? 공리주의 측면에서 보면 보상이 더 커질 것입니다.

또한 컴퓨터 분야에서는 많은 기초 이론이 그다지 발달하지 않았고 우리의 노력으로 핵심 지식을 습득 할 수 있습니다.

1. 수학

우선, 여기에 나열된 수학은 고급스러워 보이지 않는 것이 아니라 수학 손실로 고통받습니다.

만약 당신이 독학을하고 프로그래머가되기 위해 직업을 바꾼다면, 나는 확실히 수학을 추천하지 않을 것입니다. 직업을 바꿀 가능성이 높은 것은 자바, 프론트 엔드 등을 배우는 것이기 때문입니다. 기본적으로 수학에 대한 요구 사항은 없습니다.

하지만이 글은 주로 대학 재학중인 학생들을 대상으로하며,이 부분에서는 알고리즘 (CV, NLP 등), 게임 엔진, 정보 보안 코딩 등을 할 수 있습니다.

이러한 방향은 수학에 대한 요구 사항이 더 높을 것이며 컴퓨터 과학 분야에서는 선 생성, 확률 이론, 통계와 같은 수학적 분야가 상대적으로 중요하며 컴퓨터는 본질적으로 이산 적입니다.

예를 들어, 기계 학습이나 데이터 마이닝에서 선형 대수는 데이터의 차원을 줄이기 위해 자주 사용되며, 많은 문제가 결국 선형 방정식을 푸는 것으로 변환 될 수 있습니다.

따라서 앞으로 이러한 방향으로 가고 싶을 때 수학에 갇히지 않으려면 1 학년과 2 학년 때 수학 시간에 수학을 공부해야합니다.

책을 사용하면 덜 미워할 것입니다. 쓸모 없어서 지금 배우기가 쉽지 않다고 생각하지 말고 필요할 때 후회하게 될 것입니다. (무지의 침묵의 눈물 ┭┮﹏┭┮

뭐? 앞으로 개발 방향을 확실히 할 것이라고 말씀 하셨나요?

조금 늦게 수학의 우선 순위를 둘 수 있다는 것은 사실이지만, 실제로 많이 사용되지는 않지만, 수학 시간에 항상주의 깊게 들어야합니다. 높은 점수를 얻는 것은 해롭지 않습니다. 언제 다시 알고리즘 군대에 합류하고 싶습니까?

2. C 언어

여기에 기본 지식이 있습니다. 왜 프로그래밍 언어를 별도로 나열해야합니까?

제 생각에는 컴퓨터 시스템을 이해하는 데 더 적합한 C 언어가 없기 때문입니다.

나중에 언급 할 운영 체제와 아키텍처는 C 언어를 이해하거나 연습하는 데 매우 적합합니다.

더구나 C 언어 자체는 언어 적 특성이 거의 없지만 잘 배우기가 쉽지 않은데 많은 사람들이 C 언어를 어렵게 생각하는데 어려움은 무엇입니까? 1 학년 때 느꼈던 감정을 회상합니다.

  • 간단한 표준 라이브러리, 사용 가능한 데이터 구조 및 알고리즘이 거의 없음, 모든 것은 스스로 수행해야합니다.

  • 포인터는 이해하고 사용하기 어렵습니다.

  • C 언어를 잘 사용하기 위해 어셈블리, 링크,로드, 메모리 등을 이해해야합니다.

불행히도 이러한 것들은 컴퓨터 시스템 지식의 일부이므로 컴퓨터 시스템 지식을 배우는 가장 효율적인 방법으로 C 언어를 사용합니다.

다른 사람들에게 메모리를 설명하기 위해 Java 또는 Python을 사용하는 것은 상상하기가 정말 어렵습니다. 이러한 언어는 C보다 더 추상적이기 때문에 컴퓨터 시스템에서 멀리 떨어져 있음을 의미합니다.

TIOBE 프로그래밍 언어 목록에서 C 언어는 거의 항상 상위 3 위를 차지하고 있으며 그 위치는 당연히 의심 할 여지가 없습니다.

TIOBE-2020 랭킹

그리고 개발에 사용하는 거의 많은 것들이 C 언어, Linux, Nginx, Redis, MySQL, Git으로 작성되었습니다. 아마도 이러한 오픈 소스 소프트웨어의 원칙을 살펴보고 소스 코드를 읽고 싶을 것입니다. 그렇다면 C 언어는 필수 스위스 군용 칼이기도합니다.

컴퓨터의 기본 실행 원리를 이해할 수있는 C 언어에 대한 심층 연구는 프로그램의 작동 메커니즘을 이해하는 데 탁월한 언어이며 타의 추종을 불허합니다.

여기에서 C 언어의 가장 고전적인 요약을 인용해야합니다.

C 언어보다 낮은 언어는 컴퓨터 시스템을 완전히 추상화하기에 충분하지 않습니다 .C보다 높은 언어는 C에서 구현할 수 있습니다.

이것은 정말로 매우 높고 적절한 평가입니다!

따라서 컴퓨터 과학 수업의 경우 프런트 엔드 또는 백 엔드, 알고리즘 또는 개발을 수행하든 상관없이 열심히 공부하기 위해 C 언어를 권장합니다. 이것은 방향과 무관 한 언어이며 기초입니다!

3. 운영 체제

우리가 프로그래밍하는 IDE와 우리가 작성한 프로그램은 모두 운영 체제에서 실행해야합니다. 운영 체제가 컴퓨터 소프트웨어의 초석이라고해도 과언이 아닙니다.

프로그램이 실행될 때 운영 체제의 프로세스 관리를 포함하는 프로세스를 생성해야합니다. 프로그램을 작성하려면 변수를 정의하고 데이터를 저장해야합니다. 이는 메모리 관리에 해당하는 메모리를 포함합니다. 때로는 분리 할 수없는 파일을 읽고 써야합니다. 파일 시스템을 다루기 위해 개방됩니다. 동시 실행 중에 프로그램이 혼동되지 않도록 잠금, 조건 변수 및 중요 섹션을 사용하는 방법을 배워야합니다.

시스템 호출은 파일 읽기 및 쓰기, 메모리 할당과 분리 할 수 ​​없습니다.

그리고 실제로 프로젝트를 시작하면 많은 문제가 운영 체제와 밀접한 관련이 있다는 것을 알게 될 것입니다. 운영 체제를 이해하지 못하면 문제의 원인을 분석 할 수도 없습니다.

예를 들어, 얼마 전 코 루틴 (libco)을 기반으로 한 프레임 워크에 다중 스레드 잠금을 사용하여 동기식 상호 배제 우발적 교착 상태를 수행했으며 나중에 분석에서 그 이유를 발견했습니다.

코 루틴은 애플리케이션 계층에서 구현되기 때문에 스레드의 여러 코 루틴은 운영 체제에서 인식 할 수 없습니다.

코 루틴 모델

그런 다음 A라는 프로토콜이 잠기고 네트워크 IO 요청을 시작하면 이때 다른 프로토콜 B로 전환되고 프로토콜 B는 잠금을 다시 요청합니다.

이때 운영 체제는 잠금이 이미 켜져 있다고 생각하므로 코 루틴 B에 해당하는 스레드를 대기 큐에 일시 중단합니다. 이렇게하면 코 루틴 A가 실행되지 않고 잠금이 해제되지 않아 교착 상태가됩니다.

해결 방법도 매우 간단하여 잠금을 재진입 잠금으로 설정하는 것입니다. 재진입은 동일한 스레드가 중단을 일으키지 않고 동일한 잠금을 여러 번 요청하는 것을 의미합니다. 이런 식으로 코 루틴 B가 다시 잠금을 요청하면 운영 체제는 코 루틴 B가 이미 잠금을 보유하고있는 스레드가 직접 반환되어 실행을 계속한다고 생각합니다.

간단히 말해서, 우리는 항상 운영 체제와 상호 작용하는 프로그램을 작성합니다. 잘 배우지 못할 이유가 없습니다.

4. 컴파일 원리

컴파일의 원리는 우리가 일반적으로 접하는 최소한의 것입니다. 새로운 프로그래밍 언어를 만들고 컴파일의 원리를 배울 필요가 없다고 느낄 수 있습니다.

컴파일 원리를 배우는 용도는 무엇입니까?

더 높은 관점에서 이러한 프로그래밍 언어를 살펴보고 더 이상 피상적 인 문법을 볼 수 없지만 문법이면의 구현을 생각할 것입니다.

이 느낌은 매우 철저합니다. 운영 체제와 아키텍처를 이해하는 것처럼 마우스를 두 번 클릭하면 프로그램이 실행되는 방식을 이해할 수 있습니다. 모든 세부 사항과 철저 함을 마스터하는 느낌은 정말 훌륭합니다. 믿지 마세요. 시도해보세요.

영어로 말하십시오!

컴파일 원리를 배운 후 무엇을 할 수 있습니까?

유한 상태 머신 학습을 마치면 매우 멋 졌던 정규 표현식이 DFA 및 NFA로 구현 될 수있는 것처럼 보입니다. 상태 머신의 아이디어는 프로그래밍의 여러 곳에서 사용될 수 있습니다.

예를 들어, HTTP 프로토콜을 파싱하기 위해 상태 머신에 대한 아이디어를 배우지 못했다면 if / else에서 한 줄씩 파싱을 할 수 있습니다. 여기서 가장 문제가되는 부분은 if / else가 모든 HTTP 헤더 필드를 미리 수신해야하고 판단해야한다는 것입니다. HTTP는 TCP 기반이고 TCP는 스트리밍 중이므로 여러 문자 그룹으로 수신 할 가능성이 높으며, 이때 쓰면 읽기 힘들다.

상태 머신으로 작성된 코드는 매우 우아합니다. 상태 전이는 규칙에 의해 주도되며 한 문자를받은 후 판단하는 것이 매우 편리합니다.

계속해서 문법 분석을 공부 한 후에는 재귀 하강 분석매우 중요한 아이디어 를 습득하게 될 것 입니다. 재귀 하강을 사용하여 4 개의 산술 계산기를 빠르게 구현할 수 있습니다.

재귀를 사용하지 않는 경우 먼저 중위 식을 접미사로 변환 한 다음 평가해야 할 수 있습니다. 이것은 신입생 데이터 구조 클래스에서 작성되었습니다. 당시에는 스택으로 작성되었는데 약간 문제가있었습니다. 나중에 컴파일의 원리를 배운 후, 저는 재귀 하강을 사용하여 수십 줄의 코드를 반복해서 다시 작성했습니다.

실제 개발에 많이 사용되는 또 다른 유형의 시나리오가 있습니다. 예를 들어 Taobao, Jingdong과 같은 전자 상거래 회사는 전체 축소, 직접 축소, 교차 상점 등과 같은 많은 마케팅 규칙을 가지고 있습니다. 이러한 규칙을 작성하는 것은 불가능합니다. 코드에서.

어떻게 된 거죠?

일반적으로 구성 시스템을 구현하고 이러한 규칙을 표현하기 위해 DSL (도메인 특정 언어)을 설계하고 규칙을 시스템에 직접 구성합니다. 이것은 수정이 매우 편리 할 수 ​​있습니다. 그러면 코드에서 DSL이 정의한 규칙을 구문 분석하는 방법은 무엇입니까? 이를 위해서는 DSL에 대한 구문 파서를 작성해야하며 여기서 구문 분석 방법이 사용됩니다.

DSL (Domain Specific Language)은 특정 분야에서 사용되는 프로그래밍 언어입니다. 이 특정 필드는 C, C ++, Python의 공통 언어에 상대적입니다. 공통 언어는 다양한 분야에서 사용될 수 있습니다. 우리가 익숙한 대부분의 프로그래밍 언어는 공통 언어이며 모두 튜링 완성입니다. 의.

우리가 일반적으로 사용하는 JSON, SQL 및 HTML은 모두 일종의 DSL입니다. 재귀 하강을 사용하여 전자 상거래 웹 사이트를 작성하는 것보다 더 가치있는 JSON, XML 파서를 작성할 수도 있습니다.

계속 학습하면서 추상 구문 트리 AST가 생성되는 방법,이를 중간 코드로 변환하는 방법, 중간 코드를 최적화하는 방법, 마지막으로 기계 명령어를 생성하는 방법을 배웁니다.

레지스터 할당에서 탐욕스러운 알고리즘을 적용하는 것을 볼 수 있으며 그래프 이론의 도달 가능성 분석이 어떻게 데드 코드 제거를 달성하는지 볼 수 있습니다.

IDE의 녹색 컴파일 버튼은 더 이상 당신에게 흑 마법이 아닙니다.

한 번의 클릭으로 실행 가능한 프로그램을 생성 할 수있는 이유는 무엇입니까?

당신이 쓴 영어 문자가 어떻게 이진 명령으로 바뀌 었습니까?

편집의 원리를 배우고 나면이 모든 것이 문제가되지 않습니다. 엄마는 더 이상 공부에 대해 걱정할 필요가 없습니다 ~

물론 GCC, Clang과 같은 컴파일러를 완성하는 데 어려움이 너무 높고 너무 높습니다. 우리가 컴파일 원칙을 배우는 목적은 그러한 바퀴를 만드는 것이 아니라 프로그래밍 언어를 더 잘 이해하고 사용하는 것입니다.

5. 시스템 구조 및 구성 원리

위의 내용은 모두 소프트웨어 수준에 관한 것이고 아키텍처는 컴퓨터 작동 방식에 관한 것입니다. 일반적인 저장 프로그램 컴퓨터의 작동 방식을 이해하게 될 것입니다.

난타 대학의 한 교사가 "우리는 컴퓨터 사용법을 배우는 것이 아니라 컴퓨터를 만드는 법을 배우는 것입니다."라고 말한 것을 기억합니다. 컴퓨터를 만드는 것은 약간 과장되었지만 적어도 컴퓨터 구현의 원리를 이해하고 코드가 CPU에 의해 어떻게 실행되는지 이해해야합니다. ? 그렇지 않으면 매우 혼란 스러울 것입니다. 한 무리의 영문자가 CPU와 같은 회로에서 실행될 수 있음이 분명합니다. 저는 1 학년 때 C 언어에 당혹 스러웠고 구성과 디지털 논리의 원리를 배울 때까지있었습니다.

컴퓨터에있는 모든 것이 0, 1, 0, 1은 하이 레벨과 로우 레벨로 표현된다고 말하고, 이진 수치 연산은 AND, OR, NOT과 같은 논리 게이트 회로를 통해 표현한 다음 이러한 간단한 회로를 통합합니다. , ALU와 같은 컴퓨팅 파워를 가진 프로세서를 형성합니다.

CPU가 어떻게 명령어를 실행하는지 볼 수 있으며, CPU는 메모리 나 캐시에서 명령어를 가져 와서 명령어 레지스터에 넣고 명령어를 디코딩합니다. 디코딩은 명령어의 인코딩 규칙에 따라 명령어를 일련의 마이크로 연산 및 피연산자로 분할하는 것입니다. 그런 다음 다양한 장비 제어 지침을 발행하여 미세 작업을 수행하십시오. 이것으로 명령 실행이 완료됩니다.

컴파일의 원리를 배우면 작성된 영어 코드가 어떻게 바이너리 명령어로 변하는 지 이해할 수 있다고 말하고 운영 체제를 배운 후에는 바이너리 프로그램이 어떻게 서로 연결되어 있는지, 운영 체제에서 바이너리 프로그램이 어떻게로드되고 실행되는지 이해할 수 있습니다. 구성 원칙은 바이너리 명령어가 CPU를 제어하는 ​​방법을 알려줍니다. 우리의 운영 체제는 본질적으로 바이너리 프로그램입니다.

컴퓨터 스토리지 계층 구조와 다중 레벨 캐시를 이해하면 데이터 액세스 방법을 최적화하여 더 빠른 프로그램을 작성할 수 있습니다.

기본 아키텍처가 C와 같은 언어로 스택 프레임 및 매개 변수 전달을 지원하는 방법을 배우게됩니다. 매개 변수는 다른 함수에 어떻게 전달됩니까? 함수의 반환 값을 얻는 방법은 무엇입니까?

이것이 코드 작성을위한 구성 원리 학습의 의미입니다.

이것을 배우는 요점은 무엇입니까?

작성된 코드가 어떻게 바이너리 명령어가되고, 다양한 게이트 회로를 제어하는지, 그리고 마침내 화면에서 다채로운 프로그램이되는 방법을 완전히 볼 수 있습니다 (물론 디스플레이의 원리를 배워야 할 수도 있습니다). 종종 "기본"및 "원칙"이라고합니다.

컴퓨터 아키텍처의 많은 아이디어는 현대 소프트웨어 개발에 널리 사용될 수 있습니다. 예를 들어 CPU의 다중 레벨 캐시 아이디어는 캐시 교체 전략 등을 포함하여 서버 개발에서 동시성을 향상시키는 데 사용하는 캐싱 기술입니다.

컴퓨터가 더 이상 블랙 박스가 아니라면 작성된 코드에서 실행까지 모든 단계를 이해하고 이것이 미래의 핵심 경쟁력이 될 것입니다. 전공을 졸업 한 경우 Java, Redis, Mysql, Spring 만 사용해서는 안됩니다. 다양한 웹 사이트를 작성합니다.

중간에 진로를 바꾸거나 교육 과정을 이탈하는 독자가 있다면이 기본 과정을 보충 할 시간을 주시면 더욱더 꾸준히 프로그래밍의 길로 나아갈 수있을 것입니다.

6. 데이터 구조 및 알고리즘

알고리즘을 끝에 넣는 것이 왜 중요하지 않습니까? 반대로 너무 중요하므로 피날레가되게하십시오.

대학에서 후회하는 것이 무엇인지 물어보고 싶다면? ACM을하기 위해 1 학년 때부터 알고리즘을 배우지 않았기 때문일 것입니다.

아직 1 학년과 2 학년 인 학생들은 기회를 포착하지 못하고 나중에 후회하기를 기다리지 않습니다. 물론 ACM 없이는 데이터 구조와 알고리즘을 잘 배울 수 있습니다.

모든 컴퓨터 분야에서 데이터 구조와 알고리즘을 볼 수 있습니다. 예를 들어, 컴파일 원칙에서 레지스터 할당은 탐욕을 사용하고 데드 코드 감지 및 제거는 그래프 이론에서 도달 할 수없는 지식을 사용합니다. 운영 체제 프로세스, 스레드 스케줄링 회의 다중 레벨 대기열 및 스케줄링 알고리즘이 사용됩니다. 구성 원칙에서 Cache를 대체하면 LRU 및 FIFO와 같은 알고리즘이 사용됩니다. 필요한 데이터베이스의 개발은 B + 트리 및 LSM과 같은 데이터 구조 및 검색 알고리즘과 분리 될 수 없습니다.

많은 경우 우리가 필요로하는 알고리즘은 프로그래밍 언어의 기본 라이브러리에 캡슐화되어 있으므로 많은 학생들이 알고리즘이 우리와 너무 멀다고 느끼지만 그렇지 않습니다.

알고리즘을 배우지 않으면 Map (빨강-검정 트리로 구현 됨)을 사용하는시기와 HashMap을 사용해야하는시기조차 알 수 없습니다.

따라서 학습 알고리즘은 응용 시나리오에 따라 가장 적합한 데이터 구조를 선택하는 데 도움이됩니다.

알고리즘은 일상적인 개발에서도 분리 할 수 ​​없습니다. 예를 들어, Xiaobei의 최근 작업에 포함 된 특정 중첩 TLV (Tag-Length-Value) 구조 코드를 분석하려면 재귀 및 다중 분기 트리와 같은 지식이 필요합니다. 알고리즘을 배우지 않으면 프로그램에서 if / else를 많이 볼 수 있습니다. . .

알고리즘을 모르는 엔지니어는 확실히 좋은 엔지니어가 아니라고 할 수 있습니다.

7. 컴퓨팅 네트워크, 데이터베이스 등에 대해 이야기하지 않겠습니까?

많은 사람들이 컴퓨터 네트워크와 데이터베이스 원리를 컴퓨터 기초로 분류하는 것을 좋아하는데, 물론 저는 동의합니다. 왜냐하면 완전한 지식 구조를 가진 컴퓨터 과학 수업의 학생은이 지식을 이해해야하기 때문입니다.

하지만 개인적으로 컴퓨터 네트워크와 데이터베이스는 운영 체제, 컴파일 원칙 및 구성 원칙에 기반한 애플리케이션 레이어 소프트웨어에 지나지 않는다고 생각합니다.

데이터베이스 란? 데이터베이스가 존재하기 전에는 파일을 사용하여 데이터를 저장했지만 검색, 수정 등이 불편했습니다. 데이터베이스는이 프로세스의 효율성을 향상 시켰습니다.

네트워크는 무엇을합니까? 네트워크는 동일한 컴퓨터에 있지 않은 프로그램이 서로 통신 할 수 있도록하는 것입니다. 이는 본질적으로 프로세스 간 통신 수단입니다.

독립형 산업용 소프트웨어 만 개발하는 경우 네트워크를 배울 필요조차 없습니다. 현재 대부분의 프로그래머가 인터넷 회사에서 일하기 때문에 프런트 엔드와 백 엔드에 관계없이 HTTP와 같은 네트워크 프로토콜을 처리하는 것과 분리 할 수 ​​없습니다.

다시 말하면 네트워크와 데이터베이스가 중요하지 않다는 것이 아니라 운영 체제에 구축 된 소프트웨어에 속하며 기초에 포함되지 않는다고 생각합니다.

도메인 지식

나는 여러 분야에 대해 잘 모르기 때문에 이것에 대해 너무 많이 말하지 않습니다. 조금만 언급하면 ​​댓글에 불과합니다.

Tencent 또는 NetEase로 이동하여 게임 엔진 개발을하려면 그래픽이 피할 수없는 지식이어야합니다. 또한 렌더링 파이프 라인, 셰이더, 물리, 조명 등을 배워야합니다.

분산 스토리지를 수행하기 위해 PingCap과 같은 회사에 가고 싶다면 분산 이론 지식은 CAP 정리, Paxos 알고리즘, Raft 알고리즘, ZAB 프로토콜 등을 포함하여 얻을 수없는 게이트웨이 여야합니다.

데이터베이스를 작성하려면 디스크, 인덱스 구현, SQL 구문 분석 (컴파일 원칙), 트랜잭션, MVCC를 사용하여 읽기-쓰기 충돌을 해결하는 방법 등과 같은 많은 것을 이해해야하며 많은 프로그래밍 언어 수준이 필요합니다. 잠금, 세마포어 및 동시 프로그래밍 기술과 같은 몇 가지 사항은 데이터베이스 구축이 더럽고 피곤한 작업이라고 말해야합니다.

또한 분산 데이터베이스를 구축하려면 데이터 샤딩에 대한 지식, 쿼리 작업을 수행하는 방법, 중앙 집중식으로 수행할지, 논리를 각 노드로 푸시할지 여부, 분산 트랜잭션을 구현하는 방법 등을 배워야 할 수 있습니다.

큰 공장 CRUD에 가고 싶다고 했습니까? 잘못된 건 없어, 오래된 철!

그런 다음 컴파일 된 언어 (C / C ++, Java, Go)에 익숙하고 C ++와 같은 언어의 기본 원칙을 이해해야합니다. STL과 객체 모델을 살펴보아야합니다. 가상 함수 테이블과 스마트 포인터가 무엇인지 모릅니다. C ++를 작성하기 위해 Tencent에 가고 싶습니까? Java의 경우 JVM, 가비지 수집 알고리즘을 기억해야합니다. ConcurrentHashMap을 보지 않습니까?

CRUD의 대상은 데이터베이스입니다. 맞죠? 그러면 데이터베이스를 잘 사용하는 방법을 배울 수 없습니다. 사용자는 HTTP를 통해 서비스에 액세스합니다. HTTP를 이해해야합니까? 그건 그렇고, TCP 3 자 핸드 셰이크와 네 손을 흔드는 것을 보지 마세요 컴퓨터를 배우고 있다고 말하는 것이 부끄럽습니까?

사용자는 여기에 돈과 정보를 넣으므로 사용자 데이터의 보안을 보장해야합니다. XSS, SQL 삽입, CSRF와 같은 일반적인 웹 공격 방법을 이해해야합니까? HTTPS, RSA, 서명 및 디지털 인증서와 같은 보안 방법을 알고 있어야합니다.

Double Eleven에는 트래픽이 너무 많고 사장님은 여전히이를 견뎌내야합니다. 그러면 캐시, 비동기식, 메시지 대기열, NoSQL을 이해해야합니다. 수천만 QPS를위한 필수 요소입니다. 맞죠?

구경하다! CRUD를 잘하는 것은 그렇게 쉽지 않습니다.

(위의 문단은 백엔드 학생들이 침을 뱉거나 조롱하는 것이 아니라 배우고 싶어하는 지식을 쓰는 또 다른 방법 일 뿐이며 순수한 오락입니다.

기술

이는 VSCode 및 Jetbrains와 같은 IDE와 문서 작성을위한 Markdown 및 Git과 같은 버전 관리 도구를 포함하여 많은 것입니다. SSH 원격 로그인, 포트 포워딩, Ngrok 인트라넷 침투 등 개발 효율성을 높이기위한 이러한 도구는 모두 기술입니다. 이에 대해 말할 것도 없습니다. 일반적으로 더 많이 배우고 축적해야합니다.

한 가지 요점 만 언급하고 가능한 한 빨리 기본 개발 컴퓨터로 Linux 및 Unix 계열 (Mac)을 사용합니다. 2 학년 때 Wang Ying의 "Working with Linux"를 읽고 SSD를 구입하여 U 디스크 셸에 넣고 부팅 디스크를 만들었습니다. 나중에 우분투를 거의 1 년 동안 사용했습니다. 숙제 등을 제출하기 위해 IE 브라우저가 필요한 경우에만 윈도우가 열립니다. (구 학교 홈페이지에 대한 불만이 있습니다!)

물론 저는 리눅스에 대한 열렬한 팬이 아닙니다. 단지 개발이 다양한 환경에서의 설치와 명령 줄 사용과 뗄래야한다고 느낍니다. 위의 유닉스 계열 시스템은 당연한 이점이 있습니다. 누가 사용하든 알 것입니다!

요약하자면

글을 다 쓴 후이 기사의 길이가 7 : 2 : 1에 가까운 "기본 : 도메인 지식 : 기술"이라는 것을 발견했습니다.

이것은 또한 내가 대학에서 공부하는 시간을 할당 할 것을 권장하는 시간의 비율이기도하는데, 적어도 50 % 이상의 시간을 기초 지식을 배우는 데 할당해야합니다. 물론 이러한 것들을 배우고 나면 공부할 관심 방향을 찾을 수 있습니다.

1 학년 또는 2 학년 때 자바 웹 및 Python 크롤러에 들어 가지 마세요. 학습 할 수는 있지만 요점이 아닙니다.

그렇다면 학습을 어떻게 테스트합니까?

컴퓨터 네트워크에서 "URL 입력에서 페이지 표시까지 어떤 일이 발생 했습니까?"라는 인터뷰 질문에 대해 들어 보셨을 것입니다.

이 질문을 다른 방식으로 표현하는 것은 "데이터 패킷이 다른 컴퓨터로 전송되는 방법"입니다.

전체 과정을 완전히 알 수 있다면 지왕에 대해 배웠을 것입니다! 이것이 인터뷰에서이 질문을 많이하는 이유입니다.

그럼 질문하자

"프로그램이 실행될 때 코드가 작성된 시점부터 무슨 일이 있었습니까?"

이 질문에 대한 답이 자세할수록 더 좋습니다. 기본적으로 명확하게 설명 할 수 있다면 컴파일 원칙, 운영 체제 및 구성 원칙을 이해하게됩니다.

이 질문은 여기에 배치되며 후속 게시물 요약도 프로그래밍 가이드에 계속주의를 기울이십시오.

아아, 그런 배려심 많은 선배가 나에게 이렇게 말했다면 Andorid 개발, 자바 웹, Python 크롤러에서 활동 한 지 반년이 넘지 않았을 것입니다. . .

다행히도 나중에 기본의 중요성을 깨닫고 어셈블리를 배우기 시작했고 C를 ​​다시 배우고 미니 OS에 참여하고 Linux 커널의 구현 원리를 살펴 보았고 마침내 머리카락을 잃었습니다. . .

마지막으로 내가 좋아하는 것을 제공하고 싶습니다.

떠 다니는 모래 위에 높은 플랫폼을 건설하지 마십시오.


更多精彩推荐
☞本周六定位上海!解析百度文心(ERNIE)如何助力快速定制企业级NLP模型
☞头发越秃程序员就越厉害?| 每日趣闻
☞独家对话谢宝友:做一款类似于 Linux 的国产操作系统  | 人物志
☞DeepFashion实现服装检测搭配
☞蓝色巨人IBM全力奔赴的混合云之旅能顺利吗?
☞区块链赋能供应链金融|应用优势与四类常见模式
点分享点点赞点在看

추천

출처blog.csdn.net/csdnsevenn/article/details/109252064