Forty-five times faster at programming
imprompt.us
imprompt.us
- The professor gets to pick the problems; of course he picks ones he can solve quickly and easily.
- The students are taking a class from this professor; presumably they lack certain skills or knowledge which he has, and which will be developed during the assignments.
When we normally observe '10X' differences in programmer productivity, it's not the case that one of the programmers being measured is picking the tasks for all the others, and that the others being tested are selected on the basis of not knowing (or having only recently been introduced to) central concepts required for those tasks. Even if his measurement of the students' programming time is solid, and even ignoring that he and his students have different incentives (his students don't necessarily benefit from speeding through assignments), of course you see a dramatically wider difference in programming speed in this case than in most contexts.
Maybe the guy is trying to be a better teacher? Maybe he thinks that there is a real effect aside from the selection effect you observe, and is trying to maximize his teaching? Maybe he just wants his students to do well?
I submit that the answer to all these is yes. My evidence is that fact that the article ends with questions about how people learn to program well so he can incorporate it into his course.
You don't need a study to figure that out. When your project needs help in a specific area, just hire someone who is an expert in the area. No matter if that person is clever or even talented: As long as (s)he is clearly experienced in that field, (s)he will work a lot more efficiently than anyone else in your team.
And of course you should have someone in your present team working with him/her or at least reading and adapting her/his code, so you get more people of your team up to speed. Also, that way you'll notice timely in case the expert status isn't justified (i.e. in case the "expert" wasn't one).
The reason believe this meme is destructive is because it mostly powers the approach of "if there's a problem with the development process, it's because we have the wrong people" rather than "we have the wrong methodology, we have a broken relationship between customer and programmer" or any approach that could get your existing people working smarter.
In any case, A computer science teacher should, at least, be well aware that a post like this is feeding the meme.
Concomitantly, anything that debunks the meme is worthwhile.
Of the people I personally know, there's absolutely no circumstances under which the slower developers could reach 1/5th of the speed of the fastest developers. There's just a huge gap and it's not just methodology. If you haven't witnessed it, you must have been put in very homogeneous environments.
One exception to this is when workflow/task splitting is properly done. Then the "good devs" can do the hard stuff, and create the toolset/primitives for the rest to used to build the product. This split will make the "lesser" devs more productive while making the "good devs" the same amount of productive.
However, a team's productivity can be made N times greater if said adopts a coherent process, including education to fill in the gaps of "unproductive" programmers.
It is certainly true that a certain percentage of unproductive programmers would rather quit than upgrade themselves. I've worked with them. But a management approach of demanding a willingness to learn will give you an environment 100x more pleasant than a management approach of shouting "we want A-players". And said approach might indeed improve the total productivity of the team.
But at least in some of the cases I know, the difference in productivity is based on a couple of extra decades of intensive experience (fanatic code-all-day experience) and does not get narrowed down significantly by studying new techniques.
I agree these are the outliers, though.
There is, however, a massive (orders of magnitude) difference on impact that the better programmers have. And that largely comes with being familiar with high-leverage development practices, being willing to apply them, and being alert to opportunities where a process can generalize to a large scale and investments in automation are worth it. So for example, one programmer might spend a couple hours tracking down a bug, while another programmer spends a week improving the compiler's diagnostics and then a couple days writing a script that applies that and automatically fixes several hundred occurrences of the bug across the codebase. One programmer might spend a month refactoring 30 or so source files, while another programmer spends that month writing a script that fixes 5000 source files. One programmer might waste 6 years of his life writing Web 2.0 startups that nobody uses, while another might spend 6 years of his life inventing Google.
These are all teachable skills, but they can take a while to teach, particularly the ones that rely upon judgment.
The students are much slower than the professor, but they may learn much more than the professor. So I don't think speed them up is really important.
I really don't like speed because there's a quality difference, too. I may not necessarily beat a fresh-out-of-college kid on some task on straight clock-time, but where theirs is bodged together, barely functional, and already extended to the maximum limit, mine will have a strong unit testing suite, be efficient, extensible, scalable, fewer bugs, probably even fewer features in places I know they shouldn't be, less code overall (despite the unit test suite), etc. And there will be tasks I can complete that they can't even get close to; what's the multiplicative difference between "I built a scalable system that serves millions" vs "I couldn't get the system to do anything useful" in the same time period? The productivity differences are really more about quality than raw speed. There are speed differences, certainly, but I think it's dominated by the quality difference.
What made me faster? Copy, paste, and a healthy repository of stuff to copy and paste.
"I still think that one of the finest tests of programming ability is to hand the programmer about 30 pages of code and see how quickly he can read through and understand it... A lot of people would say, "I want days and days to read this." A really good programmer would say, "Let me take that home with me. I'll just spend an hour tonight and go through the whole thing". The difference of ability there is vast."
But, I will. Since it's the Internet and all...
One of the things I find intensely irritating is the presumption that classroom effects significantly correlate with industry effects.
Many/most students are still learning. It takes years to really start getting on top of your game. Further, even if the students are highly competent, e.g., a typical "young hacker", the activities are very small and limited.
So studies and anecdotes (plural of anecdote is not data) regarding student or professional performance in a classroom environment just isn't realistic.
- Learn the idioms of the programming language and problem domain(s)
- Keep your hands on the keyboard and OFF the mouse
- Get the best set of tools you can and learn to use them like an extension of your own body. If you have to stop and think how to use your tools then you lose any momentum you have thinking about the actual problem. (Pro tip: start by learning to touch type, then editor hotkeys.)
- Anytime you solve a new problem. Spend time afterward making a more general solution. Then file that solution in a snippets file, utility library, or wherever is the first place you're likely to look for it when you need it
One way you can improve things is to provide a framework for each of the assigned problems, either a program with stubbs or a working program which can be adapted to solve the assigned problem. I don't know how you teach students to throw away code rather than trying to make it work. Finally, teach programming rather than the programming language.
I also have found that having many small assignment works better than having a few larger projects. When I taught beginning programming I assigned on or two small programs per class meeting whereas the other sections had three larger projects. It is also useful to have the small assignments provide a library of abstractions (procedures) which can be used in later assignments. I also think it is useful to teach test focused programming where student need to present tests which validate their program as well as the program. These days I'd be tempted to require students use one of the source code control systems, probably Mecurial.
Although I usually code in a basic text editor, Java is one of those languages in which I personally found setting up and getting familiar with a good IDE makes a huge difference. Back at University, my pure CS professors initially discouraged us from using Eclipse, Netbeans, etc. They certainly didn't want to teach us how to use them.
I also taught an introduction to the Korn shell and Unix environment. Since shells have a REPL, you can make an easy shift from entering commands to putting a list of commands in a file and running it. Super helpful for learning. Not possible with Java.
If the answer is the first, nothing beats hours of hacking and curiosity to learn in their free time.
However, if the answer is the second, maybe another approach could be used. For instance, is it really important to know the syntax of all small details if those students won't even use it? (Remember, I'm assuming it's more of an introduction).
Maybe, something more educational, would be to have a bigger view of what software engineer is. Talking about the re-usability of modules, the different platforms/languages/patterns/paradigms or real world example huge projects. This way, the student will get a way better "feeling" of what programming is rather than trying to get a theoretical/trivial program to compile due to lack of experiences in that field.
Another suggestion would be to give the students a better set of high level tools to solve bigger problems. Let them have the role of a software architect working for Apple which is working on the next version of iPhone. So, instead of focusing on the small details, the student choose the features, carefully design the UI, think in terms of money/time, etc.
Why need that be true? There's nothing in the nature of the problem to prevent there being a method for improving skills at a rate faster than hours spent hacking would. I just don't know what it might look like.
It's definitely the case that small study groups can accelerate learning, but it's so dependent on the composition of the groups that I don't think it's generalisable reliably. Dedicated one-on-one tuition can be astonishingly effective, but it's highly dependent on the tutor and again, not generalisable until we can figure out how to efficiently train tutors.
Another analogy. Poetry & Programing have a lot in common. Once you learn to write it, creation is easy; good creations take practice & skill. Iteration is key.
Speed is worth teaching (ask any manager).
Being able to solve small problems fast makes one capable of solving complex problems (divide and conquer).
The one thing a professor aught to have in spades above his students is experience. And the only thing that speeds up a programmer, simply, is past experience. Being able to recognize patterns and problems and having a general idea of their solutions is 90% of the programmer's ordeal.
It's only reasonable to expect students to require a non trivial amount of "working it out time" as it's something all programmers go through. The first time you experience a problem of a specific nature you need to contemplate, research and explore the subject trying to flesh out the underlying logic of the problem. After which, you can finally devise a proper solution.
Its also important not to forget that as an experienced programmer you have the discipline to break problems down into smaller manageable components. Students, on the other hand, often are stuck blinded from the trees by the forest. Rather, they are daunted and intimidated by the entire problem set.
I also have to reluctantly point out, that the education for programming at Jr. and Sr. level classes is quite poor. It's kind of a scam. It's paradoxically too brief, too broad, too specific too general all at the same time. From experience, anything sub 400 level classes were simply credit padding courses. For programmers, real programmers that are actually curious and excited by programming who actually invest personal time to explore and enrich their knowledge of the subject as a hobby will get very little out of those courses. They have to sit through instruction on conditional programming, worse sit through hours of insane questions of incomprehension on simple if, else, for and while loops. By the end of the course, you get to do one interesting assignment, it's what the entire course was building up to, and all it is is a generic useless implementation of some common design pattern. The apex of those courses for me were doubly-linked lists, stacks, and knowing how to implement Huffman encoding. All of which I could have figured out on my own. The other type of programmer, the programmer by career appeal--the programmer who thinks I'll just take a couple college courses and land a cushy high paying job, these courses offer them basically nothing aside from an introduction to language syntax. The ugly truth of the matter is that the language portion of coding, the syntax and grammar is the smallest most inconsequential portion of programming--It's simply the tip of the ice-burg. What lies beneath is a solid understanding of logic, how to identify, adapt and apply reasoning. It's problem solving.
Overall my point is simply this, unless you figure out how to compress the sum total of you X++ years of experience as a professor [obtained from industry and as a teacher], and then figure out how to impart all that knowledge to your students there is no feasible reason why they could or should be as apt at programming as you as a professor.
As for how smart you are: wow thats great -- have a cookie for having interest and aptitude above and beyond other students who may also have that interest and aptitude, but did not discover that fact on their own.
Perhaps my wording was a little to aggressive in my comment, I wasn't trying to attack the professor, I was only trying to make it a clear point that being comparative between a seasoned professor and naive programmer is well, absurd.
Further, some people struggle with subjects for a long time, then one day "get it" and surpass those who were obviously in the good group all through studies. Some people thrive under one teaching methodology and curriculum and others thrive under different conditions.
Basically the thing you describe only selects the subset of people who represent the intersection of the sets (people with an aptitude for proramming) (people who thrive under this curriculum) (people who get it quicly/incrementally). There could be plenty of other people in the (people with and aptitude for programming) set.
Another vaguely related bit of thinking: A lot of the best programmers I know come out of non-cs curriculums like math, music, geography, philosophy and so on.
But if the idea is to prevent wasted time while learning, there's a simple solution: have the students do pair-programming, preferably with someone who's already learned the basics. Or at least let them all do it in a lab, and have the prof walk around to help out students who are stuck. Not for their entire college career, but perhaps for CS 101.
Generally speaking I'm not a fan of pair-programming, but this seems like a good application for it.
Mastery of tools, languages, libraries, posture, etc. are significant but not to the same degree.
Of course I'll have to look up a lot of things (I'd do it in HTML 5, so I'd have to double check the API for either Canvas or DOM). I suppose if you know the API mostly by heart it would help a lot.
In fact your article inspired me to put more effort into knowing the APIs. Could be because I was a Java developer for the most time that I got into the habit of always looking stuff up, even if I already knew it - I just felt like double checking a lot. Or maybe knowing the API could be substituted by a good IDE that suggests everything?
What are the rules for speeding up the ball in Arcanoid? :-)
Most CS students are not trained to solve problems. They are taught algos, some language basics, but they only have to code 2 or 3 small programs per week.
We had a programming club where we would solve 4-5 problems in one hour, and only like 5 people attended it, out of ALL CS majors of ALL years.
And that's, kids, why it's so damn hard to find good developers.
[Edit] Add discipline to my long list of essential virtues for a good programmer. Discipline is a big one.