The Mythical 5%

本文探讨了如何成为最顶尖5%的程序员,强调了持续学习的重要性,并指出这5%的程序员比其他人效率高出20倍。文章还分析了软件项目失败的原因,并提供了提高生产力的实用建议。

http://www.artima.com/weblogs/viewpost.jsp?thread=221622

 

Computing Thoughts
The Mythical 5%
by Bruce Eckel
December 28, 2007
Summary
In November, I gave the commencement address for Neumont University, a school in Salt Lake City dedicated to teaching computer science where my coauthor lectures. This is that speech.

 

So here you are, about to be unleashed upon the world. This is a lot like taking someone and teaching them all the parts of English speech and then saying "go out and write stories," but it's probably all any school can do. And a more theoretical background wouldn't help; this is not to say theory is bad because you'll need some eventually but there's a recent movement that preaches "practice before theory" and I, apparently like Neumont, find that knowing how to do something is very helpful when trying to understand the theory behind it -- for me, the theory takes a lot longer to grasp and it's very useful to be able to be functional while my brain is catching up.

There's only so much you can learn in school, and it's only tenuously connected with what you will end up doing in your work. So I'm going to try to soften the blow a little, and arm you with a few insights that will help when you crash into the actual world of software development.

You've come from very structured learning. We even call it a science. It promises that there will be the same kind of structure and activities in the world. More importantly, you've come to expect a certain high level of success, similar to what you've experienced with your projects and assignments. But the world will not behave.

The statistics are sobering: 50-80% of programming projects fail. These numbers are so broad because people don't brag about their failures, so we have to guess. In any event, this makes the world sound pretty unreliable. Engineering gets better results, mostly because it has to. Bad software usually just annoys people but bad engineering can kill.

An even more fascinating metric is this: 5% of programmers are 20x more productive than the other 95%. If this were a science, like it claims, we could figure out how to get everyone to the same level.

Let's say that this follows the 80-20 rule. Roughly 80% of programmers don't read books, don't go to conferences, don't continue learning, don't do anything but what they covered in college. Maybe they've gotten a job in a big company where they can do the same thing over and over. The other 20% struggle with their profession: they read, try to learn things, listen to podcasts, go to user group meetings and sometimes a conference. 80% of this 20% are not very successful yet; they're still beginning, still trying. The other 20% of this 20% -- that's about 5% of the whole who are 20x more productive.

So how do you become one of these mythical 5%?

These people are not those who can remember all the moves and have fingers that fly over the keyboard erupting system commands. In my experience those in the 5% must struggle to get there, and struggle to stay there, and it's the process of continuous learning that makes the difference.

Because of what I do, I've met more than my share of these people. They read a lot, and are always ready to tackle a new concept if it looks worthwhile. I think if they do go to conferences they're very selective about it. Most of their time is spent being productive, figuring things out.

The big issue is knowing that you're going after that 20x productivity increase. Which means getting leverage on everything you do. Never just "bashing something out," but using the best tools, techniques, and ideas at your disposal. Always doing your best.

And deeper than that, understanding that the leverage point doesn't always come from the obvious thing, or from what we've been told, or the commonly-held belief about what works. Being able to analyze and understand a situation and discover the hinge points of a problem is essential; this takes a clear mind and detached perspective. For example, sometimes the choice of programming language makes a huge difference, but often, it's relatively unimportant. Regardless, people will still spend all their time on one decision while something else might actually have a far greater influence. Architectural decisions, for example.

So you must learn continuously and teach yourself new technologies, but it's not that simple. It's definitely good to learn more about programming, but you can't just learn more about programming. For example, just in the world of code, here are two of the biggest pain points:

  1. Code is read much more than it is written. If people can't read your story, they can't improve it or fix it. Unreadable code has a real cost, and we call it "technical debt."
  2. Code reviews are the most effective ways to find software defects, and yet we usually "don't have time for them."

Coming from the world of ones and zeroes we'd like to believe that things are deterministic, that we can provide a set of inputs and get the same outputs every time. I know because I believed this for a long time, and it took some hard knocks when I was a physics undergraduate to begin -- only to begin -- to wake me up. Many years later I was in a workshop and one of the other attendees told me what I had been learning all those years; she said "All models are wrong. Some are useful."

We are in a young business. Primitive, really -- we don't know much about what works, and we keep thinking we've found the silver bullet that solves all problems. As a result, we go through these multi-year boom and bust cycles as new ideas come in, take off, exceed their grasp, then run out of steam. But some ideas seem to have staying power. For example, a lot of the ideas in agile methodologies seem to be making some real impacts in productivity and quality. This is because they focus more on the issues of people working together and less on technologies.

A man I've learned much from, Gerald Weinberg, wrote his first couple of books on the technology of programming. Then he switched, and wrote or coauthored 50 more on the process of programming, and he is most famous for saying "no matter what they tell you, it's always a people problem."

