I have been working for 8 years. Two days ago, a colleague who was just entering the workplace asked me for some advice and experience. I think this is a valuable topic, and I’m writing this post with my own thoughts and experiences, hoping to inspire young developers.

I’ve worked for four companies: NVIDIA, Google, Slide, and Glow. Two of them are big, well-known companies. Slide, which I joined after Round D, had about 150 people. Glow has been around since its first day. Personal work also from Developer, Tech Lead, Engineering Manager to CTO. These experiences have given me a more holistic view of the personal development path of a programmer.

If you ask a young front-end developer, what are you going to do to improve your capabilities in the next three years? He might say something like, “I’m familiar with the Web front end right now, but I want to learn more about AngularJS, and React is evolving so fast that I want to see it. After that, I’ll spend time learning iOS and Android development.” It looks good, but it lacks systematic goals. In other words, he decided what to learn, but didn’t really think about why.

In technology, so much goes out of date quickly. How do you maximize your long-term benefits with your limited time? I can make a few suggestions here

Build your toolbox

To do a good job, he must sharpen his tools. Every developer should have his or her Own Swiss Army knife, and these tools can save you valuable time and help you better organize your personal knowledge base over the course of a long career. Let me give you two examples

Efficient development environment

We can start with editors. We have IDE vs Text Editor, Vim vs Emacs, Sublime vs Atom. Before making a choice, we should think about our goal first. We hope this is a long-term investment, this editor can be used for a long time, in the process of continuous polishing, so that it can fully adapt to their own habits, maximize editing efficiency. If the programmer is a swordsman, the editor is his sword.

Although I am a heavy user of Vim, I feel that my choice was ill-advised. If I had to do it again, my first choice would be Emacs and my second would be Atom. Emacs has been around for 30 years, the community is still alive, and its extensibility is unrivalled among editors. Elisp, the scripting language of Emacs, is also a dialect of Lisp. I think learning Lisp can improve programmers’ understanding of the core ideas of programming. Another plus point is that Emacs, with its high bar and Lisp nature, has attracted a large number of high-quality programmers to its community, and has produced such magic plugins as org-Mode. On the contrary, the essence of Vim lies in Mode editing, which is worth learning and can greatly improve the efficiency of text editing. But once you’re comfortable with the concept, I think it’s okay to move on to other editors because Vim’s architecture and Vimscript limit its extensibility. Emacs supports Mode editing very fully through the Evil plugin, and other major editors have similar plug-ins, so once you’ve mastered the concept, it can work in other editors as well. It may be argued that no Vim Emulator can achieve 100% of Vim’s functionality, but the point is not whether an instruction can be transplanted, but whether the essence of mode editing thought can be transplanted, and I think the answer is yes.

Looking at Atom vs Sublime, Atom is very scalable and most of its core functionality is implemented as a plug-in, similar to Emacs. And its open source nature makes me believe it has more longevity than Sublime.

My point about ides is that I’m not averse to ides, but each IDE serves a particular task or programming language. As an aspiring programmer, you can use an IDE, but you still need to master a powerful general-purpose editor.

Like editors, efficient development environments include shells, Launcher, window managers, document readers, and more. Some of them can be configured in very little time, and their return on investment is very high.

Information collector and notebook

The former is used to collect information generated by others, while the latter is used to collect information generated by oneself. A simple example of the former is Bookmark for browsers. You need to be able to archive a useful set of information at any time and find it quickly at some point in the future. The most obvious example of the latter is the Mac OS or iOS laptop, where the goal is to be able to record your thoughts anytime, anywhere. In essence, you need a good set of tools to do your Knowledge management, which is an external backup of your Knowledge and ideas. I personally use Evernote for both information gathering and note-taking. If you have a good process, you can use two tools to do both. But I suggest you spend enough time thinking about how to organize your personal knowledge base.

These are just two examples. What you need to do is to identify the tasks that you want to do for the long term (often not technology or company specific) and tailor the tools you need to do those tasks to the best of your ability. For another example, I pay attention to the keyboards used by the programmers around me. Only a few programmers will buy a high-end static keyboard, such as the HHKB. In my opinion, this is clearly a good investment. Programmers spend most of their time working with keyboards, and a comfortable typing experience is very rewarding, not to mention that these high-quality keyboards are very durable.

Broaden your horizons and build your technical architecture

The first step is to set a goal for yourself, just as a company sets its Vision.

  • Aim big enough so you can see more of the scenery.
  • The goal should be to solve the problem, not to master the technology. Technology is a means, not an end.

For example, “I want to be an expert in iOS Developer” is a much less meaningful goal than “I want to be an expert in front-end application development.” In the former, you’ll delve into the quirks of the iOS framework, while in the latter, you’ll start focusing on visual and interaction design, studying the differences and common trends across platforms. Obviously, the latter is more conducive to your personal development.

But even with clear goals, which technology to choose and how to learn remains a challenge in today’s information overload world. The common view is that we should learn the latest technology because the old is outdated, while the opposing view is that the new technology is not yet mature. My personal view is that when entering a field, choose the mainstream technology framework; When you have experience, it’s important to focus on the people behind the technology. I believe that great people and great teams build great products, both in commercial companies and in the open source community. Don’t worry too much about technology old and new, because it may soon be a thing of the past. What you really need to learn is the idea behind the technology. There are a number of languages and open source projects that write Coding philosophies, which are very interesting, and you can verify these Coding philosophies from their source code. In Python, for example, if you do import this you will see the concept, as well as Celery, a well-known open source library in Python, which has a section in its documentation describing its programming philosophy. They affect you more than the technology itself, and this is my advice to beginners. Similarly, I highly recommend reading the source code of a good open source library or language, such as the Python standard library, which is mostly implemented in Python and is very readable. If you learn a technology only to use it, you haven’t fully absorbed it, and the benefits of learning will disappear as the technology becomes obsolete.

