How Programmers Can Control Their Careers

Time: Column:Blog views:276

In my twenty-plus years of experience, I've witnessed many technological changes and shifts in business models. The technologies we old programmers have dealt with are even more diverse than what today’s programmers encounter. Let me list some of the technologies I've learned that have since been phased out:

  • MIS Application Development: FoxPro, PowerBuilder, Delphi

  • OA: Lotus Notes, VBScripts

  • Microsoft: ODBC/ADO, COM/DCOM, MFC/ATL, J++

  • Servers: AIX, HP-UX, SCO Unix

  • Web: CGI, ISAPI, SOAP

  • RPC: CICS, Tuxedo

  • J2EE: WebSphere, WebLogic

  • DB: Sybase, Informix

I want to emphasize that regardless of the past or present, both old and new programmers face similar challenges and anxieties regarding technology. Back then, we not only worked 996 hours but also had closed development environments (only going home once a week). The only advantage was that, compared to today’s programmers, we didn’t have distractions like WeChat, Facebook, or TikTok consuming our lives. Our work, life, and growth were efficient—we weren’t interrupted and enjoyed reading. Of course, we didn’t have platforms like Stack Overflow or GitHub, so the quality of our outputs was generally average.

This isn’t about comparing generations; rather, it’s to highlight that both face unique challenges, with similarities and differences. Throughout our growth, there are many commonalities, fundamentally revolving around three key points:

  1. Understanding Technology and Trends: To navigate changes, one needs to grasp the general rules and development trends of the world, as well as self-awareness regarding one's suitability for certain tasks. It’s essential to identify your area of expertise within these trends.

  2. Solid Foundation: A strong foundation enables adaptability regardless of how the world changes. Those who understand the principles can achieve things and solve problems at a much higher level than those who do not.

  3. Efficiency in Growth: Today’s pace is much faster than twenty years ago, with technologies emerging rapidly. Thus, our growth must be more efficient. Efficiency isn’t just about speed; it’s about how effectively we can learn and apply useful skills—this is another crucial aspect we need to master.


Global Development Trends

In my personal experience, the information revolution can be divided into three stages:

  1. 1990s to 2000: This era, known as the MB era, was dominated by portal websites like Yahoo, Sina, Sohu, and Netease. During this time, Internet Service Providers (ISPs) and Internet Content Providers (ICPs) digitized information and published it online.

  2. 2000 to 2010: Referred to as the GB era or the multimedia/UGC (User Generated Content) era, internet access became more widespread. People began to own more digital devices, enabling them to upload photos and videos, and engage in online social activities.

  3. 2010 to 2020: Known as the TB era, this decade marked the rise of mobile internet, allowing users to stay connected without relying on computers. With mobile devices always online, a variety of personal data was continuously collected. As users accessed the internet, their behaviors became digitized.

All hardware and software evolved in response to the increasing amount of data to be processed, leading to demands for larger bandwidth, bigger hard drives, and more processors. Eventually, the technological infrastructure had to adopt distributed architectures, and when data centers could no longer handle the load, distributed edge computing was introduced.

On the business side, we can see a continuous trend of digitalization across the globe. Once something is digitized, it can be replicated, disseminated, and computed. With computation, mathematical modeling can occur, leading to automation; once automation is in place, scalability becomes possible, ultimately transforming entire industries. The overarching trend in modern human history focuses on solving energy and automation issues. Continuous energy supply is the prerequisite for machines to work tirelessly, replacing both animals and humans in labor.

Thus, the evolutionary pattern of technology fundamentally revolves around automation and scalability, which reduces costs and enhances efficiency. This is why the world is speeding up, and humans are struggling to keep pace—society is increasingly driven by machines and data.

Talent Demand

In this process, what kind of people are needed? Here are my insights:

  1. Technicians: In the face of machines and automation, there’s a clear need for skilled workers who can operate these machines. Commonly referred to as "code farmers" in programming circles, they are not true engineers but merely operators of computer programs. As the technical barriers lower or the nature of technology changes, they may become less valuable, potentially facing obsolescence.

  2. Specialized Workers: These individuals understand principles and solve specific, complex technical issues. They are less likely to be replaced by technology since their understanding of underlying principles equips them with problem-solving capabilities.

  3. Engineers: These professionals not only utilize technology but also ensure quality execution. They believe that maintaining code takes precedence, employing various methods and techniques to continually improve code readability, scalability, maintainability, and reusability. This process seems endless. We refer to those with "perfectionist tendencies," "craftsmanship," and "refinement" as engineers. They work efficiently and reliably, developing useful tools and methodologies.

  4. Designers and Architects: These individuals focus on creating tools, frameworks, and models that enhance software development and maintenance efficiency while improving user experience, stability, performance, and code reuse. Their work lowers technical barriers, making technology accessible to a broader range of workers.

  5. Managers: Managers primarily organize teams, complete projects, and generate profits. This group includes frontline leaders as well as higher-level executives. Regardless of their rank, they act as the "glue" that brings teams or companies together, becoming more valuable in larger organizations.

