Jeremy Allison's Advice to Young Programmers 101
Hyram Graff writes "Jeremy Allison has written a wonderful piece with advice to young programmers. As someone who's been out of college for just over a year, I find it to be a very insightful piece. Please allow me to say, thanks Mr. Allison!"
Impressive, young Skywalker (Score:1, Offtopic)
Now that you mention it, you DO offer sound advice. All the of the scenarios portrayed therein represent terrible situations which young programmers (or anyone else, really) would do well to avoid. The chain(saw) especially.
Re: (Score:3, Informative)
Re: (Score:1)
Re: (Score:1)
It's not what you know ... (Score:5, Insightful)
On the other hand, the best way to make a lot of money has, up to now, been to know the right proprietary software. There was a time, not so long ago, when knowing Oracle would make the difference between making $30k or making $100k. I have a relative who made a lot of money because he was an expert in MUMPS. I think that is changing. Open source is the future. The article points out that jobs no longer last thirty years. You will probably work for many companies and your ability to get the next job is much enhanced if you are well known and respected in the community. The paradigm is changing and the old rules may not work much longer. In that respect I think the article has it exactly right.
Re:It's not what you know ... (Score:5, Insightful)
On the other hand, the best way to make a lot of money has, up to now, been to know the right proprietary software. There was a time, not so long ago, when knowing Oracle would make the difference between making $30k or making $100k. I have a relative who made a lot of money because he was an expert in MUMPS. I think that is changing. Open source is the future.
Open Source will not change this. Despite what seems to be common belief among some people, a program being open source does not make it a commodity. Non-trivial environments do not change software platforms on a whim, be they proprietry or open source.
Re: (Score:3, Insightful)
Re: (Score:1)
Now, in late 99, sure, their salaries were high
We have a number of COBOL consultants here where I work, and the company only offers them $65k or so to go permanent -- one guy makes about 110 or so contracting, and they offered him 65. We have a number of permanent COBOL programmers in place, and I don't think they're making much more than that either. On the
Re:It's not what you know ... (Score:4, Insightful)
I'm sorry, but I think you're overestimating the relevance of the OSS community.
To give an obvious example, my employer is currently recruiting. The senior technical guys doing the interviews/selection know plenty about Linux and GCC, since we use them all the time. However, I doubt they've heard of anyone in the OSS community apart from maybe Linus and RMS. IME software development is a small world, and unless you're looking for your first or second job, it's far more likely that someone at a prospective employer will have worked with you before or know someone who did than that they will have read the credits of some piece of OSS you contributed to, remembered that your name was 17th on the list, and actively pursued you.
This isn't to knock the value of contributing to OSS. Doing so can help you learn a lot, demonstrates a willingness to volunteer your time to something you think is worthwhile, and often shows that you can get things done as part of a large, distributed team. These are all good news for a prospective employer, so go ahead and put the work on your CV. Just don't have any illusions about headhunters coming knocking at your door because you once fixed a bug in $OBSCURE_OSS_TOOL. It just isn't going to happen, except for a very lucky few.
Re: (Score:2)
So I guess, OSS is a good for your own PR.
Re: (Score:1)
I have to disagree. Active participation in an open source project can get you work. If you reply to questions in the forums, edit the wiki, or contribute source code, people will notice. A user may offer you a bounty to do something they can't. Many of the forums have pages for posting services and jobs. If the project has a foundation or offers commercial services you may be asked to join.
You are right that headhunters probably aren't reading documentation looking for names, but if they are asked to
Re: (Score:2)
I'm not saying OSS participation can't get you work. Obviously it could, for example in the circumstances you suggest. I'm just challenging the rather dramatic statements in the post I originally I replied to (e.g., "Open source is the future") that seem to be saying that the traditional ways of getting highly-paid work in software development will just disappear in favour of those with reputations for contributing to OSS. I have seen no evidence that this is the case nor likely to be so any time soon, and
Re: (Score:1)
Re:It's not what you know ... (Score:4, Informative)
Re: (Score:1)
Re: (Score:2)
The "It's not what you know it's who you know" slogan is really getting old.
Uh huh. But "working for the man" is hip and fresh? And then there's the term "old fogies"...
Seriously, I've gotten lots of work because I've been recommended by either clients or coworkers. I've also gotten lots of work because I had the right skills (or at least buzzwords) listed on my resume. Neither one is exclusive of the other, and you need both. If you've got an in-demand skill, then you'll probably find it fairly easy to move from position to position. However, if demand for that skill wanes
The first advice is also the most important one (Score:5, Insightful)
I've seen a fair lot of people who're trying to get into the biz (the key word here is trying) for the money. This was especially a disease during the dot.com times. People who didn't have any love for the art of creating code tried to squeeze into the biz because "That's where the big bucks are". They would have shoveled shit if that would've been the next gold mine.
That's not how it works. Writing code is painful at times when you love it, I can't even imagine what kind of hell it must be like if you don't like it in the first place. And when you don't do it out of love for the art, the product is going to be a living hell for those that have to suffer using it.
But there's another advice I'd give to aspiring programmers: Learn your math, learn your algos. When you know how to solve a problem, language is not an issue anymore. When you know how something is done efficiently, it doesn't matter at all what environment you get pushed into, it doesn't matter if someone comes up with the next generation of code creation tools, you will grow into it smoothly. If you only know how to hack together code, copy/paste style, if that's how you implement your algorithms, you will have to relearn it again and again every time the environment and coding style changes.
Re:The first advice is also the most important one (Score:5, Funny)
Also, it's very easy to make a mistake which you don't discover until several months later, but which you end up having to support for the next two decades.
Re:The first advice is also the most important one (Score:4, Funny)
Re: (Score:2)
Re: (Score:2)
However, your father's friends can't.
Re: (Score:2)
There's also the simple gag about using a little something to avoid getting littered with stds.
Re: (Score:2)
Re: (Score:2, Insightful)
Experience helps a lot, since a problem is much easier to deal with when you've already seen something like it before. It's not everything, but the best way to become a better coder is, unsurprisingly, to code. Reading books is great, and definitely should be done, but you need to actually apply what you've learned.
If you run into a problem and think "someone else must have had this pr
Re: (Score:2, Funny)
Re: (Score:1)
Reinventing the wheel == learning (Score:3, Insightful)
Re: (Score:2)
Bubblesort is absolutely the opposite of what new programmers should be doing. The problem with today's powerful computers is that even a bad algorithm appears fast for a sufficently small data set. Unfortunately, this teaches programmers that "bad algorithms are OK" - when they try to sort a lot of items, or a few items many times, suddenly their code is horribly slow. What
Re: (Score:1)
Re: (Score:2)
How about mergesort? Or a nice quicksort with good pivoting?
Re:The first advice is also the most important one (Score:4, Funny)
a missing period can mean big trouble.
Re: (Score:3, Funny)
Re: (Score:2)
Re:The first advice is also the most important one (Score:4, Insightful)
Re: (Score:2)
Though it's way easier to convince your compiler to crunch through a piece of code that does synchronized double remote threading than your girlfriend that it would be neat to have her best friend in bed, too. At least your compiler won't decide to uninstall as a result.
Re: (Score:2)
When you know how something is done efficiently, it doesn't matter at all what environment you get pushed into, it doesn't matter if someone comes up with the next generation of code creation tools, you will grow into it smoothly.
This is true. I reached awhile ago, when which programming language I used didn't matter so much anymore. Nearly all modern languages offer the same features, and syntax is something you must get through, but once you know how to frame a problem in your mind, the solution usually just falls out. When a language is unfamiliar to me, pseudocode is very useful in this regard, until I can straighten out how to write the program in the new environment. I even find myself writing pseudocode for decisions I n
Re: (Score:2)
I've had the worst time learning French at school, simply because I tried to learn the language, learning vocabulary by heart and grammatics rules, all the junk.
Then I started to get interested in language theory and development, learned a bit of the history of western European languages, and over time I started to 'understand' a few words in foreign languages even though I never learned them. I don't speak Italian or Spanish, but, if spoken slowly (or written), I can puzzle together at least
Re: (Score:2)
Don't forget to learn object oriented design, patterns, refactoring and all that. All the math and algorithms in the world can become useless if your code is an unmaintainable mess.
Re: (Score:3, Insightful)
For me, OO is the "container" for my algos. And I'm pretty sure that someone will come along sooner or later and create the better container, organize it differently. It could change from the very foundation, just like OO changed coding styles from grounds up when it came along.
Math will always stay the same. The basic principles won't change.
Re: (Score:2)
Ever worked with someone who doesn't like it in the first place? That's a whole other level of hell. Forget that person's bad feelings, the product, and the users - it drains the other people on the team who do enjoy the work even mo
Re: (Score:2)
I wouldn't want to work without such a person in my team. You just have to assign them the right job. Our anticoder was the one to send to meetings and pointless demonstrations, he loved every moment of it and felt useful for the first time. We on the other hand didn't have to deal with tie-wearing cluebricks and waste our time playing bullshit bingo in meetings.
I love win-win situations.
A hard reality... (Score:1, Insightful)
Re:A hard reality... (Score:5, Informative)
I agree completely since it is a fact that has been established over the years, [...]
I have to argue there are still a lot of computing applications where the network is of only tangential interest. Word processing, desktop publishing, video editing, [single player] games, etc. There's no shortage of work where the network is really just a a process for getting an initial set of data onto the machine to be manipulated (if it even does that - eg: photo editing with photos coming straight off the camera).
Mr Allison's advice (and commentary) seems to be very much centred around writing high-performance server applications. Which is hardly surprising, given his background, but may not be equally applicable to all forms of coding (eg: writing GUI apps for GNOME or KDE today is probably quite different to writing X apps twenty+ years ago, and an intimate knowledge of the underlying hardware/OS is only really necessary if your code is performance-sensitive).
[...] i still wonder if iTunes(one of the best examples i could remember) would have been so widely used today if not for the music sharing feature!
Of course it would. The iPod is the main reason iTunes is popular (( don't think I've _ever_ used iTunes music sharing features - or the iTunes Store, for that matter).
Re: (Score:1, Informative)
Office automation is moving out of the standard Desktop application paradigm to online browser based rich clients with the rapid growth and advancements of Web 2.0 a.k.a AJAX, XHTML and allies. The paradigm shift to virtual offices has already begun!
Re: (Score:2, Insightful)
So not true. A simple example. You're writing a vid
Re: (Score:2)
So not true. A simple example. You're writing a video editting program that needs access to the graphics card. Sadly your code and the card's driver aren't playing nice together. You've read the docs, you think you're doing the right thing, no-one on the forums can give you any pointers. What do you do? Ideally, you'd have a look at the source code of the driver - the ultimate documentation, to see what the driver is expecting of you. Trouble is, you're coding against an NVidia graphics card, and the basta
Re: (Score:1)
Point 3. Again, the documented API isn't working. Is it a bug in your code, or a bug in their code? Only a reverse engine
Re: (Score:2)
Re: (Score:2)
You weren't really paying attention there were you? Point 2 for example. My whole point is that the documented API is not working the way that you expected. Bad docs? Bad code? Who cares, it's not working. Your approach apparently is to throw your hands in the air, and go and sulk in the corner. Someone that can reverse engineer the driver will be able to continue going forward.
Sure, with some bad code that will likely break every time the other vendor changes anything.
It's crap like this that causes 90%
Re: (Score:2)
Some examples of stand alone turn around secondary devices. Dive computers, blood meters, blood pressure meters. You don't need the network for these.
Listening to MP3 files. Yes, I use a network ap to download them, but I listen to them in standalone mode.
Photoshop. Yeah, Adobe is making noise about a web centric version of Photoshop. I'll believe it when Cows fly. There just isn't enough bandwidth yet to do t
And of course, (Score:4, Funny)
Wear Sunscreen.
Re: (Score:3, Informative)
For those a little too young to get that, here's the original [chicagotribune.com]. And yes, it's definitely worth reading. :-)
Excellent Advice (Score:4, Insightful)
Re: (Score:3, Insightful)
Don't tell me that POSIX is a more valuable (speaking in terms of money) thing for a programmer to know than the latest thing out of Microsoft. If you call things that change a "trap" then POSIX is one of the very few things which hasn't been a trap (including Java, which Allison praises).
He talks about machine code still being very relevant, and that you can't write code for thousands of machines working i
Re:Excellent Advice (Score:5, Interesting)
In more than 16 years of doing MS programming and chasing the latest thing to keep ahead, I look back and wonder how many projects might still be in use if they were in Linux/Unix. Instead, the products died with their native OS. Further, once on the MS money train, the only alternative is to chase the newest thing to keep in place or move slightly ahead. In addition, I have seen many other proprietary toolsets come and go. In fact, some of the toolsets were simply created, it would seem, to capture customers who would need programmers for those toolsets in order to maintain the code. Then, finally, when the product is stable, it is time to migrate it to the new version at even greater cost. Lock-in is great, and only now do businesses recognize the risks it brings.
As for machine code, I agree that not too many need to master it. I have done my share of assembler in lots of environments and believe strongly in the importance of wrapping one's head around what is really happening. If you notice, buffer overflows are the most exploited weakness of modern applications. Once you debug a buffer overflow in assembler code, you remember full well how important it is to avoid them. On the other hand, if somebody really understands what is happening in the machine and OS then C and C++ are very efficient ways to program. And, Java, which keeps the executing machine relatively constant, is maybe the grail of programming. Even then, understanding what the virtual machine is doing with that Java statement is important in making efficient code.
I also agree he is somewhat removed from the majority of developers. But, the majority of developers are probably focused on the other aspects of development. That topic is best handled by this excerpt from "The Zen of Programming"
-----
There was once a programmer who was attached to the court of the warlord of Wu. The warlord asked the programmer: "Which is easier to design: an accounting package or an operating system?"
"An operating system," replied the programmer.
The warlord uttered an exclamation of disbelief.
"Surely an accounting package is trivial next to the complexity of an operating system," he said.
"Not so," said the programmer. "When designing an accounting package, the programmer operates as a mediator between people having different ideas: how it must operate, how its reports must appear, and how it must conform to tax laws. By contrast, an operating system is not limited by outward appearances. When designing an operating system, the programmer seeks the simplest harmony between machine and ideas. That is why an operating system is easier to design."
The warlord of Wu nodded and smiled. "That is all good and well," he said, "but which is easier to debug?"
The programmer made no reply.
-----
So, there you have it. The majority of developers create applications that require focus on the externals and present their own difficulties and challenges. Those challenges are not so much technical as people and business. The two challenges meet, though when the accounting package is killed by a proprietary product migration, and has to be redone (if there is money to redo it).
In truth, I find it hard to counsel new programmers because the world is changing so quickly. Having been burned repeatedly with proprietary lock-in and migrations, businesses now buy their applications from major vendors and change their processes and practicies to comply with the constraints of the software. I personally think that the resulting uniformity in methods will eventually stagnate the companies who do this. But, when you consider that corporations can only see a quarterly horizon, maybe that is the best that can be expected.
Re:Excellent Advice (Score:5, Interesting)
The Unix standards are just better than many others. They are simpler and more elegant, and they last a long time. On a cross-platform project I was working on recently some windows developer changed "uint32_t" to a "typedef DWORD UINT32_T" and "typedef uint32_t UINT32_T". Wtf is a DWORD and why not typedef it to uint32_t. I believe doing too much Windows programming warps even the best programmers; you either move on to something else or you lose the ability to write good code.
Re: (Score:2)
Re: (Score:2)
The buffer overflow I mentioned was in a Motorola 6801 before I started chasing the MS rainbow.
Re: (Score:1)
What about us old folk? (Score:1)
Re: (Score:1)
If you can afford to retire then start taking evening courses in something you're interested in and that is a growth industry, say, bioinformatics.
If you can't afford to retire, then start taking evening courses in paramedicine or nursing, so that when you're fired you can quickly get a job.
Consider working for the local city, county or state government. Those jobs are very steady, hours are good, they discriminate less
curiosity saved the cat (Score:1)
Here's the best piece of advice I could give (Score:5, Insightful)
I know this sounds like ridiculous advice to give to young people, who for perfectly understandable reasons tend to have more convictions than they have experience. But that changes all too rapidly, and the time will come when you will need your integrity muscles, and you don't want to find out they've gone flabby on you.
It is the job of the engineer to do the things that are too hard for most ordinary people to do: analyzing, calculating, planning and designing. Courage and integrity are a vital parts of the engineer's role. Integrity is simply this: fitting your deeds to your words, or in an engineering context, delivering what you promise. Much of business runs on denial; on promises made with no actual knowledge of whether they are possible to fulfill. As an engineer denial has to stop with you. It's your job to deal with things as they actually are, not as we wish them to be. This means sometimes you have to make the unlikely probable, or to deliver at least something of value when confronted with the impossible.
An easy way to have integrity is to play it safe. There is nothing wrong with playing it safe; its the best choice most of the time. But sometimes the reality is that the apparently safe course spells failure. From what I have seen, young engineers tend to either play it safe all the time or to take unnecessary risks. Aristotle said that courage is not the opposite of cowardice; it is the midpoint between cowardice and rashness. Every worthwhile project has an element of risk, but as an engineer it behooves you that this be a calculated risk. Leave the wishful thinking to others who don't have reality based professions.
In engineering, every interesting problem involves dealing with pairs of desirable things, of which you can't have both in unlimited quantities. An aircraft ought to be as light as possible and as strong as possible, but the lightest possible aircraft is not strong and the strongest possible aircraft is not light. An engineer ought to have integrity, but be flexible in his approach. He ought to have convictions, but work smoothly and professionally with others. He needs honesty, but also discretion about when and to whom the truth must be told.
All of which is damn near impossible. But if it were easy, everybody could do it.
Re: (Score:1)
Re: (Score:1)
Comment removed (Score:4, Insightful)
Re:"Do what you love" is overrated (Score:4, Insightful)
Chances are one day you're going look over at your wife and realize she's old, fat and crabby. Maybe if you're rich you'll buy yourself a new, young, pretty wife who is docile as a lamb. But in the end you still won't be happy. And the people around you will justly despise you and your new wife. If you look in the mirror you'll see you're no prize yourself.
The state of being in love, either with your spouse or with your job, is necessary to the continuance of civilization, but it is not sustainable.
It would be better to say this: "love what you do." This better captures the effort and imagination needed to live a life of what the Greek philosophers called "Eudaimonia": a kind of sustainable well-being.
Then in choosing a job, you should not choose that which you simply have a passive attraction to. You should choose something believe you have the capacity to generate new love for that will carry you through the hard times.
Re: (Score:3, Insightful)
The state of being in love, either with your spouse or with your job, is necessary to the continuance of civilization, but it is not sustainable.
Sorry you feel that way. After more than 10 years of marriage in a 13 year relationship I am more in love today that ever before. I have also been programing for over 25 years and enjoy it as much to as I did day one. In both circumstances my interests have changed but the overall feeling has not. In the case of programming I have even gone full circle and am back to desiring work involving machine code or even hardware design, as opposed to the higher level rapid development I have been doing for year
Re: (Score:2)
Re: (Score:2)
Re: (Score:2)
Right now I am not finished with my degree and I want to do what I love programming but lack the degree now in this post
My fiancee is letting me do what I love and get my degree while I only work part time. She works full time but she prefers me to be happy and spending time with me rather than me having 2 borderline slave j
Community (Score:1)
You should learn about and know the stories which have been handed down from those who have gone before, because stories are a cornerstone of any community. If you've never heard of the programmer named "Mel" you should look him up. There's a whole pile of this.
Do you know what a scratch monkey is? Knuth and his obsession with fonts? How much is a binary dollar and how could you ear
Re: (Score:2)
I'm assuming that you mean "The September That Never Ended" [wikipedia.org]
Re: (Score:1)
Maybe that works for him... (Score:2, Insightful)
Comments from an old programmer (Score:5, Insightful)
As an old programmer, I'm not too impressed with that advice.
It's important today for a programmer to understand how top management thinks. Read the Wall Street Journal and the Economist. After about a year, both will start to make sense, as it takes about that long for all the major subjects to come around once or twice. Eventually, you'll probably want to move into management.
I'm not sure how much low-level knowledge really matters today. I understand what's going on down to the level of what happens in the wafer fab, but that's more because I'm in Silicon Valley. Understanding programming at the C level, definitely. At the machine code level, that may be too much detail to learn. A general notion of modern CPU architecture is useful; you should understand what caches do, why cache misses kill performance, and the implications of this at the program level. Detail beyond that level probably won't help you much. Understanding how an adder works is irrelevant to programming today.
It's probably more important to understand networking in some detail. Understanding Ethernet, DNS, WiFi, TCP, PPPoE, etc. is necessary, because they all can give trouble and you may have to diagnose that trouble.
I have to agree about the long-term value of UNIX knowledge vs. Microsoft-related knowledge. I first used UNIX in 1978, and programming on it has changed surprisingly little since then. We still have "make", we still have source control with check-in and check-out, and we still have a command line. And it doesn't go away. Since first using UNIX, I've used a half dozen other systems, most of them now defunct. Some were better. I keep getting forced back to UNIX, because it's still there after the others go away.
Asking for code samples from job applicants doesn't seem to work. A few years ago, I was asking for "a thousand lines of C++ code you're proud of." Few programmers could come up with much. Reading the code was sometimes painful. I sent one back with the note: "Your first buffer overflow is on line 22. Thank you for your interest."
Learning new programming languages isn't that hard, once you've learned a few different ones. What takes a long time is learning the quirks of a library. Today, each programming language comes with an library API with a few thousand objects and calls, some of which work reasonably. Finding out about the ones that don't is the most time-consuming part of learning a new environment today. This has led to a "ritual/taboo" style of programming, where huge books give sequences of code ("incantations") known to work, rather than development from first principles. This is the main source of career lock-in today. Be aware of that.
Re:Bullshit (Score:4, Insightful)
You just listed a bunch of applications that are very CPU-intensive and "extremely parallelizeable". That is, every single one of those applications would be great to distribute. All modern production-level renderers operate on clusters (renderfarms). Apple's Logic software (similar to Pro Tools) supports distributed processing.
Any digital artist would *love* to have even a small cluster available to do previews... while Maya et al have very good OpenGL previews, there's never enough CPU power for computer graphics (and I believe there never will be).
You don't see any benefit of networking these applications? Maybe for a person's own finance management software a network would be overkill, but any company with more than 1 person handling finance management benefits from a remote data store and thick clients. Maybe you always play single player games, but I occasionally play StarCraft with a friend. Across a network.
Network != World Wide Web
There are two different kinds of programming... (Score:2)
A small minority of programmers do things like write Operating Systems, Protocol Stacks, Embedded Systems, or ever have to give a flying fig about the POSIX spec. (Or the Windows counterpart, for that matter.) These people are well served by CsC degrees, a fondness for algorithms, CPU Arch. knowledge, a current IEEE membership, etc.
This is the sort of code created by what is generally refe
Re: (Score:2, Insightful)
Add to that list anything related to scientific/numerical computing. Dynamic meshes for physics simulations, image/video processing, etc.
Re: (Score:2)
It is written by folks working in corporate IT departments, small application shops, etc.
Should read "...is written by folks working in Bangalore, Hyderabad, or other low wage locations."
-jimbo
loving what you do (Score:1)
Everyone missed the scariest part (Score:1)
I once had to listen to several high-level executives (for a previous company that shall remain nameless) waiting for the private corporate jet complain how inefficient it was that the country was run by democratically elected politicians as "they just didn't understand busines