Usually the things that make or break a project are process and people issues. The way that you work on a day-to-day basis. Who your architects are, who your managers are, and who you are working with on the programming team. How you communicate, and most importantly how you solve process and people problems when they come up. The fastest way to get stuck is to think that it's all about the technology and to believe that you can ram your way through the other things. Those other things are the most likely ones to stop you cold.

In my first jobs, I saw lots of managers making stupid decisions, and so, logically, I came to the conclusion that managers and management was stupid. It's a commonly held belief in our profession: if you're not smart enough to deal with the technology, you go into management. Over time I very slowly learned that the task of management wasn't stupid, it's just very, very hard. That's why all those stupid decisions are still being made; management is much harder than technology because it involves virtually no deterministic factors. It's all guesswork, so if you don't have good intuition you'll probably make stupid decisions. Napoleon wanted lucky generals rather than smart ones.

Here's an example: some companies have adopted a policy where at the end of some predetermined period each team evaluates everyone and drops the bottom 10% or 20%. In response to this policy, a smart manager who has a good team hires extra people who can be thrown overboard without damaging the team. I think I know someone to whom this happened at Novell. It's not a good policy; in fact it's abusive and eats away at company morale from within. But it's one of the things you probably didn't learn here, and yet the kind of thing you need to know, even if it seems to have nothing directly to do with programming.

Here's another example: People are going to ask you the shortest possible time it takes to accomplish a particular task. You'll do your best to guess what that is, and they'll assume you can actually do it. What you need to tell them for an estimate like this, and for all your estimates, is that there's a 0% probability that you will actually get it done in that period of time, that such a guess is only the beginning of the probability curve. Each guess needs to be accompanied by such a probability curve, so that all the probabilities combined produce a real curve indicating when the project might likely be done. You can learn more about this by reading a small book called Waltzing with Bears .

You need to pay attention to economics and business, both of which are far-from-exact sciences. Listen to books and lectures on tape while you commute. Understanding the underlying business issues may allow you to detect the fortunes of the company you're working for and take action early. When I first started working I looked askance at people who paid attention to business issues -- that was suit stuff, not real technology. But those people were the smart ones.

A great new source of information is podcasts. Anyone can do these so many of them are bad, but there are some real gems out there, podcasts that specifically cover topics in our profession. I learn a lot from these, and they help me stay current.

Here's another thing you probably didn't learn here. Both the world of business and the world of programming is legendary for flailing about with fads that promise to get things done better. The easy fads are patently ridiculous, or become so in short order. The harder ones to spot contain some reason or truth that prevents you from quickly dismissing them. Sometimes you need to pick out the good stuff and throw the rest away, and to do this you need to exercise critical thinking.

I saw a grocery bag that said "studies show children and teens who eat dinner with their families at least 5 times a week are 50% less likely to use alcohol." The bag's conclusion was to start eating dinner together and that will prevent alcoholism. Is eating dinner together the dominant factor? Or is there something else that causes both eating dinner together and reduced alcoholism?

Here are some more which many people have seriously believed:

  • Companies don't have to make a profit anymore. It's the new economy.
  • Real estate always goes up, even if salaries don't.
  • Or even: A university must be a traditional campus and not an office building.

It's even harder when you come from the world of ones and zeros where we really, really want to believe that everything can be deterministic. It's harder than that when you understand that adding people into the mix and scaling up a system changes the dominant factors, while everyone around you still believes it should all be deterministic.

There's a book that uses studies to debunk beliefs about managing people and projects; it happens to be software-based but the thinking could be applied almost everywhere. This book is called Peopleware ; it's small and fun to read and I recommend it to almost everyone. Alas, it really isn't a book of answers, it just firmly destroys many closely-held ideas about how people work in business situations that involve programming. The best thing about it is that it reminds you how easy it is to take a wrong idea and build a bad world around it. It helps you ask questions.

So when you go into your new job with your head filled with technical knowledge from the last couple of years, and you add what I've told you today, you may be tempted to assume that everyone at the company has foolishly gotten themselves trapped with bad ideas. But there's one more very important maxim from Gerald Weinberg which doesn't really answer anything as much as gives you a way to understand what happens. He says: "Things are the way they are because they got that way ... one logical step at a time." It's the legendary frog in the saucepan. So from your fresh new perspective things might look ridiculous, but remember that each decision on the way was made by someone weighing the issues and making what seemed like the best choice at the time. This viewpoint doesn't solve the problem but it can make you more compassionate about the people who are stuck there.

You'll need to make a lot of mistakes in order to figure things out. So be humble, and keep asking questions.