This summary outlines the talent needed in today's world. Understanding these roles helps us recognize the challenges we face and identify where we should direct our efforts.

Google SRE Self-Assessment

Next, let’s examine Google’s SRE self-assessment scorecard:

  • 0: Unfamiliar with the relevant technical field.

  • 1: Understands basic knowledge in the field.

  • 2: Can implement small changes, understands basic principles, and can find more details with simple guidance.

  • 3: Proficient in the technical field, requiring no assistance.

  • 4: Very comfortable with the technical field and capable of handling all daily tasks.

For software:Able to develop medium-scale programs and proficiently use all language features without needing to refer to manuals, while also finding obscure knowledge.

For systems:Possesses foundational knowledge of network and system administration and can manage a small network system, including recovery, debugging, and resolving uncommon issues.

  • 5: Deep understanding of the technical field and advanced skills.

  • 6: Capable of developing large-scale programs and systems from scratch, mastering underlying principles, and designing and deploying large-scale distributed system architectures.

  • 7: Understands and can leverage advanced technologies and their principles, fundamentally automating substantial system management and operations tasks.

  • 8: Has deep understanding and experience with obscure technologies, protocols, and system workings. Can design, deploy, and manage critical and large-scale infrastructure, building corresponding automation facilities.

  • 9: Capable of writing a classic book in the technical field and working with standard committees to formulate relevant technical standards and methods.

  • 10: Has authored a book in the field, recognized as an expert, and is an inventor of the technology.

SRE candidates should self-assess on the following skills:

  • TCP/IP Networking (OSI stack, DNS, etc.)

  • Unix/Linux internals

  • Unix/Linux Systems administration

  • Algorithms and Data Structures

  • C/C++

  • Python

  • Java

  • Perl

  • Go

  • Shell Scripting (sh, Bash, ksh, csh)

  • SQL and/or Database Administration

  • Scripting language of your choice (not already mentioned) _____________

  • People Management

  • Project Management

This scorecard serves as a self-assessment tool for candidates before interviewing at Google, measuring their technical capabilities across 11 levels. I have categorized them into four major tiers to provide a reference standard for skill improvement.


Knowing Yourself

Having understood how the world develops and the various types and levels of technical professionals, it's essential to know yourself. Without self-awareness, you won't be able to find your path or your suitable place in the world.

I believe that recognizing oneself involves understanding one’s strengths, interests, passions, and areas of expertise. Here’s a standard method for self-discovery:

  1. Strengths: First, identify your strengths. Recognize what you excel at, what talents you have that set you apart. Compete based on your unique capabilities. Find tasks you can accomplish and areas where others seek your advice. If people around you turn to you for guidance, it indicates you have a strength. Identifying your strengths is crucial—capitalize on them and avoid your weaknesses.

  2. Interests: If you haven't identified your strengths, focus on what interests you and ignites your passion. What defines an interest? It's something you wouldn’t abandon, no matter how challenging it becomes. If you give up when faced with difficulties, that’s not genuine interest—it's superficial enthusiasm. Being deeply immersed in something, even without a particular strength, can still make you a top talent.

  3. Methods: If you lack strengths, interests, or passion, focus on learning methods. This involves time management, planning, and understanding how to summarize past experiences and mistakes. Cultivating curiosity and seeking answers independently are essential strategies.

  4. Diligence: If you have no strengths, interests, or methods, the only option left is hard work. However, diligence alone may lead to exhaustion and increase the risk of being outpaced by younger, more ambitious individuals. As you age, diligence may become less valuable, especially as younger people outwork you for less reward. Hard work is the least valuable commodity, but at the very least, it allows you to sustain yourself.

To adapt to future technological changes, individuals must sift through layers of strengths, interests, and methods. If these are absent, then one must rely on diligence and accept whatever “blessings” come their way.

From my perspective, I don’t consider myself particularly smart, but I do have a keen interest in technology and am not afraid of challenges. While some find it easy to grasp complex technologies within a month, it might take me six months. But that's okay; knowledge is static. As long as you face difficulties head-on, you will eventually understand. The most frightening thing is to shy away from challenges and make excuses for yourself; that is not a productive mindset.

Building a Strong Foundation

As I mentioned earlier, my experience with various obsolete technologies can be disorienting. However, I previously referenced the "Google scorecard," which emphasizes the importance of fundamental principles. To effectively address future changes, a key strategy is to be adaptable and rely on core concepts.

Changes are often superficial; the underlying principles do not change significantly. Theoretical foundations remain stable, while superficial forms may vary daily. Therefore, to tackle such changes, one must solidify their foundational knowledge and enhance their skills. This includes understanding programming methodologies, design patterns, and improving code reusability. To increase code reusability, one must learn to decouple concepts and elevate abstraction—these are foundational technical skills applicable across languages.

