어떤 컴퓨터 과학 개념을 알아야합니까? [닫은]
컴퓨터 과학의 어떤 개념이 당신을 더 나은 프로그래머로 만들었 을까요?
제 학위는 기계 공학을 전공했기 때문에 결국 프로그래머가 되었기 때문에 기초가 조금 부족합니다. 제가 최근에 배운 몇 가지 표준 CS 개념이 있으며 특히 제가하고있는 일에 대해 훨씬 더 깊이 이해하게되었습니다.
언어 특징
- 포인터 및 재귀 (Joel에게 감사합니다!)
데이터 구조
- 링크 된 목록
- 해시 테이블
알고리즘
- 버블 정렬
분명히 목록은 현재 약간 짧기 때문에 다음과 같은 제안을 기대했습니다.
- 내가 이해해야하는 개념,
- 그것들을 적절하게 이해하기위한 모든 좋은 자료들 (위키 백과는 때때로 약간 조밀하고 학문적 일 수 있기 때문에).
Steve Yegge (이전의 Amazon, 현재는 Google)의 블로그 게시물을 살펴보십시오.
개발자가 알아야 할 가장 중요한 5 가지 개념에 대해 자세히 설명합니다.
- 기본 프로그래밍 (재귀, 파일 I / O, 형식화 된 출력, 루프 등 포함)
- 객체 지향 디자인 (디자인 패턴 등 포함). 감각적 인 OO 디자인을 제작하고 개념을 이해할 수 있어야합니다.
- 스크립팅 및 정규식.
- 데이터 구조 (목록, 집합, 해시 테이블, 트리, 그래프 등)와 Big O 표기법 및 알고리즘 복잡성.
- 비트, 바이트 및 이진수-컴퓨터 내에서 숫자가 표현되는 방식 및 조작 방법.
알고리즘 의 Big-O 표기법과 Big-O 추정을 확실히 이해해야합니다. 알고리즘의 정의, 사용 방법, 중요한 이유, Big-O 추정치가 주어진 두 알고리즘을 비교하는 방법, Big-O 추정을 구축하는 방법 간단한 알고리즘을 위해.
나는 당신이 컴퓨터 과학 과목을 찾고 있다는 것이 조금 웃기지 만 위키피디아가 너무 학문적이라고 생각합니다 : D
어쨌든, 여기에 특별한 순서는 없습니다.
- 관계형 모델 : 데이터베이스 시스템 소개
- 객체 방향 : 객체 사고
- 복잡성과 계산 이론 (튜링 머신과 오토마타를 생각해보세요) : 계산 이론 소개
- 약간의 컴파일러 디자인 : The Dragon Book , 비록 이것은 당신의 필요에 비해 너무 심도있을 수 있습니다.
- 운영 체제 개념 : 최신 운영 체제
- 사람 기술 : 친구를 사귀고 사람들에게 영향을 미치는 방법
- 팀워크 : Peopleware
- 사용자 인터페이스 디자인 : 수감자들이 망명을 운영하고 있습니다.
내 개발에 도움이 된 몇 가지 개념 (지능 및 코드) :
- Lexing, Parsing, String matching, Regex
- 메모 화
- 캡슐화 / 범위 지정 / 폐쇄
- 캐싱
- 재귀
- 반복기 / 생성기
- 함수형 프로그래밍-John Hughes의 놀라운 기사 는 "왜"에 대해 설명했습니다.
이것들은 이산 수학의 전체 영역이지만 CS를 위해서는 진지한 소개가 필요합니다.
- 행렬 / 선형 대수
- 그래프 이론
하지만 마크 제이슨 - 도미 누스 강연 및 기사는 종종 펄 해커로 보내집니다, 나는 어떤 프로그래머가 특히 자신의 명확한 발표 및 실제 코드, 혜택을 누릴 것이라고 생각 높은 주문 펄 .
요즘에는 매일 사용할 필요가 없더라도 객체 지향 프로그래밍에 대한 이해가 필수라고 말하고 싶습니다.
이것으로부터 나는 또한 가장 일반적인 패턴을 이해하는 것도 도움이 될 수 있다고 말할 것입니다.
몇 가지 좋은 CS 개념이 확인되었지만 수학에 대한 이야기는 거의 없습니다.
나는 당신이 이산 수학 을 살펴볼 것을 제안합니다 . 코드에서 조건을 작성하는 데 도움이되는 논리적 증명으로 시작하는 다양한 유용한 문제가 있습니다. 그래프 이론과 조합론은 복잡한 문제 해결 및 알고리즘 최적화에도 도움이됩니다.
우리가 수학을 공부하고있는 동안 선형 대수는 일반적으로 고급 컴퓨터 그래픽 수업의 전제 조건입니다.
프로그래머 역량 매트릭스 는이를 자세히 다루었지만 몇 가지를 강조하겠습니다.
- 데이터 구조
- B- 트리, 이항 및 피보나치 힙, AVL / 레드 블랙 트리, 스플레이 트리, 스킵 목록, 시도 등과 같은 고급 데이터 구조
- 알고리즘
- 트리, 그래프, 단순한 욕심쟁이 및 나누기 및 정복 알고리즘은이 매트릭스 수준의 관련성을 이해할 수 있습니다.
- 시스템 프로그래밍
- 전체 프로그래밍 스택, 하드웨어 (CPU + 메모리 + 캐시 + 인터럽트 + 마이크로 코드), 이진 코드, 어셈블리, 정적 및 동적 연결, 컴파일, 해석, JIT 컴파일, 가비지 수집, 힙, 스택, 메모리 주소 지정…
- 소스 코드 버전 관리
- 분산 된 VCS 시스템에 대한 지식. Bzr / Mercurial / Darcs / Git을 사용해 보았습니다.
- 빌드 자동화
- 시스템 및 설명서, 설치 프로그램을 빌드하고 릴리스 정보를 생성하고 소스 제어에서 코드에 태그를 지정하는 스크립트를 설정할 수 있습니다.
- 자동화 된 테스트
- 자동화 된 기능,로드 / 성능 및 UI 테스트를 이해하고 설정할 수 있습니다.
- 문제 분해
- 적절한 데이터 구조 및 알고리즘을 사용하고 변경 될 수있는 문제의 측면을 캡슐화하는 일반 / 객체 지향 코드를 제공합니다.
- 시스템 분해
- 여러 제품 라인 및 외부 시스템과의 통합으로 복잡한 시스템을 시각화하고 설계 할 수 있습니다. 또한 모니터링,보고, 장애 조치 등과 같은 운영 지원 시스템을 설계 할 수 있어야합니다.
깊이 우선, 호흡 우선 검색, 최단 경로 등과 같은 그래프와 일부 적용된 알고리즘이 매우 유용하다는 것을 알게되었습니다. 객체 방향도 정말 일반적인 개념입니다.
규칙 1 : 소프트웨어는 지식 캡처 입니다. 소프트웨어는 무언가를 의미합니다. 의미가 명확하지 않은 경우 사용자가하는 일을 이해하기 위해 사용자와 이야기하는 데 더 많은 시간을 할애하십시오.
알고리즘과 데이터 구조는 동일한 동전의 양면입니다. 알고리즘은 데이터 구조에 따라 다르며 데이터 구조는 알고리즘에 따라 다릅니다.
가능한 한 빨리 버블 정렬을 해제하십시오. 진지하게. 모든 최신 언어 (Java, Python 등)에는 버블 정렬보다 더 나은 정렬을 구현하는 컬렉션 클래스가 있습니다. 어떤 상황에서도 버블 정렬을 사용해야하는 상황은 전혀 없습니다. 정렬 방법을 포함하는 컬렉션 클래스를 찾아야합니다. 더 좋은 것은 정렬을 완전히 피하는 알고리즘을 찾는 것입니다.
여러 언어를 배워야합니다.
프로그래밍 언어 (자바, Python 등)
쉘 언어.
데이터베이스 언어 (SQL)
프리젠 테이션 언어 (HTML 및 CSS)
기타 데이터 표현 언어 (XML, JSON)
몇 가지 데이터 구조를 배워야합니다.
시퀀스 (목록, 튜플, 파일)
계층 적 (예 : XML 및 HTML 문서, 기본 파일 시스템)
관계형 (예 : 데이터베이스 및 하드 및 소프트 링크가 포함 된 파일 시스템)
해시 맵 및 트리 맵을 포함한 맵 (또는 인덱스 또는 연관 배열)
세트
또한 일부 알고리즘 복잡성 분석. "Big O"라고도합니다. 버블 정렬이 나쁜 이유는 퀵 정렬이 O ( n log n ) 인 O ( n ^ 2)이기 때문 입니다.
나를 위해 나는 varsity의 다음 과정에서 많은 것을 얻었습니다.
- 프로젝트 관리
- 인간 컴퓨터 상호 작용 (매니아들이 사용자 친화적 인 화면을 만드는 데 도움이 됨)
- 데이터베이스 설계 (데이터베이스 작동 방식, 트랜잭션 로그, 잠금 등 포함)
- 데이터웨어 하우징
- 그래픽 (OpenGL)
- 고급 알고리즘
- 데이터 구조
내가 대표팀에서 했었 으면하는 일
- 컴파일러 구성
- 디자인 패턴
- 오토마타 이론
논리 -프로그래밍에서 논리의 중요성을 과장했습니다. 당신은 기계 공학을했다고 말 했으므로 수학이 당신의 삶을 얼마나 편하게 만들 수 있는지 알아야합니다.
명제 논리 , 1 차 논리 , 2 차 논리 : 매우 강력한 도구입니다. 아마도 내가 대학에서 배운 가장 (그리고 유일한) 중요한 것들 일 것입니다. 논리는 프로그래머의 무거운 포병과 같습니다. 아주 복잡한 문제 (복잡하지 않은 문제도 포함)를 체계적이고 논리적 인 형태로 만들면 훨씬 더 간단 해집니다. 기계 엔지니어를위한 선형 대수와 같습니다.
I think a good understanding of how a compiler works is good to know. Aho has the classic book on concepts used in creating a compiler. The title is Compilers: Principles, Techniques, and Tools. Its nickname is the Dragon Book. In order to really understand that book, you should have an understanding of formal languages. Hopcroft has a good book on that - Introduction to Automata Theory, Languages, and Computation.
Encapsulation
Alot of good responses have been mentioned here already, but I wanted to add a subset of what is important, but hasn't been covered so far.
After 15 years of post-undergrad professional Software development, I find that I regularly use some of the following concepts from in school:
- General OO concepts, and modern programming language features (classes, data hiding, etc).
- Algorithm performance metrics (Big O notation). When designing an algorithm, performing a Big O analysis to determine the cost of the algorith, and looking at more efficient alternatives in bottleneck areas.
- Linked lists and other complex data structures.
- Fast sorting, and different sorting concepts.
- Trees and fast tree manipulation.
If your language/platform doesn't support Garbage Collection, memory allocation and cleanup are critical, and would be added to the list.
I upvote Discrete math. Computer science is abstraction. learning to think like a Mathematician is very helpful.
I also wanted to add to what S.Lott said about languages. Learning a bunch of TYPES of languages is important too. Not just compiled vs scripting. But functional (ML, Lisp, Haskell) logical (Prolog) object oriented (C++, Java, Smalltalk) imperative (C, Pascal, FORTRAN even).
The more programming paradigms you know, the easier it is to pick up new languages when the hot new language comes along!
Some of the OS concepts
( memory, IO, Scheduling, process\Threads, multithreading )
[a good book "Modern Operating Systems, 2nd Edition, Andrew S. Tanenbaum"]
Basic knowledge of Computer networks
[a good book by Tanenbaum
OOPS concepts
Finite autometa
A programming language ( I learnt C first then C++)
Algorithms ( Time\space complexity, sort, search, trees, linked list, stack, queue )
[a good book Introduction to Algorithms]
Well the can of worms is open now! :)
I started out in Electrical Engineering.
Relational Database Design: Keeping track of data is like Arnold in "Kindergarden Cop".
It can be total chaos. It must be controlled.
How to keep your data, in the fewest locations, with the fewest duplications of information. How to keep your data light, and easily accessible. How to control data growth and integrity.
User Interface (UI) Design: This is how the User must access the data we're keeping track of.
Most UIs are designed by developers. Thus, most UIs, unfortunately, parallel the database design. Users don't care about the data design at all. They simply want, what they want. They want to get it easily. Usually this demands great separation from the data design and the User Interface. Learn to separate the "engineering" you from the "southern-hospitality" you.
Object Oriented Programming: Many languages boil down to this format.
Parallel Processing - Multi-Threading: Many processors make the work fast!
Parallel computers have been around for decades. They've been on our desktops for some time now. With the event of "cloud computing", massive parallel processing is not only manditory but also preferable. It is incredibly powerful! There is a lot of job potential for parallel developers.
Understanding Business Rules: This helps you make a lot of your logic, table-based.
Many IFblock conditions can sit in business rule tables. To change the logic, just change the information in a table. Little/No recoding. Little/No recompiling.
Events Supervise...Methods do the work:
Keep things separate in your code. It makes it easier for others to make updates in the future. It also somewhat parallels the Model/View/Controller (MVC) framework.
PJ
Strive for low coupling, high cohesion.
(I stole this image from the website linked above)
Try to get an understanding of all levels of programming. From the lowest level (assembly) to the highest level.
Take recursion for example which is an easy feature :) Try to learn assembly and create a program that will use recursion in assembly.
Algorithms.
Learning to use a programming language in a descent way is something you can learn as you go, but It's virtually impossible to invent all the widely used Algorithms by yourself.. One really should at least be aware of what can and can't be done with some problems.
For example one simply can't write some programs with bubble-sort and expect it to be considered good, no matter how fine the code is.
To sum it up - take a look at Introduction to Algorithms
No need to master it, just know what's going on...
As a recent graduate from a computer science degree I'd recommend the following:
As mentioned in various posts Big O notation
OO Design
Data structures & Algorithms (can't remember the exact title of the book I used will update if i remember)
Operating Systems http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580
NP Problems
It is clearly a good understanding of Object-oriented programming, good guiding principles like SOLID Principles and following established patterns and practices.
If you look at SOA, or DDD, they all ultimately fall back to some form of OOP concepts.
I would recommend you to get some good OOP books and alos pick a rich language like C# or Java to begin with
(PHP, ruby guys please do no down vote me, I am just giving some examples for him to begin with, you can provide your own answers and suggestions here)
Structure and Interpretation of Computer Programs. If you understand this book, everything else can be built easily on that foundation. If you have trouble with the concepts in the book, you may be a software developer but not a computer scientist.
I'm not going to tell you any specific concepts to study, but would instead recommend that you do a lot of light reading across a wide range of topics. Don't worry about getting an in-depth understanding of each subject you read about - at this point, it's more important that you're able to recognize what kind of problem you're looking at, so that you can do some just-in-time studying when you're actually faced with it. In other words, it's ok if you don't know how to solve a combinatorics problem, as long as you know enough to look up "combinatorics" when you need to see how many ways you can arrange a set of objects or pick a subset.
Wikipedia is a pretty good resource for this sort of wide-ranging browsing, especially if you're just skimming to begin with. An even better one, especially if you find Wikipedia too academic or inaccessible, is the C2 wiki. (This is, interestingly enough, the original wiki invented by Ward Cunningham).
I think it's essential to understand the basic theory behind multi-threading, without this it can be difficult to even see that there can be a problem, until you're debugging on a live server at 4 o'clock on a sunday morning.
Semaphores, critical sections & events.
No, not bubble sort, quicksort. It's the big-O thing- bubble sort averages O(n^2), quicksort is O(n*log(n)).
I would say below are the most important stuff
- Object Oriented Programming
- Operating System concepts
- Process and Thread
- Scheduling Algorithms
- Data Structure
- Type of data storage and collection, types (linkedlist, hash, array etc.)
- Sorting Algorithms
- Complexity of algorithms
Then Go to specific language related stuff. I hope this is helpful!!
I would start with the quote:
"if the only tool you have is a hammer, you treat everything like a nail". (Abraham Maslow)
The most important principle, IMO, is to know many different programing paradigms, languages and inform yourself well about the tools on your disposal. Any problem can be solved in almost any language you choose, be it full blown mainstream language with its huge default library or small specialized language like AutoHotKey. The first job of programmer is to determine what to use according to the specification of the problem. Some concepts provide better approach to topic, whatever your main goal may be - sophistication, obfuscation, performance, portability, maintance, small code size ...
Otherwise you will finish like some of programmers who desperately try to do something in a 1 language they specialized, while the problem could be trivial to solve in different programming context.
This advice goes along with todays tendency for multi-language projects (take web applications for example, which may involve several languages in single application, like C#, JS, CSS, XPath, SQL, XML, HMTL, RegExp.... and even different programming paradigms (for instance, C# introduced recently some concepts from functional programming paradigms, lambdas).
So, the basic thing is constant learning, forever :)
I think 3D-Graphics is something everyone should learn. Or at least how to properly use homogeneous vectors and matrix-transforms.
It can be helpful not only for creating 3d-applications but also in mechanic fields like inverse kinematics on robots, calculating moments and a lot of other stuff.
I didn't fully understand linear algebra until i had read 3d-graphics, one of the best courses I've ever taken even though our teacher was bad.
Since machines with multiple cores (both CPU and GPU) are becoming the standard, I would say to include Distributed Algorithms (from multiple threads to multiple machines). It is critical to understand multi-threading and distributed processing. Sorry that the link doesn't really provide a lot of help.
참고URL : https://stackoverflow.com/questions/747292/what-computer-science-concepts-should-i-know
'programing tip' 카테고리의 다른 글
Html.DropdownListFor 선택된 값이 설정되지 않음 (0) | 2020.09.03 |
---|---|
브라우저에서, 가급적 셀레늄을 사용하여 extjs 코드를 테스트하기위한 제안이 있습니까? (0) | 2020.09.03 |
Android 카메라 의도 (0) | 2020.09.03 |
통화 기호가있는 HTML 텍스트 입력 필드 (0) | 2020.09.03 |
페이지를 변경하는 방법 (0) | 2020.09.03 |