How to become a good programmer

Source: Internet
Author: User
Tags posix

Before reading this FAQ, you must read the "How To Be a hacker" (the translated version is included at the end of this article) in the "How To Be a hacker" section. I will not repeat the principles mentioned in this article. This article takes a long time to talk about hacker culture. Although attitude and belief are indeed the most critical factors to success, you will surely think that it is irrelevant to you if you are not a hacker, I just want to learn a skill and find a good job, right? We certainly hope to have some practical guidance.
 
1. What is the relationship between various software technologies?

I divide software technology into three layers:
Problem domains: computer graphics, audio/video coding, information security, pattern recognition, information retrieval, natural language analysis, artificial intelligence, scientific computing, etc;

System integration: c ++, Java, and other object-oriented languages, Python, and other functional programming languages, Gui, middleware, compilers and interpreters, virtual machines, databases, network services, and parallelism. computing, cluster, peer2peer, system management, etc;
System functions: hardware description language, computer architecture and programming model, instruction set and assembly language, C language, kernel, file system, device driver, network protocol, POSIX, etc.
 

What is the ultimate use of computers? In the end, problems are solved for users through various technologies of the problem domain. These technologies contain very advanced algorithms. However, they must be run on a platform, they need to leverage the various infrastructure provided by the platform, such as computing, I/O, and network interconnection capabilities. The system function and system integration layer are used to implement this platform. The system function layer provides basic computing, I/O, and network functions. The system integration layer can abstract and package these basic functions to provide more convenient and flexible interfaces.
 
2. Why Learning embedded technology?


During the course of sub-embedded learning, you will learn in detail how each part of the system function layer works, it will also explore the technical direction of the system integration layer, such as object-oriented programming, Gui, database, and network services. Although the embedded system is not as complex as PCs and servers, the various components of computer systems are the same. Therefore, it is a good choice to start learning software technology from embedded systems, avoiding unnecessary complexity and grasping the most fundamental concepts and technical points of computer systems. After laying a solid foundation, your career development will not be confined to the embedded field at all. Even if you do PC or server development in the future, the knowledge and skills you have learned in sub-embedding will also benefit you for life. Just like ding Jie Niu, the heart is full of cattle, and naturally it can be used with ease.
 

On the other hand, you must have seen a lot of publicity on all major websites, saying that the embedded industry has unprecedented prospects, embedded talent shortage, and millions of job vacancies. These statements are also true, but we need to have a deeper understanding of what the problem is. As we said just now, an embedded system is also a complete computer system, which has no essential difference with PCs or servers. In fact, the boundaries between embedded systems, PCs and servers have become increasingly blurred. In the past, the embedded system was a single-chip microcomputer, which only allowed simple computation. The current ARM processor has a better performance than the previous Pentium. It is no problem to play games or watch movies. Who can say it is not a PC? In addition, some dedicated embedded systems are already acting as servers, and the cluster technology can combine many low-cost processors to play the role of large servers. As more and more embedded applications are applied to electrical appliances, automobiles, and various facilities, and there is a tendency to integrate with PCs and servers, the future of the embedded industry is unprecedented.
 

So why are embedded talents in short supply? In fact, learning embedded systems is learning computer systems. In essence, there is no special technology only available for embedded systems. There is a shortage of embedded talents. In essence, there is a shortage of talents who really understand computers. Nowadays, software talents trained by the so-called "software College" in many schools are invisible: only understand J2EE and. net, without learning C and assembly; only the library function sort () will be called, and there is no knowledge of various sorting algorithms; design patterns, software engineering speak first, but I don't know whether good software depends on the IQ of the ox. Train people to build a production line like steamed buns, and then let skilled workers stand on the production line to screw up, imagining that this will produce good software, that's putting the role of software engineering and programmers upside down. Currently, embedded development has higher requirements on the quality of programmers. The above "software talents" cannot be competent. Therefore, embedded talents are in short supply. Although the Sub-embedded job class is only a few months old, it is intended to train software talents who have a complete concept of computer systems, rather than software workers who only screw the screws, this is because we have always insisted on embedded training instead of Java or. net training.
 
