Preface:
A lot of people have asked me recently, “George, how can you be at the forefront of the main architects in the company, I am now in the formula has worked nearly five years, is still an unknown programmer, I also through a variety of channels to breakthrough I bottle for now, but can’t walk out, technology is also never break up, I really have no way, through a friend recommended to introduce, Said you here can solve my technical bottle disease, so I would like you to help me break through the technical aspects of the bottle disease.”
Do you have questions like, “How does a programmer who writes business code every day become a technical genius and start writing technical code?”
Today, a friend of mine and I worked together came to a conclusion about what it takes to be a major architect in a company.
Whether it is development, testing, operation and maintenance, every technical personnel has a dream to become a technical bull more or less, after all, “the dream is always there, in case it is realized”! It is the pursuit of technical dream that drives us to strive and improve ourselves constantly.
However, “the dream is beautiful, reality is cruel”, many students in the actual work, dream is to become, but do look like Daniel, for example, a programmer says “write business code also work overtime everyday, how to become a technical Daniel”, test said “every day have not finish the test case”, Operation and maintenance said, “Carrying the machine, connecting the network cable and tapping the shell command is not what I want in operation and maintenance life.”
I’m also a programmer, so I hope to help you out with some examples of program-based development. The general principle is the same, testing, operation and maintenance can be used for reference.
Some pitfalls of being an architect
First: worship Daniel as the teacher
Some people think that the easiest, fastest and most effective way to become a technical leader is to “learn from the technical leader of your team” and have them give you some difficult tasks.
I personally oppose this approach for several main reasons:
Daniel is very busy, it is unlikely to give you a small cooking alone, let alone every day to give you an hour of cooking; Moreover, in a team, if Daniel often gives you a break, it will inevitably cause other team members’ doubts. Personally, I think it would be best for Daniel to give more training to the team if he really cares. However, those who have done training know that preparing for a training is very time consuming. The courseware and materials should be at least 2 hours (not fragments), and the explanation should be 1 hour. It is quite frequent for them to do training once a month.
Because of the first reason, we usually seek Daniel with questions to consult or discuss. It doesn’t take much time to answer or discuss questions, but more depends on experience and accumulation. In this case, They are very willing to answer questions. After all, influence is an important indicator of Niu. However, be careful: If you constantly ask for information that can be easily found in a book or On Google, they will get impatient. Time is precious. I often get asked questions such as “how to configure -XMN parameters for JVM”, and I always answer them directly, “Please go to Google”, because there are too many such questions. If you don’t systematically learn them by yourself, it is a waste of time for yourself and others to ask them all.
It is unlikely that every team will have a technical champion. There will be someone on the team who is better than you. Even if he gives you a little tutoring every day, eventually you will only be able to improve to his level. However, if you are a cross-team technical champion, due to the reasons of work arrangement and distribution, there are few opportunities for direct consultation and guidance, and it is unlikely to become a technical champion just by attending several training sessions.
To sum up the above reasons, I think for most people, if you want to become a master of technology, you should first understand the truth of “mainly depend on yourself”. You should not expect a master of martial arts to teach you step by step. When appropriate, I can improve myself by consulting Daniel or discussing with Him, but most of the time I still improve myself systematically and pertinently.
Second: The business code is also awesome
Some people think that writing a business code can be very cow force, the reason is that business code can have a variety of skills, for example, you can use the encapsulation and more extensible abstraction allows business code, can be more exchanges and products in order to better understand and implement the business, good logging problems targeting efficiency can promote 10 times, and so on.
Business code has technical content, that is for sure, the business in the code technology is the foundation of every programmer, but only to master these skills, and can’t be technology, like the game upgrades have started playing small monster, experience value is very high, the more behind the experience value is less, a little strange already cannot ascend experience value, This time you need to play some more advanced strange, brush some of the challenges of the copy, did not see which game as long as always play small strange can be promoted to the top. As technology and the way is also similar, you want to constantly improve their level, then face greater challenges, through these challenges to levels more at the next higher level, and so on, finally reach the state of technology and the industry even Daniel, write business code just a challenge in the play blame upgrade road, And I think it’s a fairly elementary challenge.
So I think: a programmer who can’t even write good business code can’t be a technical genius, but a programmer who only writes good business code can’t be a technical genius either.
Third: I am too busy to study by myself
Many people think that they do not become technical masters because they are not smart or hard working, but because in this environment in China, technical personnel work too much overtime, so that they do not have extra time to study.
This reason has some objectivity, after all, compared with Europe and America, we do have to work more overtime, but this factor is only a problem to be overcome, not an insurmountable gap, after all, there are still so many talents around us who grew up in China.
I think there are several myths that contribute to this perception:
(1) What I do at work is repetitive work. If I want to improve myself, I have to learn extra
The main reason for this myth is that “there is no skill in writing business code”, which is what I do now, so I can’t improve at work.
(2) Learning requires large chunks of continuous time
Many people think that learning is like attending school, giving you a whole day to attend class is learning, but we usually work overtime and more tired on weekends, just want to sleep in, or just want to go to watch movies and play games to relax, so there is no time to study.
In fact, the opposite is true: first of all, we should learn and improve on the job, because learning is best when it can be applied or referenced by examples. Secondly, learning after work does not need a long period of time, but to squeeze out time and use time fragments to learn.
How to break through and avoid above several big mistakes
How to break through the above misunderstandings, it depends on how you learn, there is no set of systematic learning system for you to learn, there is no group of learning atmosphere, there is no group of brothers and sisters encountered bottle disease breakthrough together. Yes ?????? I have it here.
I would like to recommend to you what I think is the most comprehensive and systematic learning system (decomposed, complete addition group can be obtained).
One, source code analysis
Distributed architecture
Third, micro services
Fourth, performance optimization
Five, Java engineering
The above is the most systematic learning system I recommend to you. If you want to learn the above knowledge content, you can add this group: Exchange Learning group: 433540541, which will share some videos recorded by senior architects: Spring, MyBatis, Netty source code analysis, high concurrency, high performance, distributed, microservice architecture principles, JVM performance optimization has become an architect’s essential knowledge system. I can also get free learning resources, which I benefit a lot from now
So the question is, after learning the above curriculum system, can you become the main architect of the company? The answer is: NO
To become a leading architect, you need to know the following
To become an expert in software development, we need a complete understanding of the software development process and rich experience in key parts.
It requires us to understand the nuances of design patterns and algorithms, while following software development best practices, including creativity and thinking, to provide appropriate solutions to programming problems.
To achieve this goal, we need to master server-side development, client-side development, DevOps operation and maintenance, cloud computing, web design, distributed systems, databases, programming protocols, code management, infrastructure management, scalability, security, etc.
You may not know all of the above. But try to learn most of them from the surface, and then learn a few techniques in depth.
Here are some of the key technical skills that developers lack and that technical managers or architects should be familiar with checking when hiring for these positions.
Coding standards
Coding specifications help ensure good development practices and product development. To understand some of the most important coding conventions:
DRY(Don’t repeat yourself), SOLID, TDD, defensive programming
Design patterns
Design patterns are a common, reusable solution in software development to solve common problems in software. It is important for software developers to understand some common Design parterns, and even more important to be able to identify the correct Design patterns for a given problem. Some of the design patterns used by first-class developers are MVC, Singleton, DAO, Facade, Proxy, Adapter, Strategy, and Absract Factory.
Server-side development
In more complex software systems, there is a variety of logic on the back end. As a back-end developer, dealing with the business logic of your application presents many challenges. Any developer can write code, but only experienced developers can write high-quality code with high performance, scalability, and reliability. The process of developing good software involves a lot of science, mathematics, computer expertise, and processing thinking and experience is very important.
The cache
Various mechanisms for data caching (file, database, memory, reverse proxy, HTTP….)
Memory management
Java has a very good garbage collector that automatically manages memory, cleans up unused objects, and frees up some memory. But an experienced Java developer needs a very thorough understanding of why memory works in order to write high-performance and optimized applications.
It is important to understand the following concepts:
Stack, heap, strong references, weak references, escaped references, how to reference strings, garbage collection process, meta space, garbage collector types.
Exception handling
This is a pretty important and big topic, and we’ll write a special article about it later. Now, here are some good practices for handling exceptions:
1, follow the “error first” principle to make software more reliable
2. Do not catch exceptions that cannot be recovered
3. Do not record exceptions and then throw them out
4. Select the right layer to handle exceptions (for example: the DAO does not know how to handle a database failure, but the service layer does)
5. If you cannot recover from an exception, the unchecked exception is preferred
IO operations
Understand the cost of I/O operations and the unpredictable consequences that can occur.
Asynchronous programming
The use of threads for asynchronous programming in Java is a fundamental part of the Java platform, and the effective use of concurrency is critical to building high-performance applications.
Terms such as thread pools, deadlocks, producer-consumers, atomicity, immutable objects, semaphores, and so on should not be new to experienced developers.
The batch
Writing batch jobs is common in real-world scenarios. Usually performing important tasks, there are some basic rules:
1. Each task should be divided by input, process and output;
2. Always poll batch input data;
3. Processors should be thread-safe;
4. The output should be atomic;
5. Store work results;
6. Consider the EIP mode.
Distributed computing
In the modern world, distributed computing refers to the use of distributed systems to solve computing problems. However, different from traditional systems, distributed systems have a high level of complexity. Engineers with experience in distributed systems will come into play when users start to grow rapidly and consume large amounts of resources. Microservices software architecture is a good example of distributed computing and all the benefits and trade-offs of distributed architecture.
Today, microservices are an essential skill for today’s software engineers, which requires extensive experience with distributed systems.
Such as fault tolerance, availability and consistency, distributed transactions/events, synchronous and asynchronous communication, distributed authentication, distributed applications, consensus applications, etc.
The database
Accurately understand all the costs involved in communicating with the database from communication to data acquisition, such as connection handshake, data transfer, etc. Have a clear understanding of atomic transactions and how to ensure data consistency. Therefore, database management is a necessary skill for software developers.
A database is used to manage data, which is a daunting task, even without considering adding business logic to the database. In large IT systems, databases face many challenges in terms of security, scalability, capacity, and availability. We need to think about encryption, replication, sharding, big data. Understanding how the database works and how to optimize it, as well as the cost of each processing (for example, memory footprint, number of cpus), will help you effectively design your system’s database management.
DevOps
The lead developer will have the ability to drive the culture and practices of DevOps, automate all operations steps, and improve the ability to deliver applications and services with high quality and speed. The code deployment or configuration infrastructure must be automated, flexible and monitored.
A strong developer should have a good understanding of the full development life cycle, from testing and release to deployment and infrastructure management. We need to know about cloud computing, Linux, networking, containers, engineering management, etc.
Code management
Given the importance of code, only major developers can master the code life cycle and promote software engineering best practices. To do this, you need to be familiar with source code management systems such as Git, have a clear understanding of branching policies, version control, distributed revision control, as well as code quality assurance tools, inter-code communication and dependency management, configuration management, and so on.
security
Web security is a tricky business, partly dependent on many external parameters; Software engineers need to follow best practices and guidelines for building secure Web applications.
Leading engineers need to have a deep understanding of information security, not only how to avoid building insecure and vulnerable systems, but also how to protect users’ privacy.
A great developer needs to be able to create a guide that addresses the top 10 Web application security risks. In Web applications, we have more security threats for engineers to focus on, including the following:
1. Upload files to check;
2. Password brute force cracking;
3. Session expiration processing;
4. Session source verification;
5. Secure communication through the network;
6. Secure Cookie access;
7. User credentials processing.
The front-end development
Front-end development is an important part of software development, and if you don’t know the relationship between programming and good user experience, you can’t become a major software engineer.
In the front-end world, Javas and CSS are a must for software engineers. Getting to grips with both is not easy, but it’s important to understand how they work and how both connect with HTML to enable us to provide a great user experience.
To lead a front-end team, you need to know more than just how to build a nice layout. To do front-end development better, you need to know the following:
What can the browser build as an engine?
2. How to develop responsive websites;
3, how to improve the performance of the website;
4. How to develop single page application;
5. How to build a modern and efficient development environment;
6. Be familiar with HTML5 APIS.
7. Familiar with the React.js or vue.js framework
To master these skills, developers need to be self-motivated, take the initiative to learn new technologies, and claim a lot of credit for their careers. Challenging yourself to get better at solving problems is the nature of programming. Knowledge is important, especially in the case of complex problems. In the field of IT technology, which is changing so fast, the acquisition of knowledge is more important than our acquired skills at any time.
Need to learn, access to information can also add the group recommended above, I hope to help friends and children in this industry development, in forums and blogs and other places to spend less time looking for information, the limited time, really spend on learning.