Slashdot Mirror


Jeremy Allison's Advice to Young Programmers

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!"

22 of 101 comments (clear)

  1. It's not what you know ... by Anonymous Coward · · Score: 5, Insightful

    It's not what you know, it's who you know. That advice is contained in the article in spades. You are much better off being part of a community. When you find yourself unemployed, your next job will be determined by your reputation. The article points out that the best way to build a reputation is to contribute to open source projects. Slaving away in the back room on proprietary projects is a crummy way to build your reputation.

    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.

    1. Re:It's not what you know ... by drsmithy · · Score: 4, 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.

    2. Re:It's not what you know ... by Anonymous+Brave+Guy · · Score: 3, 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.

      --
      If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
  2. The first advice is also the most important one by Opportunist · · Score: 5, Insightful

    Coding is a bit like sex. It's only satisfying when you do it for the joy of creating code, not if money's all that matters to you.

    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.

    --
    We used to have a Bill of Rights. Now, with the rights gone, all we have left is the bill.
    1. Re:The first advice is also the most important one by JNighthawk · · Score: 2, Insightful

      Very well put. I'd also add onto that two more points: experience is extremely valuable and don't re-invent the wheel.

      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 problem before," you're probably right. Look around for solutions to common problems before trying to solve them yourself... after you've already solved it once. Gaining the experience is more important than saving time, but once you've learned how to do it, there's no reason to keep re-solving the same problem.

      --
      Wheel in the sky keeps on turnin'.
    2. Re:The first advice is also the most important one by Opportunist · · Score: 2, Insightful

      Object orientation is more a principle of organizing code, imo. Not so much a way of coding itself.

      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.

      --
      We used to have a Bill of Rights. Now, with the rights gone, all we have left is the bill.
    3. Re:The first advice is also the most important one by Bluesman · · Score: 3, Insightful

      Don't worry -- if you keep having sex, it will get better.

      --
      If moderation could change anything, it would be illegal.
  3. A hard reality... by ranga_the_don · · Score: 1, Insightful
    When the author says,

    The network really is the computer There are now no interesting non-networked applications. Standalone computers are devices for watching stored video or listening to music, usually on airplanes.
    I agree completely since it is a fact that has been established over the years, 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!
    --
    - Yes, but does it run Lunix?
    1. Re:A hard reality... by demallien2 · · Score: 2, Insightful

      "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)."

      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 bastards don't give out the source code.

      Well, I for one would flick on the debugger, and reverse engineer the driver, see what it's doing... Bit hard to do if you don't understand how the OS driver model is set up, or if you don't understand your processor's assembly language, or how compilers generate stack frames, manage memory access bla bla bla.

      This is not some pie-in-the-sky, never happens kind of scenario. I work in an embedded environment. My company produces a library which requires that our partners implement an interface. Trouble is, when we try to integrate our code and their code, it doesn't work. I don't know how many times I've sat in meetings with colleagues and the client where the two sides argue over where the bug is. Happily for me, I don't ever have to do that. I simply tell the client where the bug is in their code, because I've reverse-engineered it, and identified the problem, to the point where I can often tell them things like "you're not incrementing the pointer in the second case of the switch statement". End of argument, and the bug is corrected within hours if not minutes. The only other option is black-box testing to identify what the client is doing wrong, and even then you can only tell them in general terms.

      Yet another example. I have loads of colleagues that know how to write some html/javascript, and put it up on a web server. But when for whatever reason they can't create a correct session between their client device and the server, they are completely lost. No idea how routing works. No idea how NATs work. No idea how to use a packet sniffer to see whether the TCP connection is correctly established. In other words, no idea how to debug the system.

      There is no coding job in the world where an understanding of the underlying architecture won't enable you to be more effective. You're code will be smaller, faster, you'll have more tools available when trying to debug a system, or doing integration. You'll even be able to copy algorithms that you only have in binary form.

  4. Eh? by Anonymous Coward · · Score: 0, Insightful

    Grandparent "On the other hand, the best way to make a lot of money has, up to now, been to know the right proprietary software."

    Parent "Open Source will not change this."

    So you're saying that the best way to make a lot of money is to know the right proprietary software? Probably not. In any event, you're not even wrong.

    1. Re:Eh? by xENoLocO · · Score: 2, Insightful

      He *is* correct, ya know... do a search for COBOL jobs now that all the COBOL guys are retiring, and check out the salaries involved.

      --
      "The need to build the internet comes from something inside us, something programmed... something we can't resist."
  5. Excellent Advice by Aging_Newbie · · Score: 3, Insightful

    I wouldn't change a thing in what he said, and that is saying something! I put it right up there with The Tao of Programming as a worthwhile resource for new programmers.

    1. Re:Excellent Advice by kestasjk · · Score: 2, Insightful

      I disagree, it seems to have been completely written from the perspective of the code he writes.

      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 in a cluster without it. Well, most people don't write code for thousands of machines working in a cluster.
      I agree machine code is good to know, but not for the reasons he gives.

      It's interesting to hear his take, but I think Allison is a bit removed from the average developer in terms of the sorts of things that he has developed.

      --
      // MD_Update(&m,buf,j);
  6. Here's the best piece of advice I could give by hey! · · Score: 5, Insightful

    Have convictions and be prepared to defend them. The worst mistakes I've ever seen have been by people doing things they knew they ought not be doing and hoping that lack will keep them out of trouble.

    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.

    --
    Post may contain irony: discontinue use if experiencing mood swings, nausea or elevated blood pressure.
  7. "Do what you love" is overrated by MikeRT · · Score: 3, Insightful

    Doing what you love is all well and good, but if you have a family, you have a responsibility to support them. This swings both ways, it means that a man may have to do a job that he doesn't like, and a woman may have to give up a job she likes in order to be there for her kids. To do otherwise is not only irresponsible, but it leads to the sort of families that get denounced on every game thread here.

    Here's a better suggestion: find a job that is run by people who appreciate the fact that work is not the be all, end all thing in your life. You'll be a lot happier with an employer who asks you to only do 40 hours, unless there is an exigent circumstance.

    And here's another... if you spend 12 hours a day at work and in commute, chances are you won't have a great relationship with your significant other after several years. Your kids won't know you. You'll be happy, but chances are, that happiness will be at work, not at home.

    1. Re:"Do what you love" is overrated by hey! · · Score: 3, Insightful

      "Doing what you love" is like saying you should be in love with your wife 7x24, forever.

      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.

      --
      Post may contain irony: discontinue use if experiencing mood swings, nausea or elevated blood pressure.
    2. Re:"Do what you love" is overrated by xero314 · · Score: 2, 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 years.

      If you are the kind of person who "falls" in and out of "love" I would suggest reconsidering what it is you love, since it's obviously not the person or the job, or question wether you even love at all.
  8. Reinventing the wheel == learning by Opportunist · · Score: 2, Insightful

    Generally, you're right. But the best a novice programmer can do is to reinvent the wheel. Over and over. Writing the billionth bubblesort surely will not add anything meaningful to the world's codebase, but it's a good way to improve yours.

    --
    We used to have a Bill of Rights. Now, with the rights gone, all we have left is the bill.
  9. Maybe that works for him... by daveisfera · · Score: 2, Insightful

    I agree with the "do what you love" statement, but I can't say that I really agree with any of his "technical" points. Sticking to non-proprietary standards works really well in some cases (like web-based development), but in some cases non-proprietary standards just don't exist or really suck. Plus, the "network is the computer" thing works well for Google, but if you're writing a client only app or embedded code on a small device (which is still a huge part of the software industry, despite what many believe) then that just doesn't make sense.
    I agree with the general message of the article, but some of the points are too focused on the view from his limited perspective.

  10. Comments from an old programmer by Animats · · 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.

  11. Re:Bullshit by smellotron · · Score: 4, Insightful

    3D rendering/animation creation software
    Photoshop, Illustrator, and other image editing/creation software
    VirtualDub, Premiere, and other video editing/manipulation software
    Protools, Cubase, Cakewalk, tracker software, and other audio/music editing/creation/manipulation software

    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).

    Computer games
    Desktop finance management software

    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

  12. Re:There are two different kinds of programming... by smellotron · · Score: 2, Insightful

    A small minority of programmers do things like write Operating Systems, Protocol Stacks, ... These people are well served by CsC degrees, a fondness for algorithms, CPU Arch. knowledge, a current IEEE membership, etc.

    Add to that list anything related to scientific/numerical computing. Dynamic meshes for physics simulations, image/video processing, etc.

    The gigantic majority of code used in this world is not written by technology companies. It is written by folks working in corporate IT departments... These folks really don't need to spend a great deal of time learning basic principles, because processor architecture really isn't relevant to SQL or LAMP. These folks can get by with a Community College degree where they will either learn to program properly, or not.

    Software developers of business applications tend to fall on their faces if they're just "programmers". That, or their applications never get big enough. My interests lie largely on the "softer" side of Computer Science (heavy interest in software engineering/design/architecture and human-computer interactions), but I certainly think a full Computer Science program makes a big difference. Application developers still need to address issues like avoiding deadlocks, transactional safety, algorithms, and efficient data structures.

    Maybe in the future the Computer Science degree will be separated from the Software Engineering degree (much the same as Computer Engineering is separate, though sharing similar roots), but for now, a Computer Science degree is still the best place to study effective software development. Honestly, the structure of a lot of software (likely written by the folks who don't how "basic principles") makes my eyes bleed. Someone with that sort of education and solid domain experience coming into a small company could easily match the productivity of 3-4 run-of-the-mill programmers.