3. Some people say that the software technology has changed too fast. Now, what we have learned will be completely eliminated in two years, right?


Do you know who said this? It must be said by those who have already been eliminated. Development tools and languages such as Delphi, BCB, and Pb have all been very good for a while, but they have been completely replaced by Java and. net. So Will Java and. Net be replaced? Maybe not for a long time, but I am optimistic about Python.
 

These obsolete programmers share some common features: they only drag controls with the mouse and leave the IDE without knowing how to work. They want to spend their whole life learning how to get the best of them, I am not interested in learning new technologies. I am a monk and hit me for a day. Now let's look back at faq1. in the entire field of software technology, these fast-changing technologies actually only occupy a small part, but they have become all the experts of these people, can such a person be eliminated?
 

Contrary to these popular development tools and languages, many technologies and ideas rarely change. For example, POSIX and SUS standards define the semantics of a set of system function interfaces and basic commands. Only these implementations can be called UNIX, therefore, today's Linux, Solaris, and more than 20 years ago UNIX are basically the same on the system function layer. The mathematical theory that guides the development of computer science, even when computers were not born, the old ancestor thought for us: Boolean algebra was published in the 19th century, it was not until a century later that computers and digital circuits were invented that they were used. Number theory came into being in the 17th century and has been regarded by mathematicians as a fun theory, but it is just fun, it was not until the birth of computer cryptography that it discovered its practical use.
 

Although various popular development tools and advanced languages have changed rapidly, the underlying programming languages are very stable. The kernels of various operating systems are written in C language. Previously, this was the case, it will not change in the future. On the other hand, the design ideas of various programming languages are also very stable. In fact, there are only two programming languages in the world: C and Lisp. The former is imperative and abstract the computer model. The latter is functional, is the abstraction of mathematical function models. Object-oriented is an important software engineering idea, but it cannot be regarded as a new language model. It should belong to Class C. In fact, all languages of the same category are similar. How long does it take for a person proficient in C ++ to learn Java? Familiar with syntax for one week, familiar with class libraries for three weeks, a month is enough, past experience can be applied to the new programming language. However, if you want to learn profound algorithmic skills, logical thinking, and abstract thinking, how long does it take to really understand what the "System" is and how to analyze and design the "system? I'm afraid it will take several years.
 
4. Which language is better for C and Java?


Computer science has nothing to do with programming languages, and even has little to do with computers. It is not a computer, but a methodology for analyzing and solving problems. The program is mainly written not for execution on computers, but for display. The use of programming languages is the same as the use of natural languages for expression and communication, but the program can be executed by the computer.
 

The above is not what I said, but what a famous computer scientist said. Therefore, the argument at the programming language level is meaningless. Many beginners mistakenly think that mastering a programming language is equivalent to learning a computer. A programming language is not mastered yet, and has not risen to the level of methodology, only this ignorant person will argue about which language is good. Having mastered the programming language is far from learning the computer, but just the first step and the simplest step. At work, you can learn whatever language you use, when a language is out of date, it will be lost. The programming language does not need to be accumulated because it is too simple. What really needs to be accumulated is the methodology.
 

Many people like to participate in this type of debate. without any exception, everyone is defending their skills in programming languages, that is, "I will have the best language, and I will not have any bad language ", in fact, what these people really want to say is, "I can use a better language than a hundred thousand generations, so I don't have to learn a new language or adapt to new changes." In summary, it is just a word that is lazy. A real expert will have many programming languages. Some foreign technical consultants will learn several new programming languages every year to cope with market changes. Losing old programming languages and learning new ones seems to be a waste of effort and accumulation. In fact, the design of each programming language is unique and reflects the essence of each language, it is the methodology that has been accumulated after the integration of hundreds of schools.
 