Another of my learning principles is to maximize the difference between a new technology and your existing knowledge base when choosing to learn it. If you know Django, should you learn Ruby on Rails or NodeJS next? Based on this principle, you should learn NodeJS, because its asynchronous IO model is conceptually very different from Django’s synchronous model, while RoR has more in common with Django. A better choice is not to learn another Web framework, but to learn ZeroMQ or Redis, which are also very helpful for Web development, so as to maximize the difference. From the technical perspective of building a programmer, I would recommend that every program learn at least Lisp or a Functional programming language, whether or not you will use it in the foreseeable future, to give you a different perspective on programming.

Finally, I suggest that every programmer should run his or her own product, be it an app, a website or open source software. Unless you’re an early employee at a startup, you probably won’t have the opportunity to put all the technology or ideas you learn into practice. There are plenty of people who want to be full-stack engineers, and the quickest way to do that is to build your own product. Any designer will craft a Portfolio, but most programmers won’t. When evaluating the Coding ability of a programmer, I will look to see if there are any outstanding projects on Github, but most of the programmers in China have nothing on Github, or only some very simple programs. I recommend managing your Github projects to enhance your reputation as well as your future job search. When you complain about being asked a variety of irrational Coding questions in a job interview, have you ever thought that the interviewer is also very frustrated because he has no other way to know how good your Coding ability is? If every programmer had his or her own work, I think the interview of programmers would be much easier.

Pay attention to the cultivation of communication skills

When asked “what is the biggest difference between Junior Developer and Senior Developer that you learned?”, my most natural response is communication and documentation. Communication includes communication within the programmer team, communication with other teams, communication with managers, and so on. I don’t think I’m in a position to be very general about these issues, but one piece of advice I can give is to learn to talk to your Manager first and ask him to teach you the rest. Many companies have a 1:1 ratio of Manager to team members. An effective 1:1 ratio should be led by team members most of the time. This requires you to spend enough time thinking about the question to ask before 1:1, and ideally send it to the Manager one day in advance so he has a chance to think about the answer. Many people take this lightly, or ask very specific questions instead of open-ended ones, which makes it difficult to learn from your Manager. If you gradually learn how to use 1:1 time, it will be your highest ROI per hour at work.

Build your network

Everyone understands the importance of networking, but actually doing it is not easy. Attending offline meetings and events can be one of the most direct ways to network. Unfortunately, most people seem to have gone home after attending a technical lecture. Of course, this also has something to do with the time arrangement of many activities. The lecture time is too full, the tea break time is short, and sometimes the guests are late or do not control the time well, so the tea break is cancelled. In fact, meeting one or two like-minded people is far more valuable than attending a technical lecture. Next time you go to one of these conferences, set yourself a goal, such as adding at least two peers to your wechat account. It may take more time to build your network. Meet your friends for coffee after work or on the weekend.

In addition, I think everyone needs a career mentor. He can be a mentor or Manager in your first job, or someone you know. You need to have a very long-term relationship, not just for one company, but ideally for your entire career. Whenever you encounter doubts, you can always ask him for advice. I think this will be your most valuable wealth of contacts.

Find a platform for your talents

The last and most important step is to find the right company for you. There are three ways to evaluate a company as a job seeker

  • The company’s growth prospects (for large companies, look at the growth prospects of the department)
  • The team you’re joining
  • Wages and benefits

So when you’re interviewing a company, realize that it’s a two-way street, that you’re interviewing the company at the same time they’re interviewing you. You should do your homework on the company before the interview and be prepared with quality questions, such as pointing out problems with the product, asking about the development process or how to do a performance review. You can also check your interviewer’s qualifications.

Each time you choose a company, you should consider all three aspects, but the emphasis is different at different stages of your career. For example, it is most important to join a good team when you just start working, they can teach you a lot and improve your ability. After five years, you need a platform to display your talents and value, and the importance of the company’s future grows rapidly. When you have made some achievements, proved their value, gradually into the harvest, with the company’s asking price. On the other hand, team strength also has a great impact on the company’s prospects.

For a new graduate who has just entered the workplace, a question I have been asked countless times in recent years is “will MY first job be in a startup company or a large company?” My answer is still “getting on a good team is the most important thing”. In some big, well-known companies, the quality of the team is guaranteed, but in startups, the quality of the team is uneven, so as I said before you need to interview the team and make your own judgment. But in addition to the team factor, I’d like to mention a few benefits of graduating to a startup. First of all, in the period of time after graduation, economic pressure is low, it is the most free and most able to bear risks, and this period of time is often not long, so we should seize the golden time to start a business. Secondly, after entering big companies, all students will hold junior positions, which to some extent is a continuation of school learning. They are standardized and organized, but lack independence and innovation, which is exactly what most Students in China lack. These skills can be developed quickly at a startup, whereas at a large company they may not be available until you reach a mid-level position. Personal opinion, for reference only.

summary

I think the first three years of your career are especially important for your future development, and I hope this article will help young programmers. Comments are welcome!