源码地址: https://pan.quark.cn/s/a741d0e96f0e 在Android应用开发过程中,构建具有视觉吸引力的用户界面扮演着关键角色,卡片效果(CardView)作为一种常见的设计组件,经常被应用于信息展示或实现滑动浏览功能,例如在Google Play商店中应用推荐的部分。 提及的“一行代码实现ViewPager卡片效果”实际上是指通过简便的方法将CardView与ViewPager整合,从而构建一个可滑动切换的卡片式布局。 接下来我们将深入探讨如何达成这一功能,并拓展相关的Android UI设计及编程知识。 首先需要明确CardView和ViewPager这两个组件的功能。 CardView是Android支持库中的一个视图容器,它提供了一种便捷定制的“卡片”样式,能够包含阴影、圆角以及内容间距等效果,使得内容呈现为悬浮在屏幕表面的形式。 而ViewPager是一个支持左右滑动查看多个页面的控件,通常用于实现类似轮播图或Tab滑动切换的应用场景。 为了实现“一行代码实现ViewPager卡片效果”,首要步骤是确保项目已配置必要的依赖项。 在build.gradle文件中,应加入以下依赖声明:```groovydependencies { implementation androidx.recyclerview:recyclerview:1.2.1 implementation androidx.cardview:cardview:1.0.0}```随后,需要设计一个CardView的布局文件。 在res/layout目录下,创建一个XML布局文件,比如命名为`card_item.xml`,并定义CardView及其内部结构:```xml<and...
下载前可以先看下教程 https://pan.quark.cn/s/fe65075d5bfd 在电子技术领域,熟练运用一系列专业术语对于深入理解和有效应用相关技术具有决定性意义。 以下内容详细阐述了部分电子技术术语,这些术语覆盖了从基础电子元件到高级系统功能等多个层面,旨在为读者提供系统且全面的认知。 ### 执行器(Actuator)执行器是一种能够将电能、液压能或气压能等能量形式转化为机械运动或作用力的装置,主要用于操控物理过程。 在自动化与控制系统领域,执行器常被部署以执行精确动作,例如控制阀门的开闭、驱动电机的旋转等。 ### 放大器(Amplifier)放大器作为电子电路的核心组成部分,其根本功能是提升输入信号的幅度,使其具备驱动负载或满足后续电路运作的能力。 放大器的种类繁多,包括电压放大器和功率放大器等,它们在音频处理、通信系统、信号处理等多个领域得到广泛应用。 ### 衰减(Attenuation)衰减描述的是信号在传输过程中能量逐渐减弱的现象,通常由介质吸收、散射或辐射等因素引发。 在电信号传输、光纤通信以及无线通信领域,衰减是影响信号质量的关键因素之一,需要通过合理的设计和材料选择来最小化其影响。 ### 开线放大器(Antenna Amplifier)开线放大器特指用于增强天线接收信号强度的专用放大器,常见于无线电通信和电视广播行业。 它通常配置在接收设备的前端,旨在提升微弱信号的幅度,从而优化接收效果。 ### 建筑声学(Architectural Acoustics)建筑声学研究声音在建筑物内部的传播规律及其对人类听觉体验的影响。 该领域涉及声波的反射、吸收和透射等物理现象,致力于营造舒适且健康的听觉空间,适用于音乐厅、会议室、住宅等场所的设计需求。 ### 模拟控制...
先看效果: https://pan.quark.cn/s/463a29bca497 《基坑维护施工组织方案》是一项关键性资料,其中详细阐述了在开展建筑施工过程中,针对基坑实施安全防护的具体措施与操作流程。 基坑维护作为建筑工程中不可或缺的一部分,其成效直接关联到整个工程的安全性、施工进度以及周边环境可能产生的影响。 以下内容基于该压缩包文件的核心信息,对相关技术要点进行了系统性的阐释:1. **基坑工程概述**:基坑工程指的是在地面以下构建的临时性作业空间,主要用途是建造建筑物的基础部分。 当基坑挖掘完成之后,必须对周边土壤实施加固处理,以避免土体出现滑动或坍塌现象,从而保障施工的安全性。 2. **基坑分类**:根据地质状况、建筑规模以及施工方式的不同,基坑可以被划分为多种不同的类别,例如放坡式基坑、设置有支护结构的基坑(包括钢板桩、地下连续墙等类型)以及采用降水措施的基坑等。 3. **基坑规划**:在规划阶段,需要综合考量基坑的挖掘深度、地下水位状况、土壤特性以及邻近建筑物的距离等要素,从而制定出科学合理的支护结构计划。 此外,还需进行稳定性评估,以确保在施工期间基坑不会出现失稳问题。 4. **施工安排**:施工组织计划详细规定了基坑挖掘、支护结构部署、降水措施应用、监测与检测、应急响应等各个阶段的工作顺序、时间表以及人员安排,旨在保障施工过程的有序推进。 5. **支护构造**:基坑的支护通常包含挡土构造(例如土钉墙、锚杆、支撑梁)和防水构造(如防渗帷幕),其主要功能是防止土体向侧面移动,维持基坑的稳定状态。 6. **降水方法**:在地下水位较高的区域,基坑维护工作可能需要采用降水手段,例如采用井点降水技术或设置集水坑进行排水,目的是降低地下水位,防止基坑内部积水对...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值