It is meaningless to argue Which language can do more things and have more functions. Theoretically, any programming language that fits the Turing Machine Model, coupled with appropriate I/O extensions, can do anything, and a shell script can also be used to write a decent game. However, different languages have different design objectives, different expressions, and different code volumes are required for different things.
 

Another misunderstanding is: Which language has the largest market, the most developers, and the best. In this sense, Java is indeed better than C, so previous students asked us why we only teach C language. Please note that the operating system kernel is written in C, and various underlying applications, including Java virtual machines, are also written in C. If you want to learn Java, you will be able to analyze the implementation of the Java Virtual Machine after the sub-embedded learning is completed. Learning Java at the height of the computer system will make you a real Java master. If you just want to quickly develop and want to learn a technology to screw up, the sub-embed is not suitable for you.
 

Faq3 said that there are two programming languages C and Lisp in the world. Now you have learned C and later C ++, Java, and ,. net and so on, and still only know half of the world. LISP and Haskell constitute the other half of the world. Now, many common interpreted languages such as Python and JavaScript also use functional.
The idea of programming. If you just write code with a stuffy head, rather than a wide range of data, you will miss a lot of highlights.
 
5. I have heard that no one needs programming since I was 35 years old. Do I have to change my mind and find a way out?


Although this idea is quite popular, it is not worth mentioning. Those who are now thirty-five years old have all the features mentioned above, are not interested in learning new technologies, and are not interested in exploring the nature of computers, playing games, watching TV, and laziness. If you are renting and setting up stalls, the diligent and lazy people have meals, and the IT team is very heartless for the lazy people, the lazy people should not be in the IT line, and do not look for reasons from themselves, however, such remarks are everywhere, and it is really hateful to blame the poor Society for cracking down on the confidence of new people.
 

In another case, programming was compiled into the company's management layer at the age of 35, or you started your own business. This was a very diligent person, if they use this kind of diligence in technology, they can certainly do a better job, so it cannot prove that programming will change to 35 years old because there is no way out.
 

Programming is not a kind of physical activity. It requires high-intensity thinking and intellectual investment. The analytical and thinking abilities all require time to accumulate. Therefore, it is not as young as possible. On the contrary, I think the code written before the age of thirty is rubbish, and a decent program can be written after the age of thirty. If you want to take the technical path for a lifetime without being forced to switch, you must constantly change the nature of your work from "physical strength" to "mental strength ". What is "constant" change? Here, "Physical Activity" does not refer to farming and building houses, but to writing code repeatedly. Then you will feel that, the jobs you send to you can be easily handled based on past experience, but do not be satisfied with the status quo, just like boiled frogs. This is a dangerous situation! To get rid of this situation, you need to learn, think, and improve, so that the company can send you more challenging jobs. Applying new knowledge and technologies at work is "mental work, however, after using it for a long time, it will become a simple and repetitive "Physical Activity". In this case, you need to learn and improve again, so it is called "constantly" to change the nature of your work from "Physical Activity" to "mental activity ". If one day you find that you have been trapped in simple and repetitive work for a long time and cannot learn and improve in your spare time, this means that the company will not employ people, And you should think about it.
 

From another perspective, if you want to take the technical path for a lifetime, you must have your own core competitiveness. This core competitiveness is by no means the ability to do some work based on past experience, it is the potential for learning, thinking, and solving challenging new problems. In the IT industry, repetitive work may not last long due to past experience. The reason is very simple. One problem will not be solved twice, when you discover that your experience can solve a type of problem, someone else has written the routine for solving this type of problem into the framework, new users can call classes and functions in the framework to solve the problem even if they do not have your experience. Then, they will accumulate new experience on the basis of the framework to solve new problems. Because of this, the experience of developers around the world will accumulate, and the software technology will develop so rapidly. This does not mean that experience is completely useless. The most important thing is that learning and thinking are based on previous experiences. On the other hand, the existing framework is not necessarily the perfect integration of development experience in some aspects, but also needs to be constantly developed. It uses new methods to solve old problems. Take web development as an example, from the early ASP and PHP to the later. net, J2EE, to the present Ruby
On
Rails, Django, and so on. These frameworks solve the same problem, that is, how to quickly and effectively develop web applications. This experience is constantly re-integrated and innovated. To sum up, what is the core competitiveness? It should be the ability to learn new technologies and solve new problems based on experience.
 
6. is driving development or application development more promising?


That is to say, "If you tell me which one has a better future, I will learn which one is better, and the other one will not have to learn ". Students who ask this kind of questions will often ask another question at the same time: I want to drive development in the future. What are the advantages of these application development technologies? Is C ++ much more useful? What is the purpose of learning? I don't want to do GUI in the future. How can I use QT?
 

The most taboo in learning is the utilitarian attitude of "useful learning, don't learn if you don't use it. Two questions: first, how do you determine whether this technology is useful before you learn it or not? I can only refer to what I have said on various forums. I don't know if 100% of the participants in such discussions on the Forum are cainiao, and some of them are not as good as you. Second, even if the technology you have learned is useless, is there any loss? Students who graduated from the Asian embedding industry are engaged in a variety of development jobs, such as driver, system programming, Gui, and web development, as long as you confirm to do a kind of work, it is impossible to use the four months of sub-embedded learning, but at least 3/4 of the knowledge can be used. Assuming that you have no chance to use the remaining 1/4 in your life, that means you will lose your learning time for one month. Is this a big loss compared to your gains? Please note that the above assumption is not true. The 1/4 that is useless is only useless for the moment. It is very common for programmers to change jobs or projects, no one can be involved in only one type of development work. As long as there is a solid foundation and a complete knowledge system, any work can be easily started.
 

A solid foundation and a complete knowledge system are based on these two points when we arrange the employment course system. Some courses are rarely used by students in the future. However, if this part is missing, it will not become a complete knowledge system, such as MMU and cache. Should this class be used? No doubt. Some courses cultivate a basic programming idea, such as object-oriented programming through C ++ and object-oriented, event-driven, and state machine programming through QT, these programming ideas are essential to programmers, and C ++ and QT may not be available to some students in the future. Should this class be taken? No doubt. Some people argue that C ++ is much less used than Java and QT is much less used than GTK. Please go back and look at faq4. This debate is meaningless and there is time to argue who is better or worse, it is better to learn both of them.
 

Back to driving development or making application development more promising. I can only say that if you do well, you will have a future. If you do not do well, you will have a future. If you do not understand the other, you will have no future. Do not assume that the kernel developer will not write an application. Linus writes a source code management system git to maintain the kernel, because the existing source code management systems are not easy to use. This is the case for cool people. They only need to write what they need, regardless of the kernel.
Space or user
Space. Similarly, if you do not understand the kernel, you cannot use the services provided by the kernel to write programs with optimal performance. It is difficult to do the kernel, because debugging is difficult, it is necessary to track a large number of concurrent threads, because it is difficult to get started, it is necessary to write a hello
World requires a lot of knowledge. It is also difficult to do the application. Looking back at faq1, most of the theoretical and practical aspects of computer science are covered in the above two layers. So there is no more difficult question, which is more promising, and any more difficult discussion is too.
Naive.
 
7. I couldn't read any books at first. How can I find a learning sequence?


In the past, a student said when learning C language, "C language is very strange in many places and has to be explained using kernel knowledge. But you don't want to teach me the kernel first. I don't have the legal C language. I had to read the operating system books and kernel code, but I couldn't understand it ." Of course I can't understand it. The kernel code is written in C. If I don't learn the kernel, I can't learn the C language. How can I understand the kernel without learning the C language? It seems that this is a chicken or an egg problem.
 

