Index:
. NET Framework Basics [1]-http://www.cnblogs.com/haoyifei/p/5643689.html
. NET Framework Basics [2]-http://www.cnblogs.com/haoyifei/p/5646288.html
After four years of work, I have changed my job 6 times. All these four years I have used C # for development, in addition to the offer, but also failed to interview or rejected a lot of offer, add up the number of interviews at least 30 times. These interviews have high quality, there are general, different interviews will sometimes ask almost the same question, through the depth of the problem, can roughly judge a company and the level of the interviewer.
Job-hopping is for a better life. Improving your life requires a strong business ability to persuade the interviewer to choose you as a winner among many candidates. In a number of years of work and study, my level also slowly rise, at the beginning is nothing, and then some things, to now also can from the interviewer's question, probably understand his/her level.
The interview topics of different types of companies are slightly different, and these topics either represent questions you might encounter in the actual work after the interview, or the interviewer would like to know your personal level through the topic. For example Facebook,google,bat this comprehensive company in the school recruit, face are fresh college students, they are not likely to search engine very specialized, or good at Natural language semantic analysis. They will only have four years of college computer Education, and after the interview, these winners do not know which group they will go to do what direction of work. So at this time, give them a question can not test search engines, big data, and can only test the most general content, that is nothing more than the basic computer knowledge and algorithms.
In most cases, the interviewer wants you to pass the interview on the first day, to work the next day, and to be able to fight. So this is basically the problem you might encounter in your future work. The interviewer wants you to study these questions and prove that you can do better than others. Of course, the interviewer also hope that your basic knowledge level is strong, not in the development, deployment, testing and other basic processes ask Sanbuzhi. For example, I've interviewed three investment banks, and they all want the interviewer to be familiar with WPF or WinForm. So, two of them asked the classic question of how the worker thread modifies the contents of a UI-line program. For this classic scenario, you not only need to know what happens if you do it in a regular way (the contents of a UI-line program can only be modified by the thread that owns the control), and you know how to resolve it (WinForm uses delegates, WPF uses dispatcher). Also, you can mention that if your application is an ASP. NET WEB application, you need to do the opposite, using configureawait to force the system to switch without any threads. If the interviewer knows what you're talking about, he/she will be happy. If the interviewer's face is a rip-off, you can cut a notch in your mind for the company.
When you answer a question, if you can answer more than the interviewer's expectations, then they give you pay may also be unexpected. For example, for a simple question, "How to implement a singleton pattern," if you just give a simple constructor, the interviewer might think you're not sensitive to thread safety (and of course the weaker interviewer might be happy). If you add a double lock check, the interviewer will ask you what the first if is. If you know it, and you can explain why you need a double-lock check, the interviewer will feel very satisfied. If you can even mention that in many dependency injection tools, only one function is required to ensure that the object is globally singleton, such as AUTOFAC. The interviewer will be very happy, then the topic may be transferred to the IOC, or the weather.
Foreigners ask questions sometimes not in the usual way (or you can understand that the common sense of foreigners is that). Some of the more interesting questions I've met are: say any reason you think C # is good (the answer I give is that its syntax is natural and elegant, and you don't have to know a lot of the work behind the compiler.) Examples such as lambda expressions and async and await keywords), why C is named C, tell you what kind of books you read when you teach yourself a language, what data structures you like best. There are no answers to these questions, and you need to explain your answers in conjunction with the examples. Rote learning is useless in dealing with this problem, and you need to understand or form your own opinion on the basis of an endorsement.
In the process of learning, I read a number of classic books, of course, there are many are on the shelves, I may not be able to see or understand the whole life (such as "compilation Principle"). I also read a lot of blogs, which have a lot of ready-made code available for direct use. I think, as a determined and hard-to-do. NET + C # Programmer, the knowledge that should be learned includes:
- . NET Framework fundamentals, such as the core of the. NET Framework, –clr what to do. NET is how to compile the source language into the target language. NET, the role of assemblies, and so on. These are background knowledge, except the assembly is basically no one asked, but qualified. NET programmer must know. If you want to learn more, you can read "Dragon book" (that is, the principle of compiling). I'm not going to read this book in 5 years anyway.
- Basic knowledge of C #, such as type safety, class and structure, garbage collection, reflection, object-oriented basics, etc. These questions are relatively basic, but if you ask them in depth you can still get a lot of developers. Read through the CLR via C # can be a great help.
- Delegates and events. Although there are chapters about them in any book, there are still many people who understand the delegate only at the level of the function pointer. Developers familiar with delegates and events should be aware of the relationship between the two, what is a delegation chain, and how the delegate is ubiquitous (for example, a large number of delegates are filled with LINQ).
- C # new features starting with 2.0, this is a great topic, mainly including 2.0 generics and nullable types, anonymous Methods, 3.0 LINQ (and all related features including closures), 4.0 dynamic, generics covariant and contravariant, 4.5 async & await and so on. Familiarity with them can have a qualitative effect on your code. Any good introduction to C # Books will detail them, I personally see Jon Skeet's in-depth understanding of C #. This book contains a lot of technical details, I can not understand one-third. But personally, understanding the details does not affect the quality of your code. In general, people who dare to write "Familiar C #" on their resumes should at least understand the new features of C # two-thirds.
- Data. C # helps you achieve a number of commonly used data structures, including queues, stacks, and lists. For some of the more commonly used data structures to be familiar with, and in a specific situation when the choice. For example, use a linked list instead of list<t> for situations where you often insert deletions in the middle but do not find anything. C # All the data structures are based on IEnumerable, I once met an interviewer asked me what IEnumerable is doing, how to achieve a IEnumerable. Personally, the latter question is a bit of a imposition. However, if someone asked me what the difference between list<t> and ilist<t>, I would not feel too much. The "Data Structure" published by Tsinghua University is enough to make you invincible in this topic.
- Basic knowledge of multithreading. The difference between a process and a thread, the pros and cons of a thread, the state of a thread, how to manage threads. The depth of the problem can go to the most basic structure of the computer. In C #, the CLR provides thread pool management threads, but we don't need to communicate directly with it, and we can communicate with it indirectly through tasks. Threads have several states: Start, work, blocked, and abort. The mutual transformation between them forms several ways of synchronizing. You can get a "deep understanding of the computer system", perhaps you will be enlightened about this problem, but I just started reading this book.
- Multi-threaded synchronization. There are many ways to sync, from the most classic lock to its monitor,mutex,semaphore,event structure, atomic manipulation, deadlock, and so on. The interviewer is basically a master, because it is not easy to understand this piece of content. I interviewed so many companies, but also met three to ask this question, and only one asked very deep, the rest is only the test concept. However, for deadlocks, many people like to ask, they usually ask about the conditions and how to avoid the deadlock. Gary Nat's "operating system" has a wonderful description of deadlocks. The question of how to avoid deadlocks can often be answered in conjunction with the Philosopher's dining. Windows core Programming The book is also good, but I haven't started to see it yet.
- Basic knowledge of asynchronous programming. First, it is clear that there is no relationship between async and multithreading, it is not a subset of multithreading. A single thread can also be asynchronous. C # then provides several ways for asynchronous operations, such as delegate-based, event-based, and task-based. For each approach, be clear about its pros and cons (it is often difficult to cancel or get results, and the task-based approach solves all problems).
- Test. How to write unit tests and integration tests, the role of testing, how to isolate and simulate objects, test-driven development. Projects that do not test or do not intentionally add test code to the project are disturbing. One of the important reasons for continuous integration is that it can help you run your tests all over again. An airtight test is very complex.
- Knowledge of software engineering. Includes version control, continuous integration, and more. Continuous integration is increasingly being used by companies to enable rapid iteration and delivery. If you can independently for the company to achieve continuous integration of the scratch, you will be very valuable. Also, what style of software development process did your previous company implement? A waterfall or a quick one? Which do you like better? What do you think about pairing programming? What do you think is a bad place for agility?
- Some basic knowledge of the database, including several paradigms, the most basic SQL, the table on the query need to pay attention to things (how to put the index, which column, etc.). In addition, you may also need to know what the benefits of the ORM (Entity Framework) are. Big data, business intelligence directions, and database administrators need to focus on this and add a lot of content, such as transactions, database disaster recovery, backup, data warehousing, and ETL. For developers who are not in these directions, you don't need to know. The http://www.cnblogs.com/anding/p/5281558.html in the dream is actually a bit more, and the individual feels (of course, too little for the DBA). Especially for those internet finance companies that put data on the cloud and usually get data through the API. For that kind of company, you don't have to be SQL, because you don't need it, and you don't have to build a table.
- Common design patterns. Although there are more than 20 classic design patterns, no one can be perverted to let you carry them all down. The most common is nothing more than a singleton pattern, an iterator pattern, a factory, a strategy model (IOC), an observer pattern, and so on, to see how they are implemented and when to use them. In addition, for solid to understand the general, and in their own design, as far as possible. To understand what the IOC is really good for.
- Code style and simple algorithms. The most accurate way to look at a person's programming level is to look at the code. Good code makes you pleasing, bad code revolt you. The code has to be clear and precise, so that people can understand what you're doing without having to think about it. I really hate the code has: a function more than 100 lines, naming chaos, blind data structure, algorithm gratifying and so on. For the algorithm, if it is not a polygon algorithm engineer, the most basic sort and recursion problem is enough, for example, if you know how the C # Sort method is implemented, and understand why this is done, or you know that the index of the database is a B + tree rather than a hash, your algorithm level is sufficient. (for Google, the first problem is to flip the two-fork tree by hand I do not appetite) but if interested, you can read this "algorithm" (not an introduction to the algorithm) https://book.douban.com/subject/10432347/. If you haven't seen the introduction to algorithms in college, then the introduction to algorithms has only one function, which is to prove that your math is dog poop. If you claim that you can read TAOCP's first book, Make A For loop, send a resume to the world's top 10 technology companies and investment banks, and believe me, if you understand TAOCP's first book, English is simply no difficulty for your brain. You even have to write a sentence: I can read the first TAOCP.
- Can write a guessing number in any scripting language (that's the game on the song Star). Scripting language is a small helper of life, especially when you need batch processing to run multiple programs. We don't need to be very familiar with Linux commands, but we can choose one of the scripting languages, such as Python,perl, to write small programs that you think are too cumbersome with C # + vs. Of course, if you're still good at functional programming languages, that's great.
- What tools do you like to use to make the path of your vast reconstruction less rugged? Personally, I have been using ReSharper.
Above all, if you have a basic sorta, you can be a back-end programmer in any company. But if you're interviewing for a job that requires you to write an API so that your front-end buddies can use it, you'll also have a superficial understanding of the following:
1. Web basics, including the five-tier model, the difference between get and post, some status codes for the HTTP protocol, and basic IIS settings. In-depth understanding of this topic, you can get a book on the computer network, there is a detailed five-layer model, TCP and IP protocol details. If you are not an expert at the network level, I do not think they are necessary. Of course, if you aspire to be an expert in this area, please follow http://coolshell.cn/articles/4990.html
2. Web Services. Web services have a long history, the most classic two ways of soap and restful differences to know. In addition, Microsoft has given its own implementations for both of these approaches, namely WCF and WEBAPI.
3. Have a certain understanding of MVC. Learn how to use tools to automate or not automate integration testing of your APIs.
4. OWIN. Microsoft's Owin helps us to free ourselves from the long and smelly life cycle of ASP, and we can define our own life cycle. This is also true in the new ASP. NET core, and the life cycle has become history. We want to understand the basic way owin works and how it fits with IOC tools. Also, with Owin, our project can be decoupled from IIS and can be replaced by other tools instead of cumbersome IIS.
5. For the financial trading system, special attention needs to be paid to SIGNALR. It integrates several ways in which servers and users communicate, from regular polling to server unsolicited messages, and now commonly used websocket. It will choose the way it deems most appropriate, depending on the situation.
The above does not include the front end, because I think the whole stack of engineers is very unrealistic (because the front end of the content and the back end is almost as much, and the content of the back end will take at least 3-5 years), so do not intend to work in this direction, and my knowledge of the front end is very fur. Of course, only simple HTML and jquery, can not call yourself a qualified front-end engineer.
In the long learning process, we not only have to lay a solid foundation, but also always pay attention to the trend of new technology. C # 6 has been introduced for some time (although there is no significant improvement in it) and C # 7 is coming soon. The launch of ASP, the front-end packaging and testing on the table, while making angular JS official front-end language. For the backend, perhaps you do not have the opportunity to contribute to the company angular JS code, but grasp the evolution of the new technology process, will also have an important role in the mastery of the whole knowledge system.
I have written a lot of notes, although most of them are copied from others. I am here also intend to follow the blog Garden predecessors, get a Face Test series, which does not fully contain all the above content, hope you greatly generous enlighten. After all, everyone can benefit from communicating with each other. So cut the crap, we'll start right away.
. NET face question series