A solid foundation allows for breakthroughs. Without it, progress becomes impossible. In the technical world, accumulating quantity does not lead to qualitative change. Knowledge is like building with bricks; no matter how many you lay, you cannot become an architect without understanding the principles and scientific methods behind it. Just as mastering calculus can dramatically enhance your problem-solving skills, foundational knowledge is indispensable.

Thus, you must study fundamental theoretical knowledge and learn problem-solving approaches. If you only skim the surface, you will find that once a technology evolves, your previous learning may become obsolete, requiring you to start from scratch. Mastering foundational knowledge allows you to uncover answers and insights, as foundational concepts are abstract and inductive, facilitating further inference. Many technologies ultimately rest on foundational principles. Regardless of whether it's Java or another language, they all rely on similar underlying principles, making it vital to grasp these concepts.

I categorize foundational knowledge into four areas:

  1. Programming Languages: Principles of languages, library implementations, programming techniques (concurrency, asynchronous programming, etc.), programming paradigms, and design patterns.

  2. System Principles: Computer systems, operating systems, network protocols, database principles, etc.

  3. Middleware: Message queues, caching systems, gateway proxies, scheduling systems, etc.

  4. Theoretical Knowledge: Algorithms and data structures, database normalization, seven-layer network models, distributed systems, etc.

These topics are what a computer science student is expected to learn. Unfortunately, many educational institutions fail to teach these effectively, with instructors lacking expertise and not utilizing the best textbooks available, often opting to write their own flawed materials. If the resources you use for study are inadequate, your learning efficiency will suffer. This is why many graduates still find themselves feeling lost when entering the workforce.

Even self-learning these foundational technologies typically requires four to five years of dedicated effort. After twenty years in the industry, I can confirm that these core principles have not changed. Regardless of how the formats evolve, the fundamentals remain constant; theoretical innovation is challenging, and staying true to core principles is essential.

Learning Efficiency

How Programmers Can Control Their Careers

When discussing learning efficiency, it’s essential to refer to the learning pyramid. This illustrates that learning methods can be categorized into two layers: passive learning (listening, reading, audiovisual materials, demonstrations) and active learning (discussions, hands-on practice, teaching others). Active learning is what we consider deep learning; without it, genuine knowledge cannot be acquired. This explains why you might often feel that "learning so much is pointless if I forget it all." That is a symptom of shallow learning.

Here are some effective learning strategies I recommend:

  1. Select Primary Sources of Knowledge and Information: When it comes to learning methods, first, seek knowledge from primary sources. Secondary information often loses significant value. For instance, many insights are lost in translations or adaptations of original texts. Much of the leading knowledge in computer science originates from abroad, making proficiency in English crucial. I encourage everyone to read original materials; if your English isn't strong, at least refer to well-translated works, avoiding second-hand interpretations that dilute your understanding.

  2. Focus on Principles and Fundamentals: Even if you forget specific technologies, keep foundational principles in mind. If you can understand the core concepts, you’ll be able to implement them independently and more rapidly learn related technologies. Mastering C and C++ will facilitate a quicker understanding of Java and Go.

  3. Utilize Knowledge Graphs: Learn to structure knowledge. Start from a key technical point and continuously relate and refine it. For example, when studying the TCP protocol, first memorize its state diagram and how connections are established and terminated. Then understand how TCP ensures reliability, such as how packet loss is managed. This approach allows you to traverse the entire topic of TCP systematically.

  4. Learn by Analogy: Use different methods to study a concept. For instance, studying the TCP protocol can be done through reading, programming, and debugging. This multifaceted approach deepens your familiarity with the topic while expanding your knowledge base.

  5. Summarize and Induct: Developing a habit of summarizing and generalizing helps establish your own thinking framework, methodologies, and approaches. For instance, when learning a new language—be it Go or Rust—understand how memory management works, data types, and generics before diving into concurrency and abstraction techniques.

  6. Practice and Persistence: Ultimately, practice is crucial. Experience comes from doing; skills develop through application. You must convert knowledge into skills through consistent practice, similar to how elementary students learn addition and subtraction through repeated exercises. Prioritize good knowledge sources, focus on foundational principles, and invest time in mastering the basics.

Conclusion

As we conclude this article, let’s summarize: if you want to better navigate the era and enhance yourself, you need to understand the trends of the times, the types of individuals needed, the abilities they require, and how to acquire those abilities. Investing in foundational knowledge is akin to “infrastructure development.” If your foundations are weak, you won't be able to grow. Adaptability in learning is a crucial foundational skill in this fast-paced era; without good learning capabilities, you risk being left behind.

These insights reflect my twenty years in the industry, and I hope they prove useful to you.