Lazy is really a human nature. Even the learning process is expected to go smoothly, so you don't have to worry about it: the path behind you is "known ", each step changes the new "unknown" to "known", so that all the "unknown" are changed to "known. It is a pity that knowledge is not a path, but a circle. When you jump into this circle from any place, it is "unknown" behind you, and it is "unknown" in front of you ". Some people cannot tolerate the unknown behind them: reading a book, a new concept A is explained by concepts I Don't Know B and C, I don't even know how to learn? No law!
 

It's not that people do not write well, but there is no way to split a circle into a straight line. The process of learning is essentially a cyclical process. The only way is to "Doubt": I do not understand the concepts of B and C, then I don't want to think about this anymore. Instead, I believe that I have understood B and C. I want to learn a Based on my own understanding and assumptions. Then I want a to understand X and Y, after one lap, I will come back and naturally understand that the assumptions about B and C are correct and incorrect. After understanding these two concepts, I will cut them out from the book. Then I need to take another lap, correct some of the original mistakes. Therefore, any book should be read at least twice. during the second reading, you will have a new understanding of many concepts, because you have read the chapters after this concept, on this basis, a new understanding is created. The ancients had long understood this truth, so they proposed "Learn from the cold and learn new ".
 

After years of training in teaching practice, the sub-embedded curriculum system has properly straightened out the relationship between knowledge, allowing you to jump into this circle from the best position and start learning, the so-called "best position" refers to the minimum number of "unknown" that you need to tolerate when you are a beginner, and the minimum number of assumptions that need to be made is as small as possible, however, it is impossible to eliminate all "unknown". For example, C language is required if no kernel is learned. Based on your past experience and some luck factors, some of your assumptions about the kernel may be correct or wrong, but this does not affect your learning of C language, some Kernel errors may lead to some misunderstandings in the C language learning process, but it doesn't matter, as long as we follow our curriculum system step by step, these misunderstandings and incorrect assumptions will eventually be corrected.
 
8. Do you have any good books to recommend?


All the people who can ask this question are smart students. Reading and learning is a very important part in the course of getting started. If you use a bad book, it will be a waste of time or a small matter. If you are misled, it will be troublesome. If the error token cannot be corrected in time, it is even more troublesome to become rooted. Therefore, you must have a "brand awareness" in reading books. When deciding to read books and learn a technology, first ask which book is the most authoritative in this field. Here we will list some books of the Le level:
The C programming language, 2nd edition;
C ++ primer, 4th edition;
Structure and interpretation of computer programs, 2nd edition;
Introduction to algorithms, 2nd edition;
Compilers: Principles, techniques, and tools;
Advanced Programming in the Unix environment, 2nd edition;
TCP/IP replicated strated, Volume 1: the protocols;
UNIX Network Programming Volume 1, 3rd edition: The sockets networking API;
Understanding the Linux kernel, 3rd edition;
Linux Device Drivers, 3rd edition.
 

In the course of learning, you must broaden your horizons. If you don't want to learn something, you will be complacent. We need to communicate with others and learn more about what books they are reading and what their technical knowledge is. Books are endless, especially for programmers.
 
9. How to deal with the relationship between playing games and learning?


As we have also said in this article, hackers all have some special hobbies, and often have a hobby of irrational thinking. You probably need to change your mind. The typical example is the death of Steven s due to a glider accident. He wrote three of the books recommended by faq8. There must be a lot of outstanding programmers who love playing games, and some of them have become outstanding game developers. However, I think that to become a good programmer, there must be two basic qualities: First, being very interested in programming, and second, not interested in all other things, or not as interested in programming. Some people say that a person has 24 hours a day, 8 hours of rest, 8 hours of work, and what he does in the other 8 hours determines how much development you will have in the future. When you have time to read and learn, this is what a programmer should do. If you play games today, watch movies tomorrow, And get stocks the day after tomorrow, you will be laid off at the age of 35. If you don't agree that programming and thinking are more attractive than other things, you don't have to learn programming and concentrate on doing your favorite things.

This article from the csdn blog, reproduced please indicate the source: http://blog.csdn.net/adcxf/archive/2008/09/20/2956030.